* resres.c (probe_binary): Fix test for badly formatted headers.
authorNick Clifton <nickc@redhat.com>
Mon, 18 Jun 2007 16:02:45 +0000 (16:02 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 18 Jun 2007 16:02:45 +0000 (16:02 +0000)
binutils/ChangeLog
binutils/resres.c

index 1d9a542..f65bebb 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-18  Thomas Weidenmueller  <w3seek@reactos.org>
+
+       * resres.c (probe_binary): Fix test for badly formatted headers.
+
 2007-06-18  Kai Tietz  <Kai.Tietz@onevision.com>
 
        * rclex.c: (cpp_line): Add code_page pragma support.
index 8b75bcf..f345da3 100644 (file)
@@ -554,10 +554,12 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
   rc_uint_type l;
   rc_uint_type soff = off[0];
 
-  do {
-    read_res_data (wrbfd, &soff, omax, d, sizeof (unichar));
-    c = windres_get_16 (wrbfd, d, 2);
-  } while (c != 0);
+  do
+    {
+      read_res_data (wrbfd, &soff, omax, d, sizeof (unichar));
+      c = windres_get_16 (wrbfd, d, 2);
+    }
+  while (c != 0);
   l = ((soff - off[0]) / sizeof (unichar));
 
   /* there are hardly any names longer than 256 characters, but anyway. */
@@ -592,8 +594,11 @@ probe_binary (windres_bfd *wrbfd, rc_uint_type omax)
   if ((off + BIN_RES_HDR_SIZE) >= omax)
     return 1;
   read_res_data_hdr (wrbfd, &off, omax, &reshdr);
-  if ((off + reshdr.data_size + reshdr.header_size) > omax)
-      return 0;
+  /* off is advanced by BIN_RES_HDR_SIZE in read_res_data_hdr()
+     which is part of reshdr.header_size. We shouldn't take it
+     into account twice.  */
+  if ((off - BIN_RES_HDR_SIZE + reshdr.data_size + reshdr.header_size) > omax)
+    return 0;
   return 1;
 }