From: Chudy Fernandez Date: Wed, 1 Jul 2015 04:38:20 +0000 (-0700) Subject: Bug 3483: assertion failed store.cc:1866: 'isEmpty()' X-Git-Tag: merge-candidate-3-v1~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ea266b79e52b5a034146b648fa486a4b5cd2d3b;p=thirdparty%2Fsquid.git Bug 3483: assertion failed store.cc:1866: 'isEmpty()' --- diff --git a/src/StoreClient.h b/src/StoreClient.h index e8fc4fa1c7..60c18177b5 100644 --- a/src/StoreClient.h +++ b/src/StoreClient.h @@ -81,7 +81,7 @@ private: void scheduleMemRead(); void scheduleRead(); bool startSwapin(); - void unpackHeader(char const *buf, ssize_t len); + bool unpackHeader(char const *buf, ssize_t len); int type; bool object_ok; diff --git a/src/store_client.cc b/src/store_client.cc index e8db6e5346..9cdbab027b 100644 --- a/src/store_client.cc +++ b/src/store_client.cc @@ -522,15 +522,14 @@ storeClientReadBody(void *data, const char *buf, ssize_t len, StoreIOState::Poin sc->readBody(buf, len); } -void +bool store_client::unpackHeader(char const *buf, ssize_t len) { debugs(90, 3, "store_client::unpackHeader: len " << len << ""); if (len < 0) { - debugs(90, 3, "store_client::unpackHeader: " << xstrerror() << ""); - fail(); - return; + debugs(90, 3, "WARNING: unpack error: " << xstrerror()); + return false; } int swap_hdr_sz = 0; @@ -539,16 +538,14 @@ store_client::unpackHeader(char const *buf, ssize_t len) if (!aBuilder.isBufferSane()) { /* oops, bad disk file? */ debugs(90, DBG_IMPORTANT, "WARNING: swapfile header inconsistent with available data"); - fail(); - return; + return false; } tlv *tlv_list = aBuilder.createStoreMeta (); if (tlv_list == NULL) { debugs(90, DBG_IMPORTANT, "WARNING: failed to unpack meta data"); - fail(); - return; + return false; } /* @@ -557,8 +554,7 @@ store_client::unpackHeader(char const *buf, ssize_t len) for (tlv *t = tlv_list; t; t = t->next) { if (!t->checkConsistency(entry)) { storeSwapTLVFree(tlv_list); - fail(); - return; + return false; } } @@ -573,6 +569,7 @@ store_client::unpackHeader(char const *buf, ssize_t len) debugs(90, 5, "store_client::unpackHeader: swap_file_sz=" << entry->swap_file_sz << "( " << swap_hdr_sz << " + " << entry->mem_obj->object_sz << ")"); + return true; } void @@ -584,11 +581,15 @@ store_client::readHeader(char const *buf, ssize_t len) flags.disk_io_pending = false; assert(_callback.pending()); - unpackHeader (buf, len); - + // abort if we fail()'d earlier if (!object_ok) return; + if (!unpackHeader(buf, len)) { + fail(); + return; + } + /* * If our last read got some data the client wants, then give * it to them, otherwise schedule another read.