# HG changeset patch # User Matti Hamalainen # Date 1527761065 -10800 # Node ID bc5a75888fa9026f1bd47b5b6f88fc102b5500ea # Parent 0f256e7340a3200f5edf68fe9a9bc6db2c79dea9 Improve error handling and plug filehandle leaks. diff -r 0f256e7340a3 -r bc5a75888fa9 tools/objlink.c --- 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; }