From 70f0ba1495dce3b7c912354e2690fa9588b4e5b5 Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Sun, 15 Aug 2010 14:22:32 +0200 Subject: Fix a memory leak in circuit_build_times_parse_state Thanks weasel for noticing. --- src/or/circuitbuild.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/or') diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 5bb9d70d5d..9749a56fec 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -692,7 +692,8 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, "Corrupt state file? Build times count mismatch. " "Read %d times, but file says %d", loaded_cnt, state->TotalBuildTimes); - *msg = tor_strdup("Build times count mismatch."); + if (!*msg) + *msg = tor_strdup("Build times count mismatch."); circuit_build_times_reset(cbt); tor_free(loaded_times); return -1; @@ -716,7 +717,8 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, "Corrupt state file? Shuffled build times mismatch. " "Read %d times, but file says %d", tot_values, state->TotalBuildTimes); - *msg = tor_strdup("Build times count mismatch."); + if (!*msg) + *msg = tor_strdup("Build times count mismatch."); circuit_build_times_reset(cbt); tor_free(loaded_times); return -1; -- cgit v1.2.3-54-g00ecf From 4c49d3c27eb664561f1cc953f7c6fa441ac7cedc Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Sun, 15 Aug 2010 14:22:32 +0200 Subject: Refactor circuit_build_times_parse_state Remove the msg parameter to pass an error message out. This wasn't needed and made it harder to detect a memory leak. --- src/or/circuitbuild.c | 36 ++++++++++++++++++------------------ src/or/circuitbuild.h | 2 +- src/or/config.c | 4 +--- src/test/test.c | 3 +-- 4 files changed, 21 insertions(+), 24 deletions(-) (limited to 'src/or') diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 9749a56fec..8d6d9f47ed 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -605,11 +605,11 @@ circuit_build_times_filter_timeouts(circuit_build_times_t *cbt) * after we do so. Use this result to estimate parameters and * calculate the timeout. * - * Returns -1 and sets msg on error. Msg must be freed by the caller. + * Return -1 on error. */ int circuit_build_times_parse_state(circuit_build_times_t *cbt, - or_state_t *state, char **msg) + or_state_t *state) { int tot_values = 0; uint32_t loaded_cnt = 0, N = 0; @@ -617,7 +617,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, unsigned int i; build_time_t *loaded_times; circuit_build_times_init(cbt); - *msg = NULL; + int err = 0; if (circuit_build_times_disabled()) { return 0; @@ -631,8 +631,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, smartlist_split_string(args, line->value, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); if (smartlist_len(args) < 2) { - *msg = tor_strdup("Unable to parse circuit build times: " - "Too few arguments to CircuitBuildTime"); + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Too few arguments to CircuitBuildTime"); + err = 1; SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); smartlist_free(args); break; @@ -645,8 +646,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0, CBT_BUILD_TIME_MAX, &ok, NULL); if (!ok) { - *msg = tor_strdup("Unable to parse circuit build times: " - "Unparsable bin number"); + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Unparsable bin number"); + err = 1; SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); smartlist_free(args); break; @@ -654,8 +656,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, count = (uint32_t)tor_parse_ulong(count_str, 0, 0, UINT32_MAX, &ok, NULL); if (!ok) { - *msg = tor_strdup("Unable to parse circuit build times: " - "Unparsable bin count"); + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Unparsable bin count"); + err = 1; SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); smartlist_free(args); break; @@ -692,11 +695,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, "Corrupt state file? Build times count mismatch. " "Read %d times, but file says %d", loaded_cnt, state->TotalBuildTimes); - if (!*msg) - *msg = tor_strdup("Build times count mismatch."); + err = 1; circuit_build_times_reset(cbt); - tor_free(loaded_times); - return -1; + goto done; } circuit_build_times_shuffle_and_store_array(cbt, loaded_times, loaded_cnt); @@ -717,11 +718,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, "Corrupt state file? Shuffled build times mismatch. " "Read %d times, but file says %d", tot_values, state->TotalBuildTimes); - if (!*msg) - *msg = tor_strdup("Build times count mismatch."); + err = 1; circuit_build_times_reset(cbt); - tor_free(loaded_times); - return -1; + goto done; } circuit_build_times_set_timeout(cbt); @@ -730,8 +729,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, circuit_build_times_filter_timeouts(cbt); } +done: tor_free(loaded_times); - return *msg ? -1 : 0; + return err ? -1 : 0; } /** diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index 3a02f04202..d6aaef2fe9 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -81,7 +81,7 @@ extern circuit_build_times_t circ_times; void circuit_build_times_update_state(circuit_build_times_t *cbt, or_state_t *state); int circuit_build_times_parse_state(circuit_build_times_t *cbt, - or_state_t *state, char **msg); + or_state_t *state); void circuit_build_times_count_timeout(circuit_build_times_t *cbt, int did_onehop); int circuit_build_times_count_close(circuit_build_times_t *cbt, diff --git a/src/or/config.c b/src/or/config.c index ef2b2ddeab..e65d1329ce 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -4971,9 +4971,7 @@ or_state_set(or_state_t *new_state) tor_free(err); ret = -1; } - if (circuit_build_times_parse_state(&circ_times, global_state, &err) < 0) { - log_warn(LD_GENERAL,"%s",err); - tor_free(err); + if (circuit_build_times_parse_state(&circ_times, global_state) < 0) { ret = -1; } return ret; diff --git a/src/test/test.c b/src/test/test.c index 9948ecf992..6e5abcb97d 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -478,7 +478,6 @@ test_circuit_timeout(void) circuit_build_times_t final; double timeout1, timeout2; or_state_t state; - char *msg; int i, runs; double close_ms; circuit_build_times_init(&initial); @@ -518,7 +517,7 @@ test_circuit_timeout(void) test_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE); circuit_build_times_update_state(&estimate, &state); - test_assert(circuit_build_times_parse_state(&final, &state, &msg) == 0); + test_assert(circuit_build_times_parse_state(&final, &state) == 0); circuit_build_times_update_alpha(&final); timeout2 = circuit_build_times_calculate_timeout(&final, -- cgit v1.2.3-54-g00ecf From 527581194c285e5b08d4bb4fd9c573a0f12dd83b Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Sun, 15 Aug 2010 18:24:23 +0200 Subject: Fix a memory leak It happened in dirvote_add_signatures_to_pending_consesus(). --- changes/bug1831 | 2 ++ src/or/dirvote.c | 1 + 2 files changed, 3 insertions(+) (limited to 'src/or') diff --git a/changes/bug1831 b/changes/bug1831 index 40b3fcf52c..6c504dadbc 100644 --- a/changes/bug1831 +++ b/changes/bug1831 @@ -1,3 +1,5 @@ o Minor bugfixes - Fix a memory leak in the error case of circuit_build_times_parse_state(). Bugfix on 0.2.2.14-alpha; fixes bug 1831 partially. + - Fix a memory leak in dirvote_add_signatures_to_pending_consensus(). + Bugfix on 0.2.2.6-alpha; fixes bug 1831 partially. diff --git a/src/or/dirvote.c b/src/or/dirvote.c index fd4d742ccb..0042934c4a 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -3008,6 +3008,7 @@ dirvote_add_signatures_to_pending_consensus( networkstatus_vote_free(v); } *msg_out = "Signatures added"; + tor_free(new_signatures); } else if (r == 0) { *msg_out = "Signatures ignored"; } else { -- cgit v1.2.3-54-g00ecf From b2dcff5766cdf33799659e667a06e109d17b6eb9 Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Sun, 15 Aug 2010 21:02:01 +0200 Subject: Fix a memory leak in dirvote_compute_consensuses() --- changes/bug1831 | 3 +++ src/or/dirvote.c | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src/or') diff --git a/changes/bug1831 b/changes/bug1831 index 6c504dadbc..72f7d21856 100644 --- a/changes/bug1831 +++ b/changes/bug1831 @@ -3,3 +3,6 @@ Bugfix on 0.2.2.14-alpha; fixes bug 1831 partially. - Fix a memory leak in dirvote_add_signatures_to_pending_consensus(). Bugfix on 0.2.2.6-alpha; fixes bug 1831 partially. + - Fix a memory leak in dirvote_compute_consensuses(). + Bugfix on 0.2.0.3-alpha; fixes bug 1831 partially. + diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 0042934c4a..925f57f6e8 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -2942,6 +2942,7 @@ dirvote_compute_consensuses(void) strlen(pending_consensus_signatures), 0); log_notice(LD_DIR, "Signature(s) posted."); + smartlist_free(votes); return 0; err: smartlist_free(votes); @@ -3138,7 +3139,7 @@ void dirvote_free_all(void) { dirvote_clear_votes(1); - /* now empty as a result of clear_pending_votes. */ + /* now empty as a result of dirvote_clear_votes(). */ smartlist_free(pending_vote_list); pending_vote_list = NULL; smartlist_free(previous_vote_list); @@ -3147,7 +3148,7 @@ dirvote_free_all(void) dirvote_clear_pending_consensuses(); tor_free(pending_consensus_signatures); if (pending_consensus_signature_list) { - /* now empty as a result of clear_pending_votes. */ + /* now empty as a result of dirvote_clear_votes(). */ smartlist_free(pending_consensus_signature_list); pending_consensus_signature_list = NULL; } -- cgit v1.2.3-54-g00ecf From 561ca9b987e093755603f1cce8f7d783c7b3006e Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Mon, 16 Aug 2010 00:29:27 +0200 Subject: Fix misplaced labels --- src/or/circuitbuild.c | 4 ++-- src/or/connection.c | 2 +- src/or/connection_edge.c | 4 ++-- src/or/control.c | 2 +- src/or/cpuworker.c | 2 +- src/or/dirvote.c | 2 +- src/or/geoip.c | 2 +- src/or/policies.c | 4 ++-- src/or/relay.c | 2 +- src/or/rendclient.c | 2 +- src/test/test.c | 2 +- src/test/test_dir.c | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) (limited to 'src/or') diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 8d6d9f47ed..7bb6103752 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -729,7 +729,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, circuit_build_times_filter_timeouts(cbt); } -done: + done: tor_free(loaded_times); return err ? -1 : 0; } @@ -1514,7 +1514,7 @@ static int onion_populate_cpath(origin_circuit_t *circ) { int r; -again: + again: r = onion_extend_cpath(circ); if (r < 0) { log_info(LD_CIRC,"Generating cpath hop failed."); diff --git a/src/or/connection.c b/src/or/connection.c index 55d2fa8146..9956172600 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -2355,7 +2355,7 @@ connection_handle_read_impl(connection_t *conn) return 0; } -loop_again: + loop_again: try_to_read = max_to_read; tor_assert(!conn->marked_for_close); diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index e83028faef..64f3429930 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -2050,7 +2050,7 @@ get_unique_stream_id_by_circ(origin_circuit_t *circ) streamid_t test_stream_id; uint32_t attempts=0; -again: + again: test_stream_id = circ->next_stream_id++; if (++attempts > 1<<16) { /* Make sure we don't loop forever if all stream_id's are used. */ @@ -2988,7 +2988,7 @@ parse_extended_hostname(char *address, int allowdotexit) if (rend_valid_service_id(query)) { return ONION_HOSTNAME; /* success */ } -failed: + failed: /* otherwise, return to previous state and return 0 */ *s = '.'; return BAD_HOSTNAME; diff --git a/src/or/control.c b/src/or/control.c index 7cbb1bd1f6..7eead0e18a 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -2259,7 +2259,7 @@ handle_control_setcircuitpurpose(control_connection_t *conn, circ->_base.purpose = new_purpose; connection_write_str_to_buf("250 OK\r\n", conn); -done: + done: if (args) { SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); smartlist_free(args); diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index 2760d96665..6f943d78b8 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -192,7 +192,7 @@ connection_cpu_process_inbuf(connection_t *conn) tor_assert(0); /* don't ask me to do handshakes yet */ } -done_processing: + done_processing: conn->state = CPUWORKER_STATE_IDLE; num_cpuworkers_busy--; if (conn->timestamp_created < last_rotation_time) { diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 925f57f6e8..eae3bc8a40 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -762,7 +762,7 @@ networkstatus_check_weights(int64_t Wgg, int64_t Wgd, int64_t Wmg, } } -out: + out: if (berr) { log_info(LD_DIR, "Bw weight mismatch %d. G="I64_FORMAT" M="I64_FORMAT diff --git a/src/or/geoip.c b/src/or/geoip.c index cde9cabdb3..d9c8a01519 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -829,7 +829,7 @@ geoip_get_client_history(geoip_client_action_t action) smartlist_add(chunks, buf); }); result = smartlist_join_strings(chunks, ",", 0, NULL); -done: + done: tor_free(counts); if (chunks) { SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); diff --git a/src/or/policies.c b/src/or/policies.c index db3c6d886b..4fd0904152 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -381,7 +381,7 @@ validate_addr_policies(or_options_t *options, char **msg) ADDR_POLICY_ACCEPT)) REJECT("Error in ReachableDirAddresses entry."); -err: + err: addr_policy_list_free(addr_policy); return *msg ? -1 : 0; #undef REJECT @@ -1272,7 +1272,7 @@ policy_summarize(smartlist_t *policy) result = tor_malloc(final_size); tor_snprintf(result, final_size, "%s %s", prefix, shorter_str); -cleanup: + cleanup: /* cleanup */ SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s)); smartlist_free(summary); diff --git a/src/or/relay.c b/src/or/relay.c index 22ecdaafa0..b2de91da85 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1326,7 +1326,7 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial) return 0; } -repeat_connection_edge_package_raw_inbuf: + repeat_connection_edge_package_raw_inbuf: circ = circuit_get_by_edge_conn(conn); if (!circ) { diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 0377f121cc..68abb886a8 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -209,7 +209,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc, introcirc->_base.purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; return 0; -err: + err: circuit_mark_for_close(TO_CIRCUIT(introcirc), END_CIRC_REASON_INTERNAL); circuit_mark_for_close(TO_CIRCUIT(rendcirc), END_CIRC_REASON_INTERNAL); return -1; diff --git a/src/test/test.c b/src/test/test.c index 6e5abcb97d..c1d2ecbfb9 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -619,7 +619,7 @@ test_circuit_timeout(void) circuit_build_times_count_timeout(&final, 1); } -done: + done: return; } diff --git a/src/test/test_dir.c b/src/test/test_dir.c index a129bf9777..80d2379de6 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -580,7 +580,7 @@ test_dir_measured_bw(void) "557365204145532d32353620696e73746561642e") == 0); } -done: + done: return; } -- cgit v1.2.3-54-g00ecf