Blob Blame History Raw
From 6bc66384084a018724b0c94ed30088dff5130e16 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Fri, 2 Jun 2017 12:32:49 -0400
Subject: [PATCH 09/22] Check for fseek errors everywhere.

covscan noticed these aren't checked.

Signed-off-by: Peter Jones <pjones@redhat.com>
---
 src/libsmbios_c/smi/smi_linux.c       |  5 ++++-
 src/libsmbios_c/smi/smi_solaris.c     |  6 +++++-
 src/libsmbios_c++/smi/SmiImpl.h       |  4 +++-
 src/libsmbios_c++/cmos/CmosRW.cpp     | 16 ++++++++++++++--
 src/libsmbios_c++/smi/Smi_Linux.cpp   | 22 ++++++++++++++++++----
 src/libsmbios_c++/smi/Smi_Solaris.cpp | 23 ++++++++++++++++++-----
 6 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/src/libsmbios_c/smi/smi_linux.c b/src/libsmbios_c/smi/smi_linux.c
index c97489fed42..f810b43e699 100644
--- a/src/libsmbios_c/smi/smi_linux.c
+++ b/src/libsmbios_c/smi/smi_linux.c
@@ -59,6 +59,7 @@ u32 __hidden get_phys_buf_addr()
     FILE *fd = 0;
     u32 physaddr = 0;
     char linebuf[bufsize] = {0,};
+    int ret;
 
     fnprintf("\n");
 
@@ -68,7 +69,9 @@ u32 __hidden get_phys_buf_addr()
     if (!fd)
         goto out;
 
-    fseek(fd, 0L, 0);
+    ret = fseek(fd, 0L, 0);
+    if (ret < 0)
+        goto out_close;
     size_t numBytes = fread(linebuf, 1, bufsize, fd);
     if (!numBytes)
         goto out_close;
diff --git a/src/libsmbios_c/smi/smi_solaris.c b/src/libsmbios_c/smi/smi_solaris.c
index bb407750ba1..d190305c8f8 100644
--- a/src/libsmbios_c/smi/smi_solaris.c
+++ b/src/libsmbios_c/smi/smi_solaris.c
@@ -59,6 +59,7 @@ u32 __internal get_phys_buf_addr()
     FILE *fd = 0;
     u32 physaddr = 0;
     char linebuf[bufsize] = {0,};
+    int ret;
 
     fnprintf("\n");
 
@@ -68,7 +69,10 @@ u32 __internal get_phys_buf_addr()
     if (!fd)
         goto out;
 
-    fseek(fd, 0L, 0);
+    ret = fseek(fd, 0L, 0);
+    if (ret < 0)
+        goto out_close;
+
     size_t numBytes = fread(linebuf, 1, bufsize, fd);
     if (!numBytes)
         goto out_close;
