- Apr 10, 2019
-
-
Nick Mathewson authored
-
Nick Mathewson authored
-
George Kadianakis authored
-
Tobias Stoeckmann authored
The function compat_getdelim_ is used for tor_getline if tor is compiled on a system that lacks getline and getdelim. These systems should be very rare, considering that getdelim is POSIX. If this system is further a 32 bit architecture, it is possible to trigger a double free with huge files. If bufsiz has been already increased to 2 GB, the next chunk would be 4 GB in size, which wraps around to 0 due to 32 bit limitations. A realloc(*buf, 0) could be imagined as "free(*buf); return malloc(0);" which therefore could return NULL. The code in question considers that an error, but will keep the value of *buf pointing to already freed memory. The caller of tor_getline() would free the pointer again, therefore leading to a double free. This code can only be triggered in dirserv_read_measured_bandwidths with a huge measured bandwith list file on a system that actually allows to reach 2 GB of space through realloc. It is not possible to trigger this on Linux with glibc or other major *BSD systems even on unit tests, because these systems cannot reach so much memory due to memory fragmentation. This patch is effectively based on the penetration test report of cure53 for curl available at https://cure53.de/pentest-report_curl.pdf and explained under section "CRL-01-007 Double-free in aprintf() via unsafe size_t multiplication (Medium)".
-
teor authored
-
- Apr 09, 2019
-
-
Nick Mathewson authored
-
Nick Mathewson authored
-
Nick Mathewson authored
-
If the concatenation of connection buffer and the buffer of linked connection exceeds INT_MAX bytes, then buf_move_to_buf returns -1 as an error value. This value is currently casted to size_t (variable n_read) and will erroneously lead to an increasement of variable "max_to_read". This in turn can be used to call connection_buf_read_from_socket to store more data inside the buffer than expected and clogging the connection buffer. If the linked connection buffer was able to overflow INT_MAX, the call of buf_move_to_buf would have previously internally triggered an integer overflow, corrupting the state of the connection buffer. Signed-off-by:
Tobias Stoeckmann <tobias@stoeckmann.org>
-
Many buffer functions have a hard limit of INT_MAX for datalen, but this limitation is not enforced in all functions: - buf_move_all may exceed that limit with too many chunks - buf_move_to_buf exceeds that limit with invalid buf_flushlen argument - buf_new_with_data may exceed that limit (unit tests only) This patch adds some annotations in some buf_pos_t functions to guarantee that no out of boundary access could occur even if another function lacks safe guards against datalen overflows. Signed-off-by:
Tobias Stoeckmann <tobias@stoeckmann.org>
-
George Kadianakis authored
-
teor authored
-
- Apr 08, 2019
-
-
Nick Mathewson authored
Fixes bug 29922; bugfix on 0.2.9.3-alpha when we tried to capture all these warnings. No need to backport any farther than 0.3.5, though -- these warnings don't cause test failures before then. This one was tricky to find because apparently it only happened on _some_ windows builds.
-
- Apr 06, 2019
- Apr 05, 2019
-
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
teor authored
-
George Kadianakis authored
-
George Kadianakis authored
-
George Kadianakis authored
-
George Kadianakis authored
-
George Kadianakis authored
-
teor authored
-
teor authored
-
teor authored
We need to keep the gcno files, because they are created at compile time.
-
teor authored
-
teor authored
This test was disabled in 0.4.0 and later, but the fix in #29298 was only merged to 0.4.1. So this test will never be re-enabled in 0.4.0. Part of 29500.
-
Our monotime mocking forces us to call monotime_init() *before* we set the mocked time value. monotime_init() thus stores the first ratchet value at whatever the platform is at, and then we set fake mocked time to some later value. If monotime_init() gets a value from the host that is greater than what we choose to mock time at for our unittests, all subsequent monotime_abosolute() calls return zero, which breaks all unittests that depend on time moving forward by updating mocked monotime values. So, we need to adjust our mocked time to take the weird monotime_init() time into account, when we set fake time.
-
-
Hopefully this will stop monotime_absolute_usec() from returning 0 on some platforms in the tests.
-