Blame SOURCES/0009-Check-for-fseek-errors-everywhere.patch

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