]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/hfsplus.c: Make parent unsigned.
authorDave Vasilevsky <dave@vasilevsky.ca>
Mon, 3 Jan 2011 14:30:41 +0000 (15:30 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 3 Jan 2011 14:30:41 +0000 (15:30 +0100)
(grub_hfsplus_cmp_catkey): Don't compare using subtraction, it
overflows.
(grub_hfsplus_cmp_extkey): Likewise

ChangeLog
grub-core/fs/hfsplus.c

index f7b08c1e61fa976a2b39297a01c0136d2ae08b2a..d89cb861806133e4951531886729d5e3d209d3b4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-01-03  Dave Vasilevsky <dave@vasilevsky.ca>
+
+       * grub-core/fs/hfsplus.c: Make parent unsigned.
+       (grub_hfsplus_cmp_catkey): Don't compare using subtraction, it
+       overflows.
+       (grub_hfsplus_cmp_extkey): Likewise
+
 2011-01-03  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * util/grub-install.in: Correctly use bootloader_id and not
index bcb8e9584a30ba37c8e86133c539dca47a88cadb..7d7115ce36efac468601febc69ce777545d6b984 100644 (file)
@@ -178,7 +178,7 @@ enum grub_hfsplus_filetype
 /* Internal representation of a catalog key.  */
 struct grub_hfsplus_catkey_internal
 {
-  int parent;
+  grub_uint32_t parent;
   char *name;
 };
 
@@ -520,9 +520,12 @@ grub_hfsplus_cmp_catkey (struct grub_hfsplus_key *keya,
   int i;
   int diff;
 
-  diff = grub_be_to_cpu32 (catkey_a->parent) - catkey_b->parent;
-  if (diff)
-    return diff;
+  /* Safe unsigned comparison */
+  grub_uint32_t aparent = grub_be_to_cpu32 (catkey_a->parent);
+  if (aparent > catkey_b->parent)
+    return 1;
+  if (aparent < catkey_b->parent)
+    return -1;
 
   /* Change the filename in keya so the endianness is correct.  */
   for (i = 0; i < grub_be_to_cpu16 (catkey_a->namelen); i++)
@@ -555,15 +558,21 @@ grub_hfsplus_cmp_extkey (struct grub_hfsplus_key *keya,
 {
   struct grub_hfsplus_extkey *extkey_a = &keya->extkey;
   struct grub_hfsplus_extkey_internal *extkey_b = &keyb->extkey;
-  int diff;
-
-  diff = grub_be_to_cpu32 (extkey_a->fileid) - extkey_b->fileid;
-
-  if (diff)
-    return diff;
-
-  diff = grub_be_to_cpu32 (extkey_a->start) - extkey_b->start;
-  return diff;
+  grub_uint32_t akey;
+
+  /* Safe unsigned comparison */
+  akey = grub_be_to_cpu32 (extkey_a->fileid);
+  if (akey > extkey_b->fileid)
+    return 1;
+  if (akey < extkey_b->fileid)
+    return -1;
+  
+  akey = grub_be_to_cpu32 (extkey_a->start);
+  if (akey > extkey_b->start)
+    return 1;
+  if (akey < extkey_b->start)
+    return -1;
+  return 0;
 }
 
 static char *