]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3483: assertion failed store.cc:1866: 'isEmpty()'
authorChudy Fernandez <chudy.fernandez@gmail.com>
Wed, 1 Jul 2015 04:38:20 +0000 (21:38 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 1 Jul 2015 04:38:20 +0000 (21:38 -0700)
src/StoreClient.h
src/store_client.cc

index e8fc4fa1c7fa6b7ff5359ddc08e73f03dd595c6a..60c18177b5e54a6db3b60e2998baf723e986f67f 100644 (file)
@@ -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;
index e8db6e53467a20fc17d9f74a0bcbab8a993ce7ba..9cdbab027b4c48168c1ee965e85404134b6c486d 100644 (file)
@@ -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.