* 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
#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()
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);
debugs(79, 3, "DiskdFile::readDone: status " << M->status);
assert (M->requestor);
ReadRequest::Pointer readRequest = dynamic_cast<ReadRequest *>(M->requestor);
+
/* remove the free protection */
- readRequest->unlock();
+ if (readRequest != NULL)
+ readRequest->unlock();
if (M->status < 0) {
++diskd_stats.read.fail;
assert (M->requestor);
WriteRequest::Pointer writeRequest = dynamic_cast<WriteRequest *>(M->requestor);
/* remove the free protection */
- writeRequest->unlock();
+ if (writeRequest != NULL)
+ writeRequest->unlock();
if (M->status < 0) {
errorOccured = true;
if (s->shm_offset > -1)
buf = shmbuf + s->shm_offset;
+ else {
+ printf(stderr, "%d UNLNK id(%u) Error: no filename in shm buffer\n", (int) mypid, s->id);
+ return EINVAL;
+ }
switch (r->mtype) {
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;
debugs(32, 2, "aioSync: done");
}
-DiskThreadsIOStrategy::DiskThreadsIOStrategy() : initialised (false) {}
+DiskThreadsIOStrategy::DiskThreadsIOStrategy() :
+ initialised(false),
+ squidaio_ctrl_pool(NULL)
+{}
void
DiskThreadsIOStrategy::aioStats(StoreEntry * sentry)
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;
}
/* 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 */