free() is specified to be NULL-safe, and I don't know of any implementations that violate this. Tor's *_free() functions conform, although relaycache_free() prints a warning (which I remove in the below diff).
I checked every *_free() function for NULL-safety before removing conditions for it. This includes an OpenSSL function or two.
This is only a first pass. I got bored, and I wanted to make sure that there's interest in committing this. :)
diff --git a/src/common/backtrace.c b/src/common/backtrace.c index a2d5378..0aa8a17 100644 --- a/src/common/backtrace.c +++ b/src/common/backtrace.c @@ -176,8 +176,7 @@ install_bt_handler(void) char **symbols; int depth = backtrace(cb_buf, MAX_DEPTH); symbols = backtrace_symbols(cb_buf, depth); - if (symbols) - free(symbols); + free(symbols); }
return rv; diff --git a/src/common/torgzip.c b/src/common/torgzip.c index 4f23407..3158b96 100644 --- a/src/common/torgzip.c +++ b/src/common/torgzip.c @@ -403,9 +403,7 @@ tor_gzip_uncompress(char **out, size_t *out_len, inflateEnd(stream); tor_free(stream); } - if (*out) { - tor_free(*out); - } + tor_free(*out); return -1; }
diff --git a/src/common/tortls.c b/src/common/tortls.c index 7447822..23b1dcf 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -625,10 +625,8 @@ tor_tls_create_certificate(crypto_pk_t *rsa,
goto done; error: - if (x509) { - X509_free(x509); - x509 = NULL; - } + X509_free(x509); + x509 = NULL; done: tls_log_errors(NULL, LOG_WARN, LD_NET, "generating certificate"); if (sign_pkey) @@ -722,8 +720,7 @@ tor_x509_cert_free(tor_x509_cert_t *cert) { if (! cert) return; - if (cert->cert) - X509_free(cert->cert); + X509_free(cert->cert); tor_free(cert->encoded); memwipe(cert, 0x03, sizeof(*cert)); tor_free(cert); @@ -1328,12 +1325,9 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, crypto_pk_free(rsa_auth); if (result) tor_tls_context_decref(result); - if (cert) - X509_free(cert); - if (idcert) - X509_free(idcert); - if (authcert) - X509_free(authcert); + X509_free(cert); + X509_free(idcert); + X509_free(authcert); return NULL; }
@@ -2035,8 +2029,7 @@ tor_tls_finish_handshake(tor_tls_t *tls) "a v2 handshake on %p.", tls); tls->wasV2Handshake = 1; } - if (cert) - X509_free(cert); + X509_free(cert); #endif if (SSL_set_cipher_list(tls->ssl, SERVER_CIPHER_LIST) == 0) { tls_log_errors(NULL, LOG_WARN, LD_HANDSHAKE, "re-setting ciphers"); @@ -2319,8 +2312,7 @@ tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_t **identity_key) r = 0;
done: - if (cert) - X509_free(cert); + X509_free(cert); if (id_pkey) EVP_PKEY_free(id_pkey);
@@ -2353,8 +2345,7 @@ tor_tls_check_lifetime(int severity, tor_tls_t *tls,
r = 0; done: - if (cert) - X509_free(cert); + X509_free(cert); /* Not expected to get invoked */ tls_log_errors(tls, LOG_WARN, LD_NET, "checking certificate lifetime");
diff --git a/src/common/util.h b/src/common/util.h index 8bb4505..9ba9d9a 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -107,8 +107,8 @@ extern int dmalloc_free(const char *file, const int line, void *pnt, STMT_END #else /** Release memory allocated by tor_malloc, tor_realloc, tor_strdup, etc. - * Unlike the free() function, tor_free() will still work on NULL pointers, - * and it sets the pointer value to NULL after freeing it. + * Unlike the free() function, tor_free() sets the pointer value to NULL + * after freeing it. * * This is a macro. If you need a function pointer to release memory from * tor_malloc(), use tor_free_(). diff --git a/src/ext/eventdns.c b/src/ext/eventdns.c index a0c7ff2..cfc3344 100644 --- a/src/ext/eventdns.c +++ b/src/ext/eventdns.c @@ -1923,9 +1923,7 @@ server_request_free(struct server_request *req) rc = --req->port->refcnt; }
- if (req->response) { - mm_free(req->response); - } + mm_free(req->response);
server_request_free_answers(req);
@@ -3216,8 +3214,7 @@ load_nameservers_with_getnetworkparams(void) }
done: - if (buf) - mm_free(buf); + mm_free(buf); if (handle) FreeLibrary(handle); return status; diff --git a/src/ext/tinytest_demo.c b/src/ext/tinytest_demo.c index c07f099..7279216 100644 --- a/src/ext/tinytest_demo.c +++ b/src/ext/tinytest_demo.c @@ -169,8 +169,7 @@ test_memcpy(void *ptr)
end: /* This time our end block has something to do. */ - if (mem) - free(mem); + free(mem); }
void diff --git a/src/or/buffers.c b/src/or/buffers.c index 85fcbc6..e5d2894 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1014,7 +1014,7 @@ fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out, result = 1;
done: - if (free_hdr && hdr) + if (free_hdr) tor_free(hdr); return result; } @@ -2410,8 +2410,7 @@ generic_buffer_set_to_copy(generic_buffer_t **output, } } #else - if (*output) - buf_free(*output); + buf_free(*output); *output = buf_copy(input); #endif return 0; diff --git a/src/or/channel.c b/src/or/channel.c index af09502..b1dc63e 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -917,10 +917,8 @@ channel_force_free(channel_t *chan) channel_clear_remote_end(chan);
/* Get rid of cmux */ - if (chan->cmux) { - circuitmux_free(chan->cmux); - chan->cmux = NULL; - } + circuitmux_free(chan->cmux); + chan->cmux = NULL;
/* We might still have a cell queue; kill it */ TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->incoming_queue, next, cell_tmp) { diff --git a/src/or/config.c b/src/or/config.c index 6e782de..e3d7721 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -7263,11 +7263,9 @@ init_cookie_authentication(const char *fname, const char *header, goto done; }
- /* If we've already set the cookie, free it before re-setting - it. This can happen if we previously generated a cookie, but - couldn't write it to a disk. */ - if (*cookie_out) - tor_free(*cookie_out); + /* Free this cookie before re-setting it. This can happen if we + * previously generated a cookie, but couldn't write it to a disk. */ + tor_free(*cookie_out);
/* Generate the cookie */ *cookie_out = tor_malloc(cookie_len); diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c index e8c8aa6..b4f4cab 100644 --- a/src/or/ext_orport.c +++ b/src/or/ext_orport.c @@ -476,9 +476,7 @@ connection_ext_or_handle_cmd_useraddr(connection_t *conn, /* record the address */ tor_addr_copy(&conn->addr, &addr); conn->port = port; - if (conn->address) { - tor_free(conn->address); - } + tor_free(conn->address); conn->address = tor_dup_addr(&addr);
return 0; @@ -509,11 +507,8 @@ connection_ext_or_handle_cmd_transport(or_connection_t *conn, return -1; }
- /* If ext_or_transport is already occupied (because the PT sent two - * TRANSPORT commands), deallocate the old name and keep the new - * one */ - if (conn->ext_or_transport) - tor_free(conn->ext_or_transport); + /* deallocate the ext_or_transport's old name and keep the new one */ + tor_free(conn->ext_or_transport);
conn->ext_or_transport = transport_str; return 0; @@ -643,7 +638,6 @@ connection_ext_or_start_auth(or_connection_t *or_conn) void ext_orport_free_all(void) { - if (ext_or_auth_cookie) /* Free the auth cookie */ - tor_free(ext_or_auth_cookie); + tor_free(ext_or_auth_cookie); }
diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c index 487cbee..4645ca4 100644 --- a/src/or/onion_tap.c +++ b/src/or/onion_tap.c @@ -75,7 +75,7 @@ onion_skin_TAP_create(crypto_pk_t *dest_router_key, return 0; err: memwipe(challenge, 0, sizeof(challenge)); - if (dh) crypto_dh_free(dh); + crypto_dh_free(dh); return -1; }
diff --git a/src/or/rendservice.c b/src/or/rendservice.c index db6bc4b..1fb5245 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -1746,7 +1746,7 @@ rend_service_receive_introduction(origin_circuit_t *circuit, (unsigned)circuit->base_.n_circ_id); err: status = -1; - if (dh) crypto_dh_free(dh); + crypto_dh_free(dh); if (launched) { circuit_mark_for_close(TO_CIRCUIT(launched), reason); } diff --git a/src/or/replaycache.c b/src/or/replaycache.c index 569e073..f327fa7 100644 --- a/src/or/replaycache.c +++ b/src/or/replaycache.c @@ -18,10 +18,8 @@ void replaycache_free(replaycache_t *r) { - if (!r) { - log_info(LD_BUG, "replaycache_free() called on NULL"); + if (!r) return; - }
if (r->digests_seen) digestmap_free(r->digests_seen, tor_free_);
diff --git a/src/or/routerparse.c b/src/or/routerparse.c index c2206f1..71bcb7e 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -3840,8 +3840,7 @@ assert_addr_policy_ok(smartlist_t *lst) static void token_clear(directory_token_t *tok) { - if (tok->key) - crypto_pk_free(tok->key); + crypto_pk_free(tok->key); }
#define ALLOC_ZERO(sz) memarea_alloc_zero(area,sz) diff --git a/src/test/test.c b/src/test/test.c index e10e260..d978f78 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -572,14 +572,10 @@ test_rend_fns(void *arg) rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); smartlist_free(descs); } - if (parsed) - rend_service_descriptor_free(parsed); - if (generated) - rend_service_descriptor_free(generated); - if (pk1) - crypto_pk_free(pk1); - if (pk2) - crypto_pk_free(pk2); + rend_service_descriptor_free(parsed); + rend_service_descriptor_free(generated); + crypto_pk_free(pk1); + crypto_pk_free(pk2); tor_free(intro_points_encrypted); }
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c index e8fce12..8cc1b61 100644 --- a/src/test/test_buffers.c +++ b/src/test/test_buffers.c @@ -189,10 +189,8 @@ test_buffers_basic(void *arg) }
done: - if (buf) - buf_free(buf); - if (buf2) - buf_free(buf2); + buf_free(buf); + buf_free(buf2); }
static void @@ -362,10 +360,8 @@ test_buffer_copy(void *arg) }
done: - if (buf) - generic_buffer_free(buf); - if (buf2) - generic_buffer_free(buf2); + generic_buffer_free(buf); + generic_buffer_free(buf2); }
static void diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c index dbaec61..71a94f8 100644 --- a/src/test/test_crypto.c +++ b/src/test/test_crypto.c @@ -269,10 +269,8 @@ test_crypto_aes(void *arg)
done: tor_free(mem_op_hex_tmp); - if (env1) - crypto_cipher_free(env1); - if (env2) - crypto_cipher_free(env2); + crypto_cipher_free(env1); + crypto_cipher_free(env2); tor_free(data1); tor_free(data2); tor_free(data3); @@ -412,10 +410,8 @@ test_crypto_sha(void *arg) tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
done: - if (d1) - crypto_digest_free(d1); - if (d2) - crypto_digest_free(d2); + crypto_digest_free(d1); + crypto_digest_free(d2); tor_free(mem_op_hex_tmp); }
diff --git a/src/test/test_dir.c b/src/test/test_dir.c index 855746e..bf7ce59 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -346,20 +346,17 @@ test_dir_formats(void *arg) dirserv_free_fingerprint_list();
done: - if (r1) - routerinfo_free(r1); - if (r2) - routerinfo_free(r2); - if (rp2) - routerinfo_free(rp2); + routerinfo_free(r1); + routerinfo_free(r2); + routerinfo_free(rp2);
tor_free(rsa_cc); tor_free(buf); tor_free(pk1_str); tor_free(pk2_str); - if (pk1) crypto_pk_free(pk1); - if (pk2) crypto_pk_free(pk2); - if (rp1) routerinfo_free(rp1); + crypto_pk_free(pk1); + crypto_pk_free(pk2); + routerinfo_free(rp1); tor_free(dir1); /* XXXX And more !*/ tor_free(dir2); /* And more !*/ } @@ -2315,32 +2312,19 @@ test_a_networkstatus( tor_free(consensus_text); tor_free(consensus_text_md);
- if (vote) - networkstatus_vote_free(vote); - if (v1) - networkstatus_vote_free(v1); - if (v2) - networkstatus_vote_free(v2); - if (v3) - networkstatus_vote_free(v3); - if (con) - networkstatus_vote_free(con); - if (con_md) - networkstatus_vote_free(con_md); - if (sign_skey_1) - crypto_pk_free(sign_skey_1); - if (sign_skey_2) - crypto_pk_free(sign_skey_2); - if (sign_skey_3) - crypto_pk_free(sign_skey_3); - if (sign_skey_leg1) - crypto_pk_free(sign_skey_leg1); - if (cert1) - authority_cert_free(cert1); - if (cert2) - authority_cert_free(cert2); - if (cert3) - authority_cert_free(cert3); + networkstatus_vote_free(vote); + networkstatus_vote_free(v1); + networkstatus_vote_free(v2); + networkstatus_vote_free(v3); + networkstatus_vote_free(con); + networkstatus_vote_free(con_md); + crypto_pk_free(sign_skey_1); + crypto_pk_free(sign_skey_2); + crypto_pk_free(sign_skey_3); + crypto_pk_free(sign_skey_leg1); + authority_cert_free(cert1); + authority_cert_free(cert2); + authority_cert_free(cert3);
tor_free(consensus_text2); tor_free(consensus_text3); @@ -2348,18 +2332,12 @@ test_a_networkstatus( tor_free(consensus_text_md3); tor_free(detached_text1); tor_free(detached_text2); - if (con2) - networkstatus_vote_free(con2); - if (con3) - networkstatus_vote_free(con3); - if (con_md2) - networkstatus_vote_free(con_md2); - if (con_md3) - networkstatus_vote_free(con_md3); - if (dsig1) - ns_detached_signatures_free(dsig1); - if (dsig2) - ns_detached_signatures_free(dsig2); + networkstatus_vote_free(con2); + networkstatus_vote_free(con3); + networkstatus_vote_free(con_md2); + networkstatus_vote_free(con_md3); + ns_detached_signatures_free(dsig1); + ns_detached_signatures_free(dsig2); }
/** Run unit tests for generating and parsing V3 consensus networkstatus diff --git a/src/test/test_replay.c b/src/test/test_replay.c index a02c160..538b2df 100644 --- a/src/test/test_replay.c +++ b/src/test/test_replay.c @@ -27,7 +27,7 @@ test_replaycache_alloc(void *arg) tt_assert(r != NULL);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -51,7 +51,7 @@ test_replaycache_badalloc(void *arg) tt_assert(r == NULL);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -90,7 +90,7 @@ test_replaycache_miss(void *arg) tt_int_op(result,OP_EQ, 0);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -116,7 +116,7 @@ test_replaycache_hit(void *arg) tt_int_op(result,OP_EQ, 1);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -147,7 +147,7 @@ test_replaycache_age(void *arg) tt_int_op(result,OP_EQ, 0);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -175,7 +175,7 @@ test_replaycache_elapsed(void *arg) tt_int_op(elapsed,OP_EQ, 100);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -206,7 +206,7 @@ test_replaycache_noexpire(void *arg) tt_int_op(result,OP_EQ, 1);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -248,7 +248,7 @@ test_replaycache_scrub(void *arg) tt_int_op(digestmap_size(r->digests_seen),OP_EQ, 0);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -292,7 +292,7 @@ test_replaycache_future(void *arg) tt_int_op(elapsed,OP_EQ, 0);
done: - if (r) replaycache_free(r); + replaycache_free(r);
return; } @@ -335,7 +335,7 @@ test_replaycache_realtime(void *arg) replaycache_scrub_if_needed(r);
done: - if (r) replaycache_free(r); + replaycache_free(r); return; }
diff --git a/src/test/test_routerset.c b/src/test/test_routerset.c index 9bd0c12..b13ec40 100644 --- a/src/test/test_routerset.c +++ b/src/test/test_routerset.c @@ -1144,8 +1144,7 @@ NS(test_main)(void *arg) tt_int_op(r, OP_EQ, 0);
done: - if (set != NULL) - routerset_free(set); + routerset_free(set); }
country_t @@ -1186,8 +1185,7 @@ NS(test_main)(void *arg) tt_int_op(smartlist_contains_string(set->list, "{??}"), OP_EQ, 1);
done: - if (set != NULL) - routerset_free(set); + routerset_free(set); }
country_t @@ -1249,8 +1247,7 @@ NS(test_main)(void *arg) tt_int_op(smartlist_contains_string(set->list, "{a1}"), OP_EQ, 1);
done: - if (set != NULL) - routerset_free(set); + routerset_free(set); }
country_t diff --git a/src/test/test_status.c b/src/test/test_status.c index cbc8af1..7e18b5d 100644 --- a/src/test/test_status.c +++ b/src/test/test_status.c @@ -145,8 +145,7 @@ NS(test_main)(void *arg) tor_free(actual);
done: - if (actual != NULL) - tor_free(actual); + tor_free(actual); }
#undef NS_SUBMODULE @@ -226,8 +225,7 @@ NS(test_main)(void *arg) tor_free(actual);
done: - if (actual != NULL) - tor_free(actual); + tor_free(actual); }
#undef NS_SUBMODULE diff --git a/src/test/test_util.c b/src/test/test_util.c index 0a5783e..a4341d9 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -1707,8 +1707,7 @@ test_util_gzip(void *arg) tt_int_op(21,OP_EQ, len2);
done: - if (state) - tor_zlib_free(state); + tor_zlib_free(state); tor_free(buf2); tor_free(buf3); tor_free(buf1);