Commit a1c1fc72 authored by Kamran Riaz Khan's avatar Kamran Riaz Khan Committed by Nick Mathewson
Browse files

Prepend cwd for relative config file paths.

Modifies filenames which do not start with '/' or '.' on non-Windows
platforms; uses _fullpath on Windows.
parent 878a6843
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -1634,6 +1634,42 @@ get_parent_directory(char *fname)
  return -1;
}

/** Expand possibly relative path <b>fname</b> to an absolute path.
 * Return a newly allocated string, possibly equal to <b>fname</b>. */
char *
make_path_absolute(char *fname)
{
#ifdef WINDOWS
  char *absfname_malloced = _fullpath(NULL, fname, 1);

  /* We don't want to assume that tor_free can free a string allocated
   * with malloc.  On failure, return fname (it's better than nothing). */
  char *absfname = tor_strdup(absfname_malloced ? absfname_malloced : fname);
  if (absfname_malloced) free(absfname_malloced);

  return absfname;
#else
  char path[PATH_MAX+1];
  char *absfname = NULL;

  tor_assert(fname);

  if(fname[0] == '/') {
    absfname = tor_strdup(fname);
  } else {
    if (getcwd(path, PATH_MAX) != NULL) {
      tor_asprintf(&absfname, "%s/%s", path, fname);
    } else {
      /* If getcwd failed, the best we can do here is keep using the
       * relative path.  (Perhaps / isn't readable by this UID/GID.) */
      absfname = tor_strdup(fname);
    }
  }

  return absfname;
#endif
}

/** Set *addr to the IP address (in dotted-quad notation) stored in c.
 * Return 1 on success, 0 if c is badly formatted.  (Like inet_aton(c,addr),
 * but works on Windows and Solaris.)
+1 −0
Original line number Diff line number Diff line
@@ -571,6 +571,7 @@ char *get_user_homedir(const char *username);
#endif

int get_parent_directory(char *fname);
char *make_path_absolute(char *fname);

int spawn_func(void (*func)(void *), void *data);
void spawn_exit(void) ATTR_NORETURN;
+8 −0
Original line number Diff line number Diff line
@@ -4356,6 +4356,14 @@ find_torrc_filename(int argc, char **argv,
        tor_free(fname);
      }
      fname = expand_filename(argv[i+1]);

      {
        char *absfname;
        absfname = make_path_absolute(fname);
        tor_free(fname);
        fname = absfname;
      }

      *using_default_torrc = 0;
      ++i;
    } else if (ignore_opt && !strcmp(argv[i],ignore_opt)) {