changeset 1675:bc5a75888fa9

Improve error handling and plug filehandle leaks.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 31 May 2018 13:04:25 +0300
parents 0f256e7340a3
children e0d618663574
files tools/objlink.c
diffstat 1 files changed, 38 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/tools/objlink.c	Thu May 31 13:03:53 2018 +0300
+++ b/tools/objlink.c	Thu May 31 13:04:25 2018 +0300
@@ -514,35 +514,35 @@
 
 int dmLoadPRG(const char *filename, BOOL forceAddr, const int destAddr)
 {
-    int dataSize, loadAddr, endAddr;
     FILE *fh;
+    int dataSize, loadAddr, endAddr, res = DMERR_OK;
     Uint16 tmpAddr;
 
     // Open the input file
     if ((fh = fopen(filename, "rb")) == NULL)
     {
-        int err = dmGetErrno();
+        res = dmGetErrno();
         dmErrorMsg("Error opening input file '%s' #%d: %s.\n",
-            filename, err, dmErrorStr(err));
-        return 1;
+            filename, res, dmErrorStr(res));
+        goto out;
     }
 
     // Get filesize
     if ((dataSize = dmGetFileSize(fh) - 2) < 0)
     {
-        int err = dmGetErrno();
+        res = dmGetErrno();
         dmErrorMsg("Error getting file size for '%s' #%d: %s.\n",
-            filename, err, dmErrorStr(err));
-        return 6;
+            filename, res, dmErrorStr(res));
+        goto out;
     }
 
     // Get loading address
     if (!dm_fread_le16(fh, &tmpAddr))
     {
-        int err = dmGetErrno();
+        res = dmGetErrno();
         dmErrorMsg("Error reading input file '%s' #%d: %s.\n",
-            filename, err, dmErrorStr(err));
-        return 2;
+            filename, res, dmErrorStr(res));
+        goto out;
     }
 
     // Show information
@@ -554,17 +554,18 @@
 
     if (endAddr >= memModel->size)
     {
+        res = DMERR_BOUNDS;
         dmPrint(1, " .. Does not fit into the memory!\n");
-        return 5;
+        goto out;
     }
 
     // Load data
     if (fread(&memory[loadAddr], dataSize, 1, fh) < 1)
     {
-        int err = dmGetErrno();
+        res = dmGetErrno();
         dmPrint(1, " .. Error #%d: %s.\n",
-            err, dmErrorStr(err));
-        return 4;
+            res, dmErrorStr(res));
+        goto out;
     }
 
     dmPrint(1, " .. OK\n");
@@ -572,29 +573,34 @@
     // Add to list of blocks
     reserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES);
 
-    return 0;
+out:
+    if (fh != NULL)
+        fclose(fh);
+
+    return res;
 }
 
 
 int dmLoadRAW(const char *filename, const int destAddr)
 {
-    int dataSize, endAddr;
     FILE *fh;
+    int dataSize, endAddr, res = DMERR_OK;
 
     // Open the input file
     if ((fh = fopen(filename, "rb")) == NULL)
     {
-        int err = dmGetErrno();
+        res = dmGetErrno();
         dmErrorMsg("Error opening input file '%s' #%d: %s.\n",
-            filename, err, dmErrorStr(err));
-        return 1;
+            filename, res, dmErrorStr(res));
+        goto out;
     }
 
     // Get filesize
     if ((dataSize = dmGetFileSize(fh)) < 0)
     {
-        dmErrorMsg("Error getting file size for '%s'.\n", filename);
-        return 6;
+        res = dmError(DMERR_FREAD,
+            "Error getting file size for '%s'.\n", filename);
+        goto out;
     }
 
     // Show information
@@ -604,17 +610,18 @@
 
     if (endAddr >= memModel->size)
     {
+        res = DMERR_BOUNDS;
         dmPrint(1, " .. Does not fit into the memory!\n");
-        return 5;
+        goto out;
     }
 
     // Load data
     if (fread(&memory[destAddr], dataSize, 1, fh) < 1)
     {
-        int err = dmGetErrno();
-        dmPrint(1, " .. Error #%d: %s.\n",
-            err, dmErrorStr(err));
-        return 4;
+        res = dmGetErrno();
+        dmPrint(1, " .. Error reading data #%d: %s.\n",
+            res, dmErrorStr(res));
+        goto out;
     }
 
     dmPrint(1, " .. OK\n");
@@ -622,7 +629,11 @@
     // Add info to list
     reserveMemBlock(destAddr, endAddr, filename, MTYPE_RES);
 
-    return 0;
+out:
+    if (fh != NULL)
+        fclose(fh);
+
+    return res;
 }