diff options
author | Ladar Levison <ladar@lavabit.com> | 2022-05-02 18:03:31 +0300 |
---|---|---|
committer | Ladar Levison <ladar@lavabit.com> | 2022-05-02 18:03:31 +0300 |
commit | 4f1e32cebc7fac576adc8366f7b67ef7d031c63f (patch) | |
tree | 292a9084db302e674fce9ec482e592c16d726721 | |
parent | 6ab89e900488be8576b363e33bc4d46a26529f65 (diff) |
Handle minor memleak when greylist checks fail.
-rw-r--r-- | check/magma/servers/smtp/checkers_check.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/check/magma/servers/smtp/checkers_check.c b/check/magma/servers/smtp/checkers_check.c index 6a8b0713..56b4b799 100644 --- a/check/magma/servers/smtp/checkers_check.c +++ b/check/magma/servers/smtp/checkers_check.c @@ -23,13 +23,18 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { con.smtp.bypass = true; con.smtp.mailfrom = NULLER("check@example.com"); - con.network.reverse.ip = mm_alloc(sizeof(ip_t)); + if (!(con.network.reverse.ip = mm_alloc(sizeof(ip_t)))) { + st_sprint(errmsg, "The SMTP greylist check failed to allocate required memory."); + client_close(client); + return false; + } + ip_addr_st("127.0.0.1", con.network.reverse.ip); if (!(addr = con_addr_reversed(&con, addr)) || st_sprint(key, "magma.greylist.%lu.%.*s", prefs.usernum, st_length_int(addr), st_char_get(addr)) <= 0) { - st_sprint(errmsg, "The SMTP greylist check failed to create a valid lookup key."); + mm_free(con.network.reverse.ip); client_close(client); return false; } @@ -39,6 +44,7 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { if (smtp_check_greylist(&con, &prefs) != 1) { st_sprint(errmsg, "The SMTP greylist function failed to return 1 when bypass is enabled."); + mm_free(con.network.reverse.ip); client_close(client); return false; } @@ -46,6 +52,7 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { // Run the check with bypass disabled. else if ((con.smtp.bypass = false) || smtp_check_greylist(&con, &prefs) != 0) { st_sprint(errmsg, "The SMTP greylist function failed to return 0 after the initial try."); + mm_free(con.network.reverse.ip); client_close(client); return false; } @@ -53,6 +60,7 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { // Check that an immediate resubmission fails. else if (smtp_check_greylist(&con, &prefs) != 0) { st_sprint(errmsg, "The SMTP greylist check function failed to return 0 when resubmitted too fast."); + mm_free(con.network.reverse.ip); client_close(client); return false; } @@ -61,6 +69,7 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { else if (!(now = time(NULL) - 100) || !(value = cache_get(key)) || !(*(((uint64_t *)st_data_get(value)) + 1) = now) || (cache_set(key, value, 2592000) != 1)) { st_sprint(errmsg, "The SMTP check greylist function failed while attempting to update the cached greylist timestamp."); + mm_free(con.network.reverse.ip); client_close(client); st_cleanup(value); return false; @@ -68,11 +77,13 @@ bool_t check_smtp_checkers_greylist_sthread(stringer_t *errmsg) { else if (smtp_check_greylist(&con, &prefs) != 0) { st_sprint(errmsg, "The SMTP check greylist function failed to return 1 when the last timestamp is old enough."); + mm_free(con.network.reverse.ip); client_close(client); st_free(value); return false; } + // Client is never used, so this will test whether calling close on a NULL client handle doesn't result in an error. mm_free(con.network.reverse.ip); client_close(client); st_free(value); |