Remove a small memory leak in log callback setup

This commit is contained in:
Ola Bini 2016-01-12 14:29:21 -05:00
parent ce953b864b
commit 0bfa616e2e
No known key found for this signature in database
GPG Key ID: 465757AF3914B4B7
3 changed files with 26 additions and 3 deletions

View File

@ -889,6 +889,29 @@ add_temp_log(int min_severity)
UNLOCK_LOGS(); 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> * Add a log handler to send messages in <b>severity</b>
* to the function <b>cb</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 = tor_malloc_zero(sizeof(logfile_t));
lf->fd = -1; lf->fd = -1;
lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); 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->callback = cb;
lf->next = logfiles; lf->next = logfiles;
@ -1378,4 +1401,3 @@ truncate_logs(void)
} }
} }
} }

View File

@ -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, int add_syslog_log(const log_severity_list_t *severity,
const char* syslog_identity_tag); const char* syslog_identity_tag);
#endif #endif
void remove_log_callback(void);
int add_callback_log(const log_severity_list_t *severity, log_callback cb); int add_callback_log(const log_severity_list_t *severity, log_callback cb);
void logs_set_domain_logging(int enabled); void logs_set_domain_logging(int enabled);
int get_min_log_level(void); 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 # define TOR_TORLOG_H
#endif #endif

View File

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