From 4ecdb004e81a459ea63ebd7127e1c945df43f9ce Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 17 Jul 2017 18:55:36 +0300 Subject: Fix issues detected by coverity. --- src/fs/virtfs/direntry.h | 2 +- src/fs/virtfs/fsdir.cpp | 12 ++++++++++++ src/fs/virtfs/fsdirrwops.cpp | 11 ++++++++++- src/fs/virtfs/fsentry.h | 2 +- src/fs/virtfs/zipentry.h | 2 +- src/fs/virtfs/zipreader.cpp | 6 +++++- src/gui/widgets/guitable.cpp | 5 ++++- src/gui/widgets/staticbrowserbox.cpp | 6 +----- src/net/eathena/beingrecv.cpp | 4 +++- src/net/net.cpp | 11 ++++++++--- src/resources/inventory/complexinventory.cpp | 1 + 11 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/fs/virtfs/direntry.h b/src/fs/virtfs/direntry.h index 41d9afc7c..18e700a6a 100644 --- a/src/fs/virtfs/direntry.h +++ b/src/fs/virtfs/direntry.h @@ -38,7 +38,7 @@ struct DirEntry final : public FsEntry A_DELETE_COPY(DirEntry) - ~DirEntry(); + virtual ~DirEntry(); std::string userDir; std::string rootSubDir; diff --git a/src/fs/virtfs/fsdir.cpp b/src/fs/virtfs/fsdir.cpp index 60fc9f977..be980ae65 100644 --- a/src/fs/virtfs/fsdir.cpp +++ b/src/fs/virtfs/fsdir.cpp @@ -377,6 +377,11 @@ namespace FsDir } #ifdef USE_FILE_FOPEN const long pos = ftell(fd); + if (pos < 0) + { + reportAlways("FsDir::fileLength ftell error."); + return -1; + } fseek(fd, 0, SEEK_END); const long sz = ftell(fd); fseek(fd, pos, SEEK_SET); @@ -483,6 +488,13 @@ namespace FsDir #ifdef USE_FILE_FOPEN fseek(fd, 0, SEEK_END); const long sz = ftell(fd); + if (sz < 0) + { + reportAlways("FsDir::fileLength ftell error."); + if (fd != FILEHDEFAULT) + FILECLOSE(fd); + return nullptr; + } fseek(fd, 0, SEEK_SET); fileSize = static_cast(sz); #else // USE_FILE_FOPEN diff --git a/src/fs/virtfs/fsdirrwops.cpp b/src/fs/virtfs/fsdirrwops.cpp index bef2534fb..b428ed333 100644 --- a/src/fs/virtfs/fsdirrwops.cpp +++ b/src/fs/virtfs/fsdirrwops.cpp @@ -25,6 +25,7 @@ #include "fs/virtfs/file.h" #include "utils/cast.h" +#include "utils/checkutils.h" PRAGMA48(GCC diagnostic push) PRAGMA48(GCC diagnostic ignored "-Wshadow") @@ -86,6 +87,11 @@ namespace FsDir int64_t len = 0; #ifdef USE_FILE_FOPEN const long curpos = ftell(fd); + if (curpos < 0) + { + reportAlways("FsDir::fileLength ftell error."); + return -1; + } fseek(fd, 0, SEEK_END); len = ftell(fd); // fseek(fd, curpos, SEEK_SET); @@ -105,7 +111,10 @@ namespace FsDir if (len == -1) { #ifdef USE_FILE_FOPEN - fseek(fd, curpos, SEEK_SET); + if (fseek(fd, curpos, SEEK_SET) < 0) + { + reportAlways("FsDir::fileLength fseek error."); + } #endif // USE_FILE_FOPEN logger->assertLog( "VirtFs::rwops_seek:Can't find end of file."); diff --git a/src/fs/virtfs/fsentry.h b/src/fs/virtfs/fsentry.h index 81568adb7..09ca136b0 100644 --- a/src/fs/virtfs/fsentry.h +++ b/src/fs/virtfs/fsentry.h @@ -39,7 +39,7 @@ struct FsEntry notfinal A_DELETE_COPY(FsEntry) - ~FsEntry(); + virtual ~FsEntry(); std::string root; diff --git a/src/fs/virtfs/zipentry.h b/src/fs/virtfs/zipentry.h index 3d8a21ced..eaf77889d 100644 --- a/src/fs/virtfs/zipentry.h +++ b/src/fs/virtfs/zipentry.h @@ -40,7 +40,7 @@ struct ZipEntry final : public FsEntry A_DELETE_COPY(ZipEntry) - ~ZipEntry(); + virtual ~ZipEntry(); STD_VECTOR mHeaders; STD_VECTOR mDirs; diff --git a/src/fs/virtfs/zipreader.cpp b/src/fs/virtfs/zipreader.cpp index 017686e6b..7f3e48463 100644 --- a/src/fs/virtfs/zipreader.cpp +++ b/src/fs/virtfs/zipreader.cpp @@ -27,6 +27,7 @@ #include "utils/cast.h" #include "utils/checkutils.h" +#include "utils/delete2.h" #include "utils/stringutils.h" #include @@ -55,7 +56,7 @@ extern const char *dirSeparator; { \ reportAlways("Error reading " msg " in file %s", \ archiveName.c_str()); \ - delete header; \ + delete2(header); \ delete [] buf; \ fclose(arcFile); \ return false; \ @@ -290,7 +291,10 @@ namespace ZipReader const size_t outSize = header->uncompressSize; uint8_t *restrict const out = new uint8_t[outSize]; if (outSize == 0) + { + delete [] in; return out; + } z_stream strm; strm.zalloc = nullptr; diff --git a/src/gui/widgets/guitable.cpp b/src/gui/widgets/guitable.cpp index 392755a20..9ff2075b1 100644 --- a/src/gui/widgets/guitable.cpp +++ b/src/gui/widgets/guitable.cpp @@ -593,6 +593,9 @@ void GuiTable::modelUpdated(const bool completed) Widget *GuiTable::getWidgetAt(int x, int y) { + if (mModel == nullptr) + return nullptr; + const int row = getRowForY(y); const int column = getColumnForX(x); @@ -602,7 +605,7 @@ Widget *GuiTable::getWidgetAt(int x, int y) return mTopWidget; } - if ((mModel != nullptr) && row > -1 && column > -1) + if (row > -1 && column > -1) { Widget *const w = mModel->getElementAt(row, column); if ((w != nullptr) && w->isFocusable()) diff --git a/src/gui/widgets/staticbrowserbox.cpp b/src/gui/widgets/staticbrowserbox.cpp index 7be4b780e..5999b2adf 100644 --- a/src/gui/widgets/staticbrowserbox.cpp +++ b/src/gui/widgets/staticbrowserbox.cpp @@ -668,16 +668,12 @@ void StaticBrowserBox::updateHeight() break; std::string part = row.substr(start, len); - int width = 0; - if (bold) - width = boldFont->getWidth(part); - else - width = font->getWidth(part); mLineParts.push_back(LinePart(CAST_S32(x), CAST_S32(y) + mItemPadding, selColor[0], selColor[1], part.c_str(), bold)); + int width = 0; if (bold) width = boldFont->getWidth(part); else diff --git a/src/net/eathena/beingrecv.cpp b/src/net/eathena/beingrecv.cpp index 435468fb6..c7c0c801c 100644 --- a/src/net/eathena/beingrecv.cpp +++ b/src/net/eathena/beingrecv.cpp @@ -703,7 +703,9 @@ void BeingRecv::processBeingMove(Net::MessageIn &msg) // because server don't send direction in move packet, we fixing it uint8_t d = 0; - if (srcX == dstX && srcY == dstY) + if (localPlayer != nullptr && + srcX == dstX && + srcY == dstY) { // if player did one step from invisible area to visible, // move path is broken int x2 = localPlayer->getTileX(); diff --git a/src/net/net.cpp b/src/net/net.cpp index d6b6e2945..7f394bcc4 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -113,14 +113,18 @@ std::set ignorePackets; void connectToServer(const ServerInfo &server) { BLOCK_START("Net::connectToServer") - if (networkType == server.type && (generalHandler != nullptr)) + if (networkType == server.type && + generalHandler != nullptr) { generalHandler->reload(); } else { - if (networkType != ServerType::UNKNOWN && (generalHandler != nullptr)) + if (networkType != ServerType::UNKNOWN && + generalHandler != nullptr) + { generalHandler->unload(); + } switch (server.type) { @@ -141,7 +145,8 @@ void connectToServer(const ServerInfo &server) break; } - generalHandler->load(); + if (generalHandler != nullptr) + generalHandler->load(); networkType = server.type; } diff --git a/src/resources/inventory/complexinventory.cpp b/src/resources/inventory/complexinventory.cpp index 4d77cfdde..c6037fe38 100644 --- a/src/resources/inventory/complexinventory.cpp +++ b/src/resources/inventory/complexinventory.cpp @@ -161,6 +161,7 @@ void ComplexInventory::setItem(const int index, equipped); item2->setInvIndex(index); item->addChild(item2, quantity); + delete item2; mItems[index] = item; mUsed ++; -- cgit v1.2.3-60-g2f50