[tor-commits] [tor/master] Make control_event_conf_changed() take a config_line_t

teor at torproject.org teor at torproject.org
Sun Dec 1 07:54:29 UTC 2019


commit 99cf3f99c02752f8d6d89fe94272454c55285b66
Author: Neel Chauhan <neel at neelc.org>
Date:   Tue Nov 26 20:57:33 2019 -0500

    Make control_event_conf_changed() take a config_line_t
---
 changes/bug31531                     |  4 ++++
 src/app/config/config.c              |  8 +-------
 src/feature/control/control_events.c | 17 +++++++----------
 src/feature/control/control_events.h |  3 ++-
 4 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/changes/bug31531 b/changes/bug31531
new file mode 100644
index 000000000..c549c79ec
--- /dev/null
+++ b/changes/bug31531
@@ -0,0 +1,4 @@
+  o Minor bugfixes (configuration handling):
+    - Make control_event_conf_changed() take in a config_line_t instead of
+      a smartlist(k, v, k, v, ...) where keys are followed by values. Fixes
+      bug 31531; bugfix on 0.2.3.3-alpha. Patch by Neel Chauhan.
diff --git a/src/app/config/config.c b/src/app/config/config.c
index 34f20c31c..5ea8cec6a 100644
--- a/src/app/config/config.c
+++ b/src/app/config/config.c
@@ -1001,15 +1001,9 @@ set_options(or_options_t *new_val, char **msg)
   /* Issues a CONF_CHANGED event to notify controller of the change. If Tor is
    * just starting up then the old_options will be undefined. */
   if (old_options && old_options != global_options) {
-    smartlist_t *elements = smartlist_new();
     config_line_t *changes =
       config_get_changes(get_options_mgr(), old_options, new_val);
-    for (config_line_t *line = changes; line; line = line->next) {
-      smartlist_add(elements, line->key);
-      smartlist_add(elements, line->value);
-    }
-    control_event_conf_changed(elements);
-    smartlist_free(elements);
+    control_event_conf_changed(changes);
     config_free_lines(changes);
   }
 
diff --git a/src/feature/control/control_events.c b/src/feature/control/control_events.c
index f88bcfdb9..02e30f66d 100644
--- a/src/feature/control/control_events.c
+++ b/src/feature/control/control_events.c
@@ -38,6 +38,7 @@
 #include "core/or/origin_circuit_st.h"
 
 #include "lib/evloop/compat_libevent.h"
+#include "lib/encoding/confline.h"
 
 static void flush_queued_events_cb(mainloop_event_t *event, void *arg);
 static void control_get_bytes_rw_last_sec(uint64_t *r, uint64_t *w);
@@ -1774,23 +1775,19 @@ control_event_guard(const char *nickname, const char *digest,
  * a smartlist_t containing (key, value, ...) pairs in sequence.
  * <b>value</b> can be NULL. */
 int
-control_event_conf_changed(const smartlist_t *elements)
+control_event_conf_changed(const config_line_t *elements)
 {
-  int i;
   char *result;
   smartlist_t *lines;
-  if (!EVENT_IS_INTERESTING(EVENT_CONF_CHANGED) ||
-      smartlist_len(elements) == 0) {
+  if (!EVENT_IS_INTERESTING(EVENT_CONF_CHANGED) || !elements) {
     return 0;
   }
   lines = smartlist_new();
-  for (i = 0; i < smartlist_len(elements); i += 2) {
-    char *k = smartlist_get(elements, i);
-    char *v = smartlist_get(elements, i+1);
-    if (v == NULL) {
-      smartlist_add_asprintf(lines, "650-%s", k);
+  for (const config_line_t *line = elements; line; line = line->next) {
+    if (line->value == NULL) {
+      smartlist_add_asprintf(lines, "650-%s", line->key);
     } else {
-      smartlist_add_asprintf(lines, "650-%s=%s", k, v);
+      smartlist_add_asprintf(lines, "650-%s=%s", line->key, line->value);
     }
   }
   result = smartlist_join_strings(lines, "\r\n", 0, NULL);
diff --git a/src/feature/control/control_events.h b/src/feature/control/control_events.h
index 34986fdb8..b0cf429fe 100644
--- a/src/feature/control/control_events.h
+++ b/src/feature/control/control_events.h
@@ -13,6 +13,7 @@
 #define TOR_CONTROL_EVENTS_H
 
 #include "core/or/ocirc_event.h"
+#include "lib/encoding/confline.h"
 
 /** Used to indicate the type of a CIRC_MINOR event passed to the controller.
  * The various types are defined in control-spec.txt . */
@@ -157,7 +158,7 @@ int control_event_server_error(const char *format, ...)
 
 int control_event_guard(const char *nickname, const char *digest,
                         const char *status);
-int control_event_conf_changed(const smartlist_t *elements);
+int control_event_conf_changed(const config_line_t *elements);
 int control_event_buildtimeout_set(buildtimeout_set_event_t type,
                                    const char *args);
 int control_event_signal(uintptr_t signal);





More information about the tor-commits mailing list