diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-08-10 15:58:41 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-08-10 15:58:41 -0400 |
commit | 8150e2ad245e9d2dbfb35ae53384424efd749890 (patch) | |
tree | 43ce80bb4363955d65b7f138cc9d51c89cf8e551 /src/or | |
parent | 0087a37bed508d8240d4b51d1f2112bfae3f4d03 (diff) | |
download | tor-8150e2ad245e9d2dbfb35ae53384424efd749890.tar tor-8150e2ad245e9d2dbfb35ae53384424efd749890.tar.gz |
Make buf_shrink_freelists warn, not crash, when n_to_skip is too high
This mitigates bug 1125, but doesn't fix its root cause (whatever
that is).
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/buffers.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c index 3ba2760bf..e8422637c 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -270,14 +270,25 @@ buf_shrink_freelists(int free_all) (freelists[i].lowest_length - slack); int n_to_skip = freelists[i].cur_length - n_to_free; int orig_n_to_free = n_to_free, n_freed=0; + int orig_n_to_skip = n_to_skip; int new_length = n_to_skip; chunk_t **chp = &freelists[i].head; chunk_t *chunk; - log_info(LD_MM, "Cleaning freelist for %d-byte chunks: keeping %d, " - "dropping %d.", - (int)freelists[i].alloc_size, n_to_skip, n_to_free); + log_info(LD_MM, "Cleaning freelist for %d-byte chunks: length %d, " + "keeping %d, dropping %d.", + (int)freelists[i].alloc_size, freelists[i].cur_length, + n_to_skip, n_to_free); + tor_assert(n_to_skip + n_to_free == freelists[i].cur_length); while (n_to_skip) { - tor_assert((*chp)->next); + if (! (*chp)->next) { + log_warn(LD_BUG, "I wanted to skip %d chunks in the freelist for " + "%d-byte chunks, but only found %d. (Length %d)", + orig_n_to_skip, (int)freelists[i].alloc_size, + orig_n_to_skip-n_to_skip, freelists[i].cur_length); + assert_freelist_ok(&freelists[i]); + return; + } + // tor_assert((*chp)->next); chp = &(*chp)->next; --n_to_skip; } |