From 7e65871ccc49f6f25f8782789283cf2afef6e86b Mon Sep 17 00:00:00 2001 From: Karsten Loesing Date: Mon, 25 Jan 2010 18:44:17 +0000 Subject: Fix a memory corruption bug while collecting bridge stats We accidentally freed the internal buffer for bridge stats when we were writing the bridge stats file or honoring a control port request for said data. Change the interfaces for geoip_get_bridge_stats* to prevent these problems, and remove the offending free/add a tor_strdup. Fixes bug 1208. --- src/or/router.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/or/router.c') diff --git a/src/or/router.c b/src/or/router.c index 827df0302..257bca935 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1898,6 +1898,10 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, extrainfo->nickname, identity, published, bandwidth_usage); + tor_free(bandwidth_usage); + if (result<0) + return -1; + if (options->ExtraInfoStatistics && write_stats_to_extrainfo) { char *contents = NULL; log_info(LD_GENERAL, "Adding stats to extra-info descriptor."); @@ -1910,6 +1914,7 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, log_warn(LD_DIR, "Could not write dirreq-stats to extra-info " "descriptor."); s[pos] = '\0'; + write_stats_to_extrainfo = 0; } tor_free(contents); } @@ -1922,6 +1927,7 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, log_warn(LD_DIR, "Could not write entry-stats to extra-info " "descriptor."); s[pos] = '\0'; + write_stats_to_extrainfo = 0; } tor_free(contents); } @@ -1934,6 +1940,7 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, log_warn(LD_DIR, "Could not write buffer-stats to extra-info " "descriptor."); s[pos] = '\0'; + write_stats_to_extrainfo = 0; } tor_free(contents); } @@ -1946,17 +1953,14 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, log_warn(LD_DIR, "Could not write exit-stats to extra-info " "descriptor."); s[pos] = '\0'; + write_stats_to_extrainfo = 0; } tor_free(contents); } } - tor_free(bandwidth_usage); - if (result<0) - return -1; - - if (should_record_bridge_info(options)) { - char *bridge_stats = geoip_get_bridge_stats_extrainfo(now); + if (should_record_bridge_info(options) && write_stats_to_extrainfo) { + const char *bridge_stats = geoip_get_bridge_stats_extrainfo(now); if (bridge_stats) { size_t pos = strlen(s); if (strlcpy(s + pos, bridge_stats, maxlen - strlen(s)) != @@ -1964,8 +1968,8 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, log_warn(LD_DIR, "Could not write bridge-stats to extra-info " "descriptor."); s[pos] = '\0'; + write_stats_to_extrainfo = 0; } - tor_free(bridge_stats); } } -- cgit v1.2.3