forked from pool/ipmitool
576167f497
Copy from systemsmanagement:wbem/ipmitool based on submit request 34171 from user coolo OBS-URL: https://build.opensuse.org/request/show/34171 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/ipmitool?expand=0&rev=10
169 lines
4.1 KiB
Diff
169 lines
4.1 KiB
Diff
Increase possible file size for FW upgrades and avoid segfaults if still too big
|
|
|
|
Also close a file descriptor which gets opened, but never closed, compare with:
|
|
https://bugzilla.novell.com/show_bug.cgi?id=534909
|
|
|
|
Signed-off-by: Thomas Renninger <trenn@suse.de>
|
|
|
|
---
|
|
lib/ipmi_fwum.c | 86 ++++++++++++++++++++++++++++++--------------------------
|
|
1 file changed, 47 insertions(+), 39 deletions(-)
|
|
|
|
Index: ipmitool-1.8.11/lib/ipmi_fwum.c
|
|
===================================================================
|
|
--- ipmitool-1.8.11.orig/lib/ipmi_fwum.c
|
|
+++ ipmitool-1.8.11/lib/ipmi_fwum.c
|
|
@@ -141,7 +141,8 @@ typedef struct sKFWUM_SaveFirmwareInfo
|
|
|
|
extern int verbose;
|
|
static unsigned char fileName[512];
|
|
-static unsigned char firmBuf[1024*512];
|
|
+#define MAX_FW_FILE_SIZE 1024*512
|
|
+static unsigned char firmBuf[MAX_FW_FILE_SIZE];
|
|
static tKFWUM_SaveFirmwareInfo saveFirmwareInfo;
|
|
|
|
static void KfwumOutputHelp(void);
|
|
@@ -508,6 +509,12 @@ static tKFWUM_Status KfwumSetupBuffersFr
|
|
tKFWUM_Status status = KFWUM_STATUS_OK;
|
|
FILE * pFileHandle;
|
|
|
|
+ if(fileSize >= MAX_FW_FILE_SIZE)
|
|
+ {
|
|
+ printf("Error: Firmware file size exceeds %dK\n", MAX_FW_FILE_SIZE / 1024);
|
|
+ return KFWUM_STATUS_ERROR;
|
|
+ }
|
|
+
|
|
pFileHandle = fopen((const char *)pFileName, "rb");
|
|
|
|
if(pFileHandle)
|
|
@@ -538,6 +545,7 @@ static tKFWUM_Status KfwumSetupBuffersFr
|
|
{
|
|
KfwumShowProgress((const unsigned char *)"Reading Firmware from File", 100, 100);
|
|
}
|
|
+ fclose(pFileHandle);
|
|
}
|
|
return(status);
|
|
}
|
|
@@ -986,9 +994,9 @@ static tKFWUM_Status KfwumManualRollback
|
|
return status;
|
|
}
|
|
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(1)
|
|
-#endif
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(1)
|
|
+#endif
|
|
struct KfwumStartFirmwareDownloadReq{
|
|
unsigned char lengthLSB;
|
|
unsigned char lengthMid;
|
|
@@ -996,20 +1004,20 @@ struct KfwumStartFirmwareDownloadReq{
|
|
unsigned char paddingLSB;
|
|
unsigned char paddingMSB;
|
|
unsigned char useSequence;
|
|
-} ATTRIBUTE_PACKING;
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(0)
|
|
-#endif
|
|
-
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(1)
|
|
-#endif
|
|
+} ATTRIBUTE_PACKING;
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(0)
|
|
+#endif
|
|
+
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(1)
|
|
+#endif
|
|
struct KfwumStartFirmwareDownloadResp {
|
|
unsigned char bank;
|
|
-} ATTRIBUTE_PACKING;
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(0)
|
|
-#endif
|
|
+} ATTRIBUTE_PACKING;
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(0)
|
|
+#endif
|
|
|
|
static tKFWUM_Status KfwumStartFirmwareImage(struct ipmi_intf * intf,
|
|
unsigned long length,unsigned short padding)
|
|
@@ -1065,9 +1073,9 @@ static tKFWUM_Status KfwumStartFirmwareI
|
|
return status;
|
|
}
|
|
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(1)
|
|
-#endif
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(1)
|
|
+#endif
|
|
struct KfwumSaveFirmwareAddressReq
|
|
{
|
|
unsigned char addressLSB;
|
|
@@ -1075,22 +1083,22 @@ struct KfwumSaveFirmwareAddressReq
|
|
unsigned char addressMSB;
|
|
unsigned char numBytes;
|
|
unsigned char txBuf[KFWUM_SMALL_BUFFER-KFWUM_OLD_CMD_OVERHEAD];
|
|
-} ATTRIBUTE_PACKING;
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(0)
|
|
-#endif
|
|
-
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(1)
|
|
-#endif
|
|
+} ATTRIBUTE_PACKING;
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(0)
|
|
+#endif
|
|
+
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(1)
|
|
+#endif
|
|
struct KfwumSaveFirmwareSequenceReq
|
|
{
|
|
unsigned char sequenceNumber;
|
|
unsigned char txBuf[KFWUM_BIG_BUFFER];
|
|
-} ATTRIBUTE_PACKING;
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(0)
|
|
-#endif
|
|
+} ATTRIBUTE_PACKING;
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(0)
|
|
+#endif
|
|
|
|
|
|
#define FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT ((unsigned char)6)
|
|
@@ -1234,19 +1242,19 @@ static tKFWUM_Status KfwumSaveFirmwareIm
|
|
return status;
|
|
}
|
|
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(1)
|
|
-#endif
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(1)
|
|
+#endif
|
|
struct KfwumFinishFirmwareDownloadReq{
|
|
unsigned char versionMaj;
|
|
unsigned char versionMinSub;
|
|
unsigned char versionSdr;
|
|
unsigned char reserved;
|
|
-} ATTRIBUTE_PACKING;
|
|
-#ifdef PRAGMA_PACK
|
|
-#pramga pack(0)
|
|
-#endif
|
|
-
|
|
+} ATTRIBUTE_PACKING;
|
|
+#ifdef PRAGMA_PACK
|
|
+#pramga pack(0)
|
|
+#endif
|
|
+
|
|
static tKFWUM_Status KfwumFinishFirmwareImage(struct ipmi_intf * intf,
|
|
tKFWUM_InFirmwareInfo firmInfo)
|
|
{
|