Procházet zdrojové kódy

Fix bug in get_transport_in_state_by_name() when using strcmpstart().

We now split the state lines into smartlists and compare the token
properly. Not that efficient but it's surely correct.
George Kadianakis před 14 roky
rodič
revize
ebc232bb79
1 změnil soubory, kde provedl 24 přidání a 3 odebrání
  1. 24 3
      src/or/config.c

+ 24 - 3
src/or/config.c

@@ -5787,13 +5787,34 @@ get_transport_in_state_by_name(const char *transport)
 {
   or_state_t *or_state = get_or_state();
   config_line_t *line;
+  config_line_t *ret = NULL;
+  smartlist_t *items = NULL;
 
   for (line = or_state->TransportProxies ; line ; line = line->next) {
     tor_assert(!strcmp(line->key, "TransportProxy"));
-    if (!strcmpstart(line->value, transport))
-      return line;
+
+    items = smartlist_create();
+    smartlist_split_string(items, line->value, NULL,
+                           SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+    if (smartlist_len(items) != 2) /* broken state */
+      goto done;
+
+    if (!strcmp(smartlist_get(items, 0), transport)) {
+      ret = line;
+      goto done;
+    }
+
+    SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+    smartlist_free(items);
+    items = NULL;
   }
-  return NULL;
+
+ done:
+  if (items) {
+    SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+    smartlist_free(items);
+  }
+  return ret;
 }
 
 /** Return string containing the address:port part of the