Ver código fonte

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 14 anos atrás
pai
commit
ebc232bb79
1 arquivos alterados com 24 adições e 3 exclusões
  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