summaryrefslogtreecommitdiff
path: root/src/feature/hs/hs_cell.c
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2019-10-15 08:54:11 -0400
committerDavid Goulet <dgoulet@torproject.org>2019-10-15 08:54:11 -0400
commit09e6c0f7c7b91a73c73df197e45072a96240ea8d (patch)
tree354a96b74ee43170dc516edca5f8e8c153e7e925 /src/feature/hs/hs_cell.c
parenta4790e7d4b6ef406bf8cd14d8fd29e89f4b334ac (diff)
downloadtor-09e6c0f7c7b91a73c73df197e45072a96240ea8d.tar.gz
tor-09e6c0f7c7b91a73c73df197e45072a96240ea8d.zip
hs-v3: Fix possible memory leak in error code path
Found by coverity CID 1454769. There were a second possible leak that is also fixed in this commit. Fixes #32063 Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat (limited to 'src/feature/hs/hs_cell.c')
-rw-r--r--src/feature/hs/hs_cell.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/feature/hs/hs_cell.c b/src/feature/hs/hs_cell.c
index d691a1b007..df59f73c1b 100644
--- a/src/feature/hs/hs_cell.c
+++ b/src/feature/hs/hs_cell.c
@@ -503,8 +503,8 @@ build_establish_intro_dos_extension(const hs_service_config_t *service_config,
ssize_t ret;
size_t dos_ext_encoded_len;
uint8_t *field_array;
- trn_cell_extension_field_t *field;
- trn_cell_extension_dos_t *dos_ext;
+ trn_cell_extension_field_t *field = NULL;
+ trn_cell_extension_dos_t *dos_ext = NULL;
tor_assert(service_config);
tor_assert(extensions);
@@ -530,7 +530,7 @@ build_establish_intro_dos_extension(const hs_service_config_t *service_config,
/* Set the field with the encoded DoS extension. */
ret = trn_cell_extension_dos_encoded_len(dos_ext);
if (BUG(ret <= 0)) {
- return -1;
+ goto err;
}
dos_ext_encoded_len = ret;
/* Set length field and the field array size length. */
@@ -541,7 +541,7 @@ build_establish_intro_dos_extension(const hs_service_config_t *service_config,
ret = trn_cell_extension_dos_encode(field_array,
trn_cell_extension_field_getlen_field(field), dos_ext);
if (BUG(ret <= 0)) {
- return -1;
+ goto err;
}
tor_assert(ret == (ssize_t) dos_ext_encoded_len);
@@ -557,6 +557,11 @@ build_establish_intro_dos_extension(const hs_service_config_t *service_config,
trn_cell_extension_dos_free(dos_ext);
return 0;
+
+ err:
+ trn_cell_extension_field_free(field);
+ trn_cell_extension_dos_free(dos_ext);
+ return -1;
}
/* ========== */