chain.c32: fix test for partition types which can be hidden syslinux-3.71-pre11
authorSergey Vlasov <vsu@altlinux.ru>
Wed, 16 Jul 2008 11:13:21 +0000 (15:13 +0400)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 16 Jul 2008 15:27:41 +0000 (08:27 -0700)
The result of shift in C is undefined if the shift count is greater
than the width of type.  On x86 the corresponding CPU instruction
masks the shift count with 0x1f, therefore (mask >> (t & ~0x10)) & 1)
gives false positives for types greater than 0x1f (e.g., the partition
type 0x8e (Linux LVM) could be "hidden" to 0x9e).

Signed-off-by: Sergey Vlasov <vsu@altlinux.ru>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
com32/modules/chain.c

index 9ca118c..2f79aaf 100644 (file)
@@ -626,7 +626,7 @@ static int hide_unhide(char *mbr, int part)
   for (i = 1; i <= 4; i++) {
     pt = (struct part_entry *)&mbr[0x1be + 16*(i-1)];
     t = pt->ostype;
-    if ((mask >> (t & ~0x10)) & 1) {
+    if ((t <= 0x1f) && ((mask >> (t & ~0x10)) & 1)) {
       /* It's a hideable partition type */
       if (i == part)
        t &= ~0x10;     /* unhide */