commit 7b64f1773d144bf38ac293d3300dcbc9ac2c445f
Author: Taylor Yu <catal...@torproject.org>
Date:   Wed May 3 07:55:20 2017 -0400

    Fix memory management for #22103 tests
    
    Code movement in the commit introducings tests for #22103 uncovered a
    latent memory management bug.
    
    Refactor the log message checking from test_options_checkmsgs() into a
    helper test_options_checklog().  This avoids a memory leak (and
    possible double-free) in a test failure condition.
    
    Don't reuse variables (especially pointers to allocated memory!) for
    multiple unrelated purposes.
    
    Fixes CID 1405778.
---
 src/test/test_options.c | 48 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/test/test_options.c b/src/test/test_options.c
index 29f6665..291147b 100644
--- a/src/test/test_options.c
+++ b/src/test/test_options.c
@@ -106,6 +106,35 @@ clear_log_messages(void)
   " 083C 538F 4403 8BBF A077 587D D755\n"
 
 static int
+test_options_checklog(const char *configuration, int expect_log_severity,
+                      const char *expect_log)
+{
+  int found = 0, ret = -1;
+  char *actual_log = NULL;
+
+  if (messages) {
+    SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) {
+      if (m->severity == expect_log_severity &&
+          strstr(m->msg, expect_log)) {
+        found = 1;
+        break;
+      }
+    } SMARTLIST_FOREACH_END(m);
+  }
+  if (!found) {
+    actual_log = dump_logs();
+    TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.",
+            log_level_to_string(expect_log_severity), expect_log,
+            configuration, actual_log));
+  }
+  ret = 0;
+
+ done:
+  tor_free(actual_log);
+  return ret;
+}
+
+static int
 test_options_checkmsgs(const char *configuration,
                        const char *expect_errmsg,
                        int expect_log_severity,
@@ -123,23 +152,8 @@ test_options_checkmsgs(const char *configuration,
             configuration, msg));
   }
   if (expect_log) {
-    int found = 0;
-    if (messages) {
-      SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) {
-        if (m->severity == expect_log_severity &&
-            strstr(m->msg, expect_log)) {
-          found = 1;
-          break;
-        }
-      } SMARTLIST_FOREACH_END(m);
-    }
-    if (!found) {
-      tor_free(msg);
-      msg = dump_logs();
-      TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.",
-              log_level_to_string(expect_log_severity), expect_log,
-              configuration, msg));
-    }
+    return test_options_checklog(configuration, expect_log_severity,
+                                 expect_log);
   }
   return 0;
 



_______________________________________________
tor-commits mailing list
tor-commits@lists.torproject.org
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to