]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/qemu-xen-traditional.git/commitdiff
block-vvfat: fix fat_chksum() buffer overrun warning
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 4 Nov 2014 11:54:11 +0000 (11:54 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 16 Oct 2015 15:52:06 +0000 (16:52 +0100)
Newer GCC versions raise an undefined behaviour warning in
fat_chksum() because it overruns the name buffer.  However, this is
intentional behaviour because the extension array immediately follows.

Refactor this function to avoid the warning and make it clear it's
checksumming both parts.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Coverity-ID: 1055738

block-vvfat.c

index 9eb676bea35303b2672d02e516daed2e9311c8ba..345d7be4073249a8aaf668b5e9999af44aa5375a 100644 (file)
@@ -504,14 +504,21 @@ static void set_begin_of_direntry(direntry_t* direntry, uint32_t begin)
 
 /* fat functions */
 
+static inline void fat_chksum_part(const char *name, size_t len, uint8_t *chksum)
+{
+    size_t i;
+
+    for(i = 0; i < len; i++)
+       *chksum = (((*chksum&0xfe) >> 1) | ((*chksum & 0x01) ? 0x80 : 0))
+           + (unsigned char)name[i];
+}
+
 static inline uint8_t fat_chksum(const direntry_t* entry)
 {
     uint8_t chksum=0;
-    int i;
 
-    for(i=0;i<11;i++)
-       chksum=(((chksum&0xfe)>>1)|((chksum&0x01)?0x80:0))
-           +(unsigned char)entry->name[i];
+    fat_chksum_part(entry->name, ARRAY_SIZE(entry->name), &chksum);
+    fat_chksum_part(entry->extension, ARRAY_SIZE(entry->extension), &chksum);
 
     return chksum;
 }