diff --git a/src/libsmbios_c++/smi/SmiImpl.h b/src/libsmbios_c++/smi/SmiImpl.h
index 6373d79d0ca..b448e5d8087 100644
--- a/src/libsmbios_c++/smi/SmiImpl.h
+++ b/src/libsmbios_c++/smi/SmiImpl.h
@@ -84,7 +84,9 @@ namespace smi
         };
         virtual void execute()
         {
-            fseek(fh,0,0);
+            int ret = fseek(fh,0,0);
+            if (ret < 0)
+                throw std::exception();
         };
         virtual void getResultBuffer(u8 *buffer, size_t size)
         {
diff --git a/src/libsmbios_c++/cmos/CmosRW.cpp b/src/libsmbios_c++/cmos/CmosRW.cpp
index 32642228176..c4274d4b2f7 100644
--- a/src/libsmbios_c++/cmos/CmosRW.cpp
+++ b/src/libsmbios_c++/cmos/CmosRW.cpp
@@ -118,6 +118,7 @@ namespace cmos
     //
     u8 CmosRWFile::readByte (u32 indexPort, u32 dataPort, u32 offset) const
     {
+        int ret;
         u8 retval = 0xFF;
         u32 realOffset = indexPort * 256 + offset;
         (void) dataPort; // unused
@@ -127,7 +128,12 @@ namespace cmos
         if( !fh )
             throw smbios::InternalErrorImpl(errMessage + strerror(errno));
 
-        fseek (fh, static_cast<long>(realOffset), SEEK_SET);
+        ret = fseek (fh, static_cast<long>(realOffset), SEEK_SET);
+        if (ret < 0)
+        {
+            fclose (fh);
+            throw std::exception();
+        }
         size_t numRecs = fread (&retval, sizeof (retval), 1, fh); // only used in unit tests, so isnt critical
         fclose (fh);
         if (numRecs != 1)
@@ -141,6 +147,7 @@ namespace cmos
     void CmosRWFile::writeByte (u32 indexPort, u32 dataPort, u32 offset, u8 byte) const
     {
         //cout << "w(" << offset << ")";
+        int ret;
         u32 realOffset = indexPort * 256 + offset;
         (void) dataPort; // unused
         string errMessage("Could not open CMOS file(" + fileName + ") for writing: ");
@@ -149,7 +156,12 @@ namespace cmos
         if( !fh )
             throw smbios::InternalErrorImpl(errMessage + strerror(errno));
 
-        fseek (fh, static_cast<long>(realOffset), SEEK_SET);
+        ret = fseek (fh, static_cast<long>(realOffset), SEEK_SET);
+        if (ret < 0)
+        {
+            fclose (fh);
+            throw std::exception();
+        }
         size_t recs = fwrite (&byte, sizeof (byte), 1, fh);
         fclose (fh);
         fflush(NULL);
diff --git a/src/libsmbios_c++/smi/Smi_Linux.cpp b/src/libsmbios_c++/smi/Smi_Linux.cpp
index 3107d892296..5f3ecc31017 100644
--- a/src/libsmbios_c++/smi/Smi_Linux.cpp
+++ b/src/libsmbios_c++/smi/Smi_Linux.cpp
@@ -76,6 +76,7 @@ namespace smi
 
     void SmiArchStrategy::lock()
     {
+        int ret;
         smiLinuxPrivateData *tmpPrivPtr = reinterpret_cast<smiLinuxPrivateData *>(privateData);
 
 
@@ -89,9 +90,13 @@ namespace smi
 
         flock( fileno(tmpPrivPtr->fh_data), LOCK_EX );
 
-        fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
         FWRITE("0", 1, 1, tmpPrivPtr->fh_doReq);
-        fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
     }
 
     size_t SmiArchStrategy::getPhysicalBufferBaseAddress()
@@ -99,6 +104,7 @@ namespace smi
         const int bufSize=63;
         char tmpBuf[bufSize+1] = {0,};
         size_t retval = 0;
+        int ret;
 
         fflush(NULL);
 
@@ -106,7 +112,12 @@ namespace smi
         if( ! fh )
             throw smbios::InternalErrorImpl("Could not open file " SMI_PHYS_ADDR_FILE ". Check that dcdbas driver is properly loaded.");
 
-        fseek(fh, 0L, 0);
+        ret = fseek(fh, 0L, 0);
+        if (ret < 0)
+        {
+            fclose(fh);
+            throw std::exception();
+        }
         size_t numBytes = fread(tmpBuf, 1, bufSize, fh);
         fclose(fh);
         fh=0;
@@ -155,11 +166,14 @@ namespace smi
 
     void SmiArchStrategy::execute()
     {
+        int ret;
         smiLinuxPrivateData *tmpPrivPtr = reinterpret_cast<smiLinuxPrivateData *>(privateData);
         fflush(NULL);
         FWRITE("1", 1, 1, tmpPrivPtr->fh_doReq);
         fflush(NULL);
-        fseek(tmpPrivPtr->fh_data, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_data, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
     }
 
     void SmiArchStrategy::finish()
diff --git a/src/libsmbios_c++/smi/Smi_Solaris.cpp b/src/libsmbios_c++/smi/Smi_Solaris.cpp
index d2190eea479..7ffce233e34 100644
--- a/src/libsmbios_c++/smi/Smi_Solaris.cpp
+++ b/src/libsmbios_c++/smi/Smi_Solaris.cpp
@@ -79,7 +79,7 @@ namespace smi
     void SmiArchStrategy::lock()
     {
         smiSolarisPrivateData *tmpPrivPtr = reinterpret_cast<smiSolarisPrivateData *>(privateData);
-
+        int ret;
 
         tmpPrivPtr->fh_data = fopen(SMI_DATA_FILE, "r+b");
         if( ! tmpPrivPtr->fh_data )
@@ -89,9 +89,13 @@ namespace smi
         if( ! tmpPrivPtr->fh_doReq)
             throw smbios::InternalErrorImpl("Could not open file " SMI_DO_REQUEST_FILE ". Check that dcdbas driver is properly loaded.");
 
-        fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
         FWRITE("0", 1, 1, tmpPrivPtr->fh_doReq);
-        fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_doReq, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
     }
 
     size_t SmiArchStrategy::getPhysicalBufferBaseAddress()
@@ -99,6 +103,7 @@ namespace smi
         const int bufSize=63;
         char tmpBuf[bufSize+1] = {0,};
         size_t retval = 0;
+        int ret;
 
         fflush(NULL);
 
@@ -106,7 +111,12 @@ namespace smi
         if( ! fh )
             throw smbios::InternalErrorImpl("Could not open file " SMI_PHYS_ADDR_FILE ". Check that dcdbas driver is properly loaded.");
 
-        fseek(fh, 0L, 0);
+        ret = fseek(fh, 0L, 0);
+        if (ret < 0)
+        {
+            fclose(fh);
+            throw std::exception();
+        }
         size_t numBytes = fread(tmpBuf, 1, bufSize, fh);
         fclose(fh);
         fh=0;
@@ -155,11 +165,14 @@ namespace smi
 
     void SmiArchStrategy::execute()
     {
+        int ret;
         smiSolarisPrivateData *tmpPrivPtr = reinterpret_cast<smiSolarisPrivateData *>(privateData);
         fflush(NULL);
         FWRITE("1", 1, 1, tmpPrivPtr->fh_doReq);
         fflush(NULL);
-        fseek(tmpPrivPtr->fh_data, 0L, 0);
+        ret = fseek(tmpPrivPtr->fh_data, 0L, 0);
+        if (ret < 0)
+            throw std::exception();
     }
 
     void SmiArchStrategy::finish()
-- 
2.14.3