Browse Source

Merge branch 'bug5082_squashed'

Nick Mathewson 12 years ago
parent
commit
2aa1a6baa3
2 changed files with 27 additions and 25 deletions
  1. 6 0
      changes/bug5082
  2. 21 25
      src/or/transports.c

+ 6 - 0
changes/bug5082

@@ -0,0 +1,6 @@
+  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
src/or/transports.c

@@ -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 */