Merge commit 'sebastian/bug1831'

This commit is contained in:
Nick Mathewson 2010-08-15 23:43:36 -04:00
commit a856f446c7
16 changed files with 51 additions and 38 deletions

8
changes/bug1831 Normal file
View File

@ -0,0 +1,8 @@
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.
- Fix a memory leak in dirvote_compute_consensuses().
Bugfix on 0.2.0.3-alpha; fixes bug 1831 partially.

View File

@ -20,6 +20,10 @@ for $fn (@ARGV) {
if (/\t/) { if (/\t/) {
print " TAB:$fn:$.\n"; print " TAB:$fn:$.\n";
} }
## Warn about markers that don't have a space in front of them
if (/^[a-zA-Z_][a-zA-Z_0-9]*:/) {
print "nosplabel:$fn:$.\n";
}
## Warn about trailing whitespace. ## Warn about trailing whitespace.
if (/ +$/) { if (/ +$/) {
print "Space\@EOL:$fn:$.\n"; print "Space\@EOL:$fn:$.\n";

View File

@ -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 * after we do so. Use this result to estimate parameters and
* calculate the timeout. * calculate the timeout.
* *
* Returns -1 and sets msg on error. Msg must be freed by the caller. * Return -1 on error.
*/ */
int int
circuit_build_times_parse_state(circuit_build_times_t *cbt, circuit_build_times_parse_state(circuit_build_times_t *cbt,
or_state_t *state, char **msg) or_state_t *state)
{ {
int tot_values = 0; int tot_values = 0;
uint32_t loaded_cnt = 0, N = 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; unsigned int i;
build_time_t *loaded_times; build_time_t *loaded_times;
circuit_build_times_init(cbt); circuit_build_times_init(cbt);
*msg = NULL; int err = 0;
if (circuit_build_times_disabled()) { if (circuit_build_times_disabled()) {
return 0; return 0;
@ -631,8 +631,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
smartlist_split_string(args, line->value, " ", smartlist_split_string(args, line->value, " ",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
if (smartlist_len(args) < 2) { if (smartlist_len(args) < 2) {
*msg = tor_strdup("Unable to parse circuit build times: " log_warn(LD_GENERAL, "Unable to parse circuit build times: "
"Too few arguments to CircuitBuildTime"); "Too few arguments to CircuitBuildTime");
err = 1;
SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char*, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);
break; 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, ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0,
CBT_BUILD_TIME_MAX, &ok, NULL); CBT_BUILD_TIME_MAX, &ok, NULL);
if (!ok) { if (!ok) {
*msg = tor_strdup("Unable to parse circuit build times: " log_warn(LD_GENERAL, "Unable to parse circuit build times: "
"Unparsable bin number"); "Unparsable bin number");
err = 1;
SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char*, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);
break; 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, count = (uint32_t)tor_parse_ulong(count_str, 0, 0,
UINT32_MAX, &ok, NULL); UINT32_MAX, &ok, NULL);
if (!ok) { if (!ok) {
*msg = tor_strdup("Unable to parse circuit build times: " log_warn(LD_GENERAL, "Unable to parse circuit build times: "
"Unparsable bin count"); "Unparsable bin count");
err = 1;
SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char*, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);
break; break;
@ -692,10 +695,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
"Corrupt state file? Build times count mismatch. " "Corrupt state file? Build times count mismatch. "
"Read %d times, but file says %d", loaded_cnt, "Read %d times, but file says %d", loaded_cnt,
state->TotalBuildTimes); state->TotalBuildTimes);
*msg = tor_strdup("Build times count mismatch."); err = 1;
circuit_build_times_reset(cbt); circuit_build_times_reset(cbt);
tor_free(loaded_times); goto done;
return -1;
} }
circuit_build_times_shuffle_and_store_array(cbt, loaded_times, loaded_cnt); circuit_build_times_shuffle_and_store_array(cbt, loaded_times, loaded_cnt);
@ -716,10 +718,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
"Corrupt state file? Shuffled build times mismatch. " "Corrupt state file? Shuffled build times mismatch. "
"Read %d times, but file says %d", tot_values, "Read %d times, but file says %d", tot_values,
state->TotalBuildTimes); state->TotalBuildTimes);
*msg = tor_strdup("Build times count mismatch."); err = 1;
circuit_build_times_reset(cbt); circuit_build_times_reset(cbt);
tor_free(loaded_times); goto done;
return -1;
} }
circuit_build_times_set_timeout(cbt); circuit_build_times_set_timeout(cbt);
@ -728,8 +729,9 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
circuit_build_times_filter_timeouts(cbt); circuit_build_times_filter_timeouts(cbt);
} }
done:
tor_free(loaded_times); tor_free(loaded_times);
return *msg ? -1 : 0; return err ? -1 : 0;
} }
/** /**
@ -1512,7 +1514,7 @@ static int
onion_populate_cpath(origin_circuit_t *circ) onion_populate_cpath(origin_circuit_t *circ)
{ {
int r; int r;
again: again:
r = onion_extend_cpath(circ); r = onion_extend_cpath(circ);
if (r < 0) { if (r < 0) {
log_info(LD_CIRC,"Generating cpath hop failed."); log_info(LD_CIRC,"Generating cpath hop failed.");

View File

@ -81,7 +81,7 @@ extern circuit_build_times_t circ_times;
void circuit_build_times_update_state(circuit_build_times_t *cbt, void circuit_build_times_update_state(circuit_build_times_t *cbt,
or_state_t *state); or_state_t *state);
int circuit_build_times_parse_state(circuit_build_times_t *cbt, 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, void circuit_build_times_count_timeout(circuit_build_times_t *cbt,
int did_onehop); int did_onehop);
int circuit_build_times_count_close(circuit_build_times_t *cbt, int circuit_build_times_count_close(circuit_build_times_t *cbt,

View File

@ -4971,9 +4971,7 @@ or_state_set(or_state_t *new_state)
tor_free(err); tor_free(err);
ret = -1; ret = -1;
} }
if (circuit_build_times_parse_state(&circ_times, global_state, &err) < 0) { if (circuit_build_times_parse_state(&circ_times, global_state) < 0) {
log_warn(LD_GENERAL,"%s",err);
tor_free(err);
ret = -1; ret = -1;
} }
return ret; return ret;

View File

@ -2353,7 +2353,7 @@ connection_handle_read_impl(connection_t *conn)
return 0; return 0;
} }
loop_again: loop_again:
try_to_read = max_to_read; try_to_read = max_to_read;
tor_assert(!conn->marked_for_close); tor_assert(!conn->marked_for_close);

View File

@ -2050,7 +2050,7 @@ get_unique_stream_id_by_circ(origin_circuit_t *circ)
streamid_t test_stream_id; streamid_t test_stream_id;
uint32_t attempts=0; uint32_t attempts=0;
again: again:
test_stream_id = circ->next_stream_id++; test_stream_id = circ->next_stream_id++;
if (++attempts > 1<<16) { if (++attempts > 1<<16) {
/* Make sure we don't loop forever if all stream_id's are used. */ /* 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)) { if (rend_valid_service_id(query)) {
return ONION_HOSTNAME; /* success */ return ONION_HOSTNAME; /* success */
} }
failed: failed:
/* otherwise, return to previous state and return 0 */ /* otherwise, return to previous state and return 0 */
*s = '.'; *s = '.';
return BAD_HOSTNAME; return BAD_HOSTNAME;

View File

@ -2259,7 +2259,7 @@ handle_control_setcircuitpurpose(control_connection_t *conn,
circ->_base.purpose = new_purpose; circ->_base.purpose = new_purpose;
connection_write_str_to_buf("250 OK\r\n", conn); connection_write_str_to_buf("250 OK\r\n", conn);
done: done:
if (args) { if (args) {
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);

View File

@ -192,7 +192,7 @@ connection_cpu_process_inbuf(connection_t *conn)
tor_assert(0); /* don't ask me to do handshakes yet */ tor_assert(0); /* don't ask me to do handshakes yet */
} }
done_processing: done_processing:
conn->state = CPUWORKER_STATE_IDLE; conn->state = CPUWORKER_STATE_IDLE;
num_cpuworkers_busy--; num_cpuworkers_busy--;
if (conn->timestamp_created < last_rotation_time) { if (conn->timestamp_created < last_rotation_time) {

View File

@ -762,7 +762,7 @@ networkstatus_check_weights(int64_t Wgg, int64_t Wgd, int64_t Wmg,
} }
} }
out: out:
if (berr) { if (berr) {
log_info(LD_DIR, log_info(LD_DIR,
"Bw weight mismatch %d. G="I64_FORMAT" M="I64_FORMAT "Bw weight mismatch %d. G="I64_FORMAT" M="I64_FORMAT
@ -2942,6 +2942,7 @@ dirvote_compute_consensuses(void)
strlen(pending_consensus_signatures), 0); strlen(pending_consensus_signatures), 0);
log_notice(LD_DIR, "Signature(s) posted."); log_notice(LD_DIR, "Signature(s) posted.");
smartlist_free(votes);
return 0; return 0;
err: err:
smartlist_free(votes); smartlist_free(votes);
@ -3008,6 +3009,7 @@ dirvote_add_signatures_to_pending_consensus(
networkstatus_vote_free(v); networkstatus_vote_free(v);
} }
*msg_out = "Signatures added"; *msg_out = "Signatures added";
tor_free(new_signatures);
} else if (r == 0) { } else if (r == 0) {
*msg_out = "Signatures ignored"; *msg_out = "Signatures ignored";
} else { } else {
@ -3137,7 +3139,7 @@ void
dirvote_free_all(void) dirvote_free_all(void)
{ {
dirvote_clear_votes(1); 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); smartlist_free(pending_vote_list);
pending_vote_list = NULL; pending_vote_list = NULL;
smartlist_free(previous_vote_list); smartlist_free(previous_vote_list);
@ -3146,7 +3148,7 @@ dirvote_free_all(void)
dirvote_clear_pending_consensuses(); dirvote_clear_pending_consensuses();
tor_free(pending_consensus_signatures); tor_free(pending_consensus_signatures);
if (pending_consensus_signature_list) { 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); smartlist_free(pending_consensus_signature_list);
pending_consensus_signature_list = NULL; pending_consensus_signature_list = NULL;
} }

View File

@ -829,7 +829,7 @@ geoip_get_client_history(geoip_client_action_t action)
smartlist_add(chunks, buf); smartlist_add(chunks, buf);
}); });
result = smartlist_join_strings(chunks, ",", 0, NULL); result = smartlist_join_strings(chunks, ",", 0, NULL);
done: done:
tor_free(counts); tor_free(counts);
if (chunks) { if (chunks) {
SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); SMARTLIST_FOREACH(chunks, char *, c, tor_free(c));

View File

@ -381,7 +381,7 @@ validate_addr_policies(or_options_t *options, char **msg)
ADDR_POLICY_ACCEPT)) ADDR_POLICY_ACCEPT))
REJECT("Error in ReachableDirAddresses entry."); REJECT("Error in ReachableDirAddresses entry.");
err: err:
addr_policy_list_free(addr_policy); addr_policy_list_free(addr_policy);
return *msg ? -1 : 0; return *msg ? -1 : 0;
#undef REJECT #undef REJECT
@ -1272,7 +1272,7 @@ policy_summarize(smartlist_t *policy)
result = tor_malloc(final_size); result = tor_malloc(final_size);
tor_snprintf(result, final_size, "%s %s", prefix, shorter_str); tor_snprintf(result, final_size, "%s %s", prefix, shorter_str);
cleanup: cleanup:
/* cleanup */ /* cleanup */
SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s)); SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s));
smartlist_free(summary); smartlist_free(summary);

View File

@ -1327,7 +1327,7 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial)
return 0; return 0;
} }
repeat_connection_edge_package_raw_inbuf: repeat_connection_edge_package_raw_inbuf:
circ = circuit_get_by_edge_conn(conn); circ = circuit_get_by_edge_conn(conn);
if (!circ) { if (!circ) {

View File

@ -209,7 +209,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
introcirc->_base.purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; introcirc->_base.purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT;
return 0; return 0;
err: err:
circuit_mark_for_close(TO_CIRCUIT(introcirc), END_CIRC_REASON_INTERNAL); circuit_mark_for_close(TO_CIRCUIT(introcirc), END_CIRC_REASON_INTERNAL);
circuit_mark_for_close(TO_CIRCUIT(rendcirc), END_CIRC_REASON_INTERNAL); circuit_mark_for_close(TO_CIRCUIT(rendcirc), END_CIRC_REASON_INTERNAL);
return -1; return -1;

View File

@ -485,7 +485,6 @@ test_circuit_timeout(void)
circuit_build_times_t final; circuit_build_times_t final;
double timeout1, timeout2; double timeout1, timeout2;
or_state_t state; or_state_t state;
char *msg;
int i, runs; int i, runs;
double close_ms; double close_ms;
circuit_build_times_init(&initial); circuit_build_times_init(&initial);
@ -525,7 +524,7 @@ test_circuit_timeout(void)
test_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE); test_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE);
circuit_build_times_update_state(&estimate, &state); 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); circuit_build_times_update_alpha(&final);
timeout2 = circuit_build_times_calculate_timeout(&final, timeout2 = circuit_build_times_calculate_timeout(&final,
@ -627,7 +626,7 @@ test_circuit_timeout(void)
circuit_build_times_count_timeout(&final, 1); circuit_build_times_count_timeout(&final, 1);
} }
done: done:
return; return;
} }

View File

@ -580,7 +580,7 @@ test_dir_measured_bw(void)
"557365204145532d32353620696e73746561642e") == 0); "557365204145532d32353620696e73746561642e") == 0);
} }
done: done:
return; return;
} }