Commit 2aa1a6ba authored by Nick Mathewson's avatar Nick Mathewson 🐘
Browse files

Merge branch 'bug5082_squashed'

parents 15309cbc 93414707
Loading
Loading
Loading
Loading

changes/bug5082

0 → 100644
+6 −0
Changes for changes/bug5082: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
  o Major bugfixes:
    - Properly set up obfsproxy's environment in managed mode. On TBB, we
      need LD_LIBRARY_PATH to be copied, and when you run your Tor as a
      daemon, there's no HOME. Fixes bug 5082 and 5076; bugfix on
      0.2.3.6-alpha.
+21 −25
Changes for src/or/transports.c: 21 added lines, 25 removed lines.
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@
static void set_managed_proxy_environment(LPVOID *envp,
                                          const managed_proxy_t *mp);
#else
static int set_managed_proxy_environment(char ***envp,
static void set_managed_proxy_environment(char ***envp,
                                         const managed_proxy_t *mp);
#endif

@@ -129,8 +129,8 @@ static INLINE void free_execve_args(char **arg);
#define SMALLEST_MANAGED_LINE_SIZE 9

/** Number of environment variables for managed proxy clients/servers. */
#define ENVIRON_SIZE_CLIENT 5
#define ENVIRON_SIZE_SERVER 8
#define ENVIRON_SIZE_CLIENT 3
#define ENVIRON_SIZE_SERVER 6

/** The first and only supported - at the moment - configuration
    protocol version. */
@@ -305,12 +305,8 @@ launch_managed_proxy(managed_proxy_t *mp)
  char **envp=NULL;

  /* prepare the environment variables for the managed proxy */
  if (set_managed_proxy_environment(&envp, mp) < 0) {
    log_warn(LD_GENERAL, "Could not setup the environment of "
             "the managed proxy at '%s'.", mp->argv[0]);
    free_execve_args(envp);
    return -1;
  }
  set_managed_proxy_environment(&envp, mp);
  tor_assert(envp);

  retval = tor_spawn_background(mp->argv[0], (const char **)mp->argv,
                                (const char **)envp, &mp->process_handle);
@@ -1077,10 +1073,12 @@ set_managed_proxy_environment(LPVOID *envp, const managed_proxy_t *mp)

#else /* _WIN32 */

extern char **environ;

/** Prepare the environment <b>envp</b> of managed proxy <b>mp</b>.
 *  <b>envp</b> is allocated on the heap and should be freed by the
 *  caller after its use. */
static int
static void
set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp)
{
  const or_options_t *options = get_options();
@@ -1088,27 +1086,30 @@ set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp)
  char *state_loc=NULL;
  char *transports_to_launch=NULL;
  char *bindaddr=NULL;
  char *home_env=NULL;
  char *path_env=NULL;
  int environ_size=0;
  char **environ_tmp = environ;

  int r = -1;
  int n_envs = mp->is_server ? ENVIRON_SIZE_SERVER : ENVIRON_SIZE_CLIENT;

  while (*environ_tmp) {
    environ_size++;
    environ_tmp++;
  }
  environ_tmp = environ;

  /* allocate enough space for our env. vars and a NULL pointer */
  *envp = tor_malloc(sizeof(char*)*(n_envs+1));
  *envp = tor_malloc(sizeof(char*)*(environ_size+n_envs+1));
  tmp = *envp;

  state_loc = get_datadir_fname("pt_state/"); /* XXX temp */
  transports_to_launch =
    smartlist_join_strings(mp->transports_to_launch, ",", 0, NULL);

  home_env = getenv("HOME");
  path_env = getenv("PATH");
  if (!home_env || !path_env)
    goto done;
  while (*environ_tmp) {
    *tmp = tor_strdup(*environ_tmp);
    tmp++, environ_tmp++;
  }

  tor_asprintf(tmp++, "HOME=%s", home_env);
  tor_asprintf(tmp++, "PATH=%s", path_env);
  tor_asprintf(tmp++, "TOR_PT_STATE_LOCATION=%s", state_loc);
  tor_asprintf(tmp++, "TOR_PT_MANAGED_TRANSPORT_VER=1"); /* temp */
  if (mp->is_server) {
@@ -1124,14 +1125,9 @@ set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp)
  }
  *tmp = NULL;

  r = 0;

 done:
  tor_free(state_loc);
  tor_free(transports_to_launch);
  tor_free(bindaddr);

  return r;
}

#endif /* _WIN32 */