aboutsummaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-11-20 11:02:40 -0500
committerNick Mathewson <nickm@torproject.org>2017-11-20 11:04:37 -0500
commit3bb29dd707fbc825501c30ed9a6fe4aecdf4fd22 (patch)
tree267dd9972514e75dc17c34839447036e93235c2a /src/or
parent73585595245ac9551a1982575941e954bb870ad0 (diff)
downloadtor-3bb29dd707fbc825501c30ed9a6fe4aecdf4fd22.tar.gz
tor-3bb29dd707fbc825501c30ed9a6fe4aecdf4fd22.zip
Correctly handle partial success in consensus diff calculation.
Previously, if store_multiple() reported a partial success, we would store all the handles it gave us as if they had succeeded. But it's possible for the diff to be only partially successful -- for example, if LZMA failed but the other compressors succeeded. Fixes bug 24086; bugfix on 0.3.1.1-alpha.
Diffstat (limited to 'src/or')
-rw-r--r--src/or/consdiffmgr.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
index 831d5d45c3..8c25ff201c 100644
--- a/src/or/consdiffmgr.c
+++ b/src/or/consdiffmgr.c
@@ -1589,8 +1589,13 @@ consensus_diff_worker_replyfn(void *work_)
for (u = 0; u < ARRAY_LENGTH(handles); ++u) {
compress_method_t method = compress_diffs_with[u];
if (cache) {
- cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, status,
- handles[u]);
+ consensus_cache_entry_handle_t *h = handles[u];
+ int this_status = status;
+ if (h == NULL) {
+ this_status = CDM_DIFF_ERROR;
+ }
+ tor_assert_nonfatal(h != NULL || this_status == CDM_DIFF_ERROR);
+ cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, this_status, h);
} else {
consensus_cache_entry_handle_free(handles[u]);
}