summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorOla Bini <ola@olabini.se>2016-01-12 14:29:21 -0500
committerOla Bini <ola@olabini.se>2016-01-13 10:35:05 -0500
commit0bfa616e2e0ea7425801142e7faf7bca020f4361 (patch)
treefb0def3aecb4d408fd8284596e122806501f80b5 /src/common
parentce953b864b25d89ecd0c4441114cab50e394a7ef (diff)
downloadtor-0bfa616e2e0ea7425801142e7faf7bca020f4361.tar.gz
tor-0bfa616e2e0ea7425801142e7faf7bca020f4361.zip
Remove a small memory leak in log callback setup
Diffstat (limited to 'src/common')
-rw-r--r--src/common/log.c26
-rw-r--r--src/common/torlog.h2
2 files changed, 25 insertions, 3 deletions
diff --git a/src/common/log.c b/src/common/log.c
index 4a8a7b1165..02ad7142e2 100644
--- a/src/common/log.c
+++ b/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)
}
}
}
-
diff --git a/src/common/torlog.h b/src/common/torlog.h
index 3e8667895f..f72263c85f 100644
--- a/src/common/torlog.h
+++ b/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
-