diff options
author | Nick Mathewson <nickm@torproject.org> | 2017-06-27 11:04:44 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-06-27 11:04:44 -0400 |
commit | 3de27618e65affe3688a5d92bce96e1e4ed5a82a (patch) | |
tree | 50ece08f25aebbcbce9294be8df2ae8c8254befb | |
parent | 3913f959e3688cfa91f9fab5368ba149e00cfec6 (diff) | |
parent | ccae991662adb3b64bdb1dcd4a942e4d1e163414 (diff) | |
download | tor-3de27618e65affe3688a5d92bce96e1e4ed5a82a.tar.gz tor-3de27618e65affe3688a5d92bce96e1e4ed5a82a.zip |
Merge branch 'maint-0.2.5' into maint-0.2.6
-rw-r--r-- | changes/bug22737 | 12 | ||||
-rw-r--r-- | src/or/connection_or.c | 4 |
2 files changed, 15 insertions, 1 deletions
diff --git a/changes/bug22737 b/changes/bug22737 new file mode 100644 index 0000000000..f0de8e6c41 --- /dev/null +++ b/changes/bug22737 @@ -0,0 +1,12 @@ + o Minor bugfixes (defensive programming, undefined behavior): + + - Fix a memset() off the end of an array when packing cells. This + bug should be harmless in practice, since the corrupted bytes + are still in the same structure, and are always padding bytes, + ignored, or immediately overwritten, depending on compiler + behavior. Nevertheless, because the memset()'s purpose is to + make sure that any other cell-handling bugs can't expose bytes + to the network, we need to fix it. Fixes bug 22737; bugfix on + 0.2.4.11-alpha. Fixes CID 1401591. + + diff --git a/src/or/connection_or.c b/src/or/connection_or.c index e0dff1c915..09c9b7c27f 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -429,9 +429,11 @@ cell_pack(packed_cell_t *dst, const cell_t *src, int wide_circ_ids) set_uint32(dest, htonl(src->circ_id)); dest += 4; } else { + /* Clear the last two bytes of dest, in case we can accidentally + * send them to the network somehow. */ + memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2); set_uint16(dest, htons(src->circ_id)); dest += 2; - memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2); /*make sure it's clear */ } set_uint8(dest, src->command); memcpy(dest+1, src->payload, CELL_PAYLOAD_SIZE); |