From: Nick Mathewson Date: Tue, 7 Mar 2017 16:35:50 +0000 (-0500) Subject: Fixes when applying diffs: Allow 2-line diffs, fix bogus free X-Git-Tag: tor-0.3.1.1-alpha~213^2~21 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5766eed38f3fbf150691bcae84d82a1c16dbeb48;p=thirdparty%2Ftor.git Fixes when applying diffs: Allow 2-line diffs, fix bogus free The 2-line diff changs is needed to make the unit tests actually test the cases that they thought they were testing. The bogus free was found while testing those cases --- diff --git a/src/or/consdiff.c b/src/or/consdiff.c index ed20e3b12f..defa1cfba5 100644 --- a/src/or/consdiff.c +++ b/src/or/consdiff.c @@ -859,7 +859,7 @@ consdiff_get_digests(smartlist_t *diff, const char *format; char cons1_hash[DIGEST256_LEN], cons2_hash[DIGEST256_LEN]; char *cons1_hash_hex, *cons2_hash_hex; - if (smartlist_len(diff) < 3) { + if (smartlist_len(diff) < 2) { log_info(LD_CONSDIFF, "The provided consensus diff is too short."); goto error_cleanup; } @@ -986,8 +986,6 @@ consdiff_apply_diff(smartlist_t *cons1, smartlist_t *diff, } cons2_str = smartlist_join_strings(cons2, "\n", 1, NULL); - SMARTLIST_FOREACH(cons2, char *, cp, tor_free(cp)); - smartlist_free(cons2); common_digests_t cons2_digests; if (router_get_networkstatus_v3_hashes(cons2_str, @@ -1014,18 +1012,17 @@ consdiff_apply_diff(smartlist_t *cons1, smartlist_t *diff, goto error_cleanup; } - return cons2_str; + goto done; - error_cleanup: + error_cleanup: + tor_free(cons2_str); /* Sets it to NULL */ + done: if (cons2) { SMARTLIST_FOREACH(cons2, char *, cp, tor_free(cp)); smartlist_free(cons2); } - if (cons2_str) { - tor_free(cons2_str); - } - return NULL; + return cons2_str; }