浏览代码

Remove a small memory leak in log callback setup

Ola Bini 8 年之前
父节点
当前提交
0bfa616e2e
共有 3 个文件被更改,包括 26 次插入3 次删除
  1. 24 2
      src/common/log.c
  2. 1 1
      src/common/torlog.h
  3. 1 0
      src/test/test_options.c

+ 24 - 2
src/common/log.c

@@ -889,6 +889,29 @@ add_temp_log(int min_severity)
   UNLOCK_LOGS();
 }
 
+#define CALLBACK_FILENAME "<callback>"
+
+/**
+ * Removes the latest log handler added, if that log handler is a callback
+ * handler.
+ */
+void
+remove_log_callback(void)
+{
+  if(logfiles && !strcmp(logfiles->filename, CALLBACK_FILENAME)) {
+    logfile_t *lf = logfiles;
+
+    LOCK_LOGS();
+    logfiles = lf->next;
+    log_global_min_severity_ = get_min_log_level();
+    UNLOCK_LOGS();
+
+    tor_free(lf->filename);
+    tor_free(lf->severities);
+    tor_free(lf);
+  }
+}
+
 /**
  * Add a log handler to send messages in <b>severity</b>
  * to the function <b>cb</b>.
@@ -900,7 +923,7 @@ add_callback_log(const log_severity_list_t *severity, log_callback cb)
   lf = tor_malloc_zero(sizeof(logfile_t));
   lf->fd = -1;
   lf->severities = tor_memdup(severity, sizeof(log_severity_list_t));
-  lf->filename = tor_strdup("<callback>");
+  lf->filename = tor_strdup(CALLBACK_FILENAME);
   lf->callback = cb;
   lf->next = logfiles;
 
@@ -1378,4 +1401,3 @@ truncate_logs(void)
     }
   }
 }
-

+ 1 - 1
src/common/torlog.h

@@ -138,6 +138,7 @@ int add_file_log(const log_severity_list_t *severity, const char *filename,
 int add_syslog_log(const log_severity_list_t *severity,
                    const char* syslog_identity_tag);
 #endif
+void remove_log_callback(void);
 int add_callback_log(const log_severity_list_t *severity, log_callback cb);
 void logs_set_domain_logging(int enabled);
 int get_min_log_level(void);
@@ -241,4 +242,3 @@ MOCK_DECL(STATIC void, logv, (int severity, log_domain_mask_t domain,
 
 # define TOR_TORLOG_H
 #endif
-

+ 1 - 0
src/test/test_options.c

@@ -200,6 +200,7 @@ test_options_validate(void *arg)
            "We're a bridge but DirCache is disabled.");
 
   clear_log_messages();
+  remove_log_callback();
   return;
 }