]> 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:40:00 +0000 (21:40 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 1 Jul 2015 04:40:00 +0000 (21:40 -0700)
src/StoreClient.h
src/store_client.cc

index c4599426600c7b3989b246c805faab026ad3e8cc..24bdebaba74140d5453eea5b72990ccc087032d5 100644 (file)
@@ -80,7 +80,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 e7d83d6bbf9138ddbfbff2ea527e4fb7b753af66..2b5b6b5a323021a64cbad0b84080f10edf656939 100644 (file)
@@ -526,15 +526,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;
@@ -543,16 +542,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;
     }
 
     /*
@@ -561,8 +558,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;
         }
     }
 
@@ -577,6 +573,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
@@ -588,11 +585,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.