aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/util.c12
-rw-r--r--src/or/routerlist.c29
-rw-r--r--src/test/test_util.c1
3 files changed, 29 insertions, 13 deletions
diff --git a/src/common/util.c b/src/common/util.c
index a45011fc4..a4cdae04e 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3448,10 +3448,10 @@ format_hex_number_sigsafe(unsigned int x, char *buf, int buf_len)
* <b>hex_errno</b>. Called between fork and _exit, so must be signal-handler
* safe.
*
- * <b>hex_errno</b> must have at least HEX_ERRNO_SIZE bytes available.
+ * <b>hex_errno</b> must have at least HEX_ERRNO_SIZE+1 bytes available.
*
* The format of <b>hex_errno</b> is: "CHILD_STATE/ERRNO\n", left-padded
- * with spaces. Note that there is no trailing \0. CHILD_STATE indicates where
+ * with spaces. CHILD_STATE indicates where
* in the processs of starting the child process did the failure occur (see
* CHILD_STATE_* macros for definition), and SAVED_ERRNO is the value of
* errno when the failure occurred.
@@ -3486,7 +3486,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
* Count how many chars of space we have left, and keep a pointer into the
* current point in the buffer.
*/
- left = HEX_ERRNO_SIZE;
+ left = HEX_ERRNO_SIZE+1;
cur = hex_errno;
/* Emit child_state */
@@ -3529,8 +3529,8 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
left -= written;
cur += written;
- /* Check that we have enough space left for a newline */
- if (left <= 0)
+ /* Check that we have enough space left for a newline and a NUL */
+ if (left <= 1)
goto err;
/* Emit the newline and NUL */
@@ -3786,7 +3786,7 @@ tor_spawn_background(const char *const filename, const char **argv,
this is used for printing out the error message */
unsigned char child_state = CHILD_STATE_INIT;
- char hex_errno[HEX_ERRNO_SIZE];
+ char hex_errno[HEX_ERRNO_SIZE + 2]; /* + 1 should be sufficient actually */
static int max_fd = -1;
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 2b894277c..cf9cf87a2 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -241,6 +241,27 @@ get_cert_list(const char *id_digest)
return cl;
}
+/** Release all space held by a cert_list_t */
+static void
+cert_list_free(cert_list_t *cl)
+{
+ if (!cl)
+ return;
+
+ SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert,
+ authority_cert_free(cert));
+ smartlist_free(cl->certs);
+ dsmap_free(cl->dl_status_map, tor_free_);
+ tor_free(cl);
+}
+
+/** Wrapper for cert_list_free so we can pass it to digestmap_free */
+static void
+cert_list_free_(void *cl)
+{
+ cert_list_free(cl);
+}
+
/** Reload the cached v3 key certificates from the cached-certs file in
* the data directory. Return 0 on success, -1 on failure. */
int
@@ -3284,13 +3305,7 @@ routerlist_free_all(void)
smartlist_free(fallback_dir_servers);
trusted_dir_servers = fallback_dir_servers = NULL;
if (trusted_dir_certs) {
- DIGESTMAP_FOREACH(trusted_dir_certs, key, cert_list_t *, cl) {
- SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert,
- authority_cert_free(cert));
- smartlist_free(cl->certs);
- tor_free(cl);
- } DIGESTMAP_FOREACH_END;
- digestmap_free(trusted_dir_certs, NULL);
+ digestmap_free(trusted_dir_certs, cert_list_free_);
trusted_dir_certs = NULL;
}
}
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 05d28d787..1f3b4d6de 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -2312,6 +2312,7 @@ test_util_exit_status(void *ptr)
n = format_helper_exit_status(0xFF, -0x80000000, hex_errno);
test_streq("FF/-80000000\n", hex_errno);
test_eq(n, strlen(hex_errno));
+ test_eq(n, HEX_ERRNO_SIZE);
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0x7F, 0, hex_errno);