]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix various Disk I/O issues in all modules
authorTomas Hozza <thozza@redhat.com>
Mon, 28 Jan 2013 05:43:11 +0000 (22:43 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Mon, 28 Jan 2013 05:43:11 +0000 (22:43 -0700)
* Uninitialized class members.

* Handle NULL potential after several dynamic_cast.

* Better error result handling from several system functions
  lseek(), fcntl() can report errors which need handling.

* diskd explicit NULL dereference on broken input.
  Extremely unlikely, but worth protecting against.

 Detected by Coverity Scan. Issues 740510, 740358, 740359,
  740511, 740317, 740360, 740513, 740318, 740514

src/DiskIO/AIO/AIODiskIOStrategy.cc
src/DiskIO/DiskDaemon/DiskdFile.cc
src/DiskIO/DiskDaemon/diskd.cc
src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc
src/DiskIO/DiskThreads/aiops.cc
src/DiskIO/IpcIo/IpcIoFile.cc

index ef1777093d46b336adb850579dad6e185b2e0da0..7efb1fa436bc30341144de260a1df07421149e27 100644 (file)
 #include "DiskIO/ReadRequest.h"
 #include "DiskIO/WriteRequest.h"
 
-AIODiskIOStrategy::AIODiskIOStrategy()
+AIODiskIOStrategy::AIODiskIOStrategy() :
+        fd(-1)
 {
+    aq.aq_state = AQ_STATE_NONE;
     aq.aq_numpending = 0;
+    memset(&aq.aq_queue, 0, sizeof(aq.aq_queue));
 }
 
 AIODiskIOStrategy::~AIODiskIOStrategy()
index 5946c8d0ab3eee884393c3f5bdd5ebf003b34b3c..e461f753e8b13398689c469b557306fcab40c93f 100644 (file)
@@ -69,8 +69,11 @@ DiskdFile::operator delete(void *address)
     cbdataFree(t);
 }
 
-DiskdFile::DiskdFile(char const *aPath, DiskdIOStrategy *anIO) : errorOccured (false), IO(anIO),
-        inProgressIOs (0)
+DiskdFile::DiskdFile(char const *aPath, DiskdIOStrategy *anIO) :
+        errorOccured(false),
+        IO(anIO),
+        mode(0),
+        inProgressIOs(0)
 {
     assert (aPath);
     debugs(79, 3, "DiskdFile::DiskdFile: " << aPath);
@@ -382,8 +385,10 @@ DiskdFile::readDone(diomsg * M)
     debugs(79, 3, "DiskdFile::readDone: status " << M->status);
     assert (M->requestor);
     ReadRequest::Pointer readRequest = dynamic_cast<ReadRequest *>(M->requestor);
+
     /* remove the free protection */
-    readRequest->RefCountDereference();
+    if (readRequest != NULL)
+        readRequest->RefCountDereference();
 
     if (M->status < 0) {
         ++diskd_stats.read.fail;
@@ -407,7 +412,8 @@ DiskdFile::writeDone(diomsg *M)
     assert (M->requestor);
     WriteRequest::Pointer writeRequest = dynamic_cast<WriteRequest *>(M->requestor);
     /* remove the free protection */
-    writeRequest->RefCountDereference();
+    if (writeRequest != NULL)
+        writeRequest->RefCountDereference();
 
     if (M->status < 0) {
         errorOccured = true;
index e38bcbfc82e84b0cd6aa056d4131b4d9ad3a44ef..60f844eba2cf1e742932637ad15367d183f29151 100644 (file)
@@ -266,6 +266,10 @@ msg_handle(diomsg * r, int rl, diomsg * s)
 
     if (s->shm_offset > -1)
         buf = shmbuf + s->shm_offset;
+    else {
+        fprintf(stderr, "%d UNLNK id(%u) Error: no filename in shm buffer\n", (int) mypid, s->id);
+        return;
+    }
 
     switch (r->mtype) {
 
@@ -370,7 +374,10 @@ main(int argc, char *argv[])
 
     hash = hash_create(fsCmp, 1 << 4, fsHash);
     assert(hash);
-    fcntl(0, F_SETFL, SQUID_NONBLOCK);
+    if (fcntl(0, F_SETFL, SQUID_NONBLOCK) < 0) {
+        perror(xstrerror());
+        return 1;
+    }
     memset(&sa, '\0', sizeof(sa));
     sa.sa_handler = alarm_handler;
     sa.sa_flags = SA_RESTART;
index 296e3f4ca2424798828cb7a04fd73e5a20a472fa..81d2cd2190f10d865ec7c233fec99533bbc3ee9f 100644 (file)
@@ -190,7 +190,10 @@ DiskThreadsIOStrategy::sync()
     debugs(32, 2, "aioSync: done");
 }
 
-DiskThreadsIOStrategy::DiskThreadsIOStrategy() :  initialised (false) {}
+DiskThreadsIOStrategy::DiskThreadsIOStrategy() :
+        initialised(false),
+        squidaio_ctrl_pool(NULL)
+{}
 
 void
 DiskThreadsIOStrategy::aioStats(StoreEntry * sentry)
index 6fa7be16c333fa3be4de7842f456d5983ae63182..b04fb422d0db56462b8f29c9175d0544af3e7f2f 100644 (file)
@@ -729,8 +729,10 @@ squidaio_read(int fd, char *bufp, size_t bufs, off_t offset, int whence, squidai
 static void
 squidaio_do_read(squidaio_request_t * requestp)
 {
-    lseek(requestp->fd, requestp->offset, requestp->whence);
-    requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+    if (lseek(requestp->fd, requestp->offset, requestp->whence) >= 0)
+        requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+    else
+        requestp->ret = -1;
     requestp->err = errno;
 }
 
index b27a5d088d5471a4fd126e405b6928e5b7cae006..b0386b887c29eaccf395accc5727a2f78f91be73 100644 (file)
@@ -584,9 +584,14 @@ IpcIoFile::getFD() const
 /* IpcIoMsg */
 
 IpcIoMsg::IpcIoMsg():
-        requestId(0), offset(0), len(0), command(IpcIo::cmdNone), xerrno(0)
+        requestId(0),
+        offset(0),
+        len(0),
+        command(IpcIo::cmdNone),
+        xerrno(0)
 {
     start.tv_sec = 0;
+    start.tv_usec = 0;
 }
 
 /* IpcIoPendingRequest */