gdb/
[binutils-gdb.git] / binutils / resres.c
index 8b75bcf59422cfe317e39b6a2da2c4b138809217..9f90df0a506919d52b12f79da107d0563eae7a51 100644 (file)
@@ -1,5 +1,5 @@
 /* resres.c: read_res_file and write_res_file implementation for windres.
 /* resres.c: read_res_file and write_res_file implementation for windres.
-   Copyright 1998, 1999, 2001, 2002, 2007
+   Copyright 1998, 1999, 2001, 2002, 2005, 2007, 2008
    Free Software Foundation, Inc.
    Written by Anders Norlander <anorland@hem2.passagen.se>.
    Rewritten by Kai Tietz, Onevision.
    Free Software Foundation, Inc.
    Written by Anders Norlander <anorland@hem2.passagen.se>.
    Rewritten by Kai Tietz, Onevision.
@@ -8,7 +8,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -128,13 +128,11 @@ write_res_file (const char *fn,const rc_res_directory *resdir)
   filename = fn;
 
   abfd = windres_open_as_binary (filename, 0);
   filename = fn;
 
   abfd = windres_open_as_binary (filename, 0);
-  sec = bfd_make_section (abfd, ".data");
+  sec = bfd_make_section_with_flags (abfd, ".data",
+                                    (SEC_HAS_CONTENTS | SEC_ALLOC
+                                     | SEC_LOAD | SEC_DATA));
   if (sec == NULL)
     bfd_fatal ("bfd_make_section");
   if (sec == NULL)
     bfd_fatal ("bfd_make_section");
-  if (! bfd_set_section_flags (abfd, sec,
-                              (SEC_HAS_CONTENTS | SEC_ALLOC
-                               | SEC_LOAD | SEC_DATA)))
-    bfd_fatal ("bfd_set_section_flags");
   /* Requiring this is probably a bug in BFD.  */
   sec->output_section = sec;
 
   /* Requiring this is probably a bug in BFD.  */
   sec->output_section = sec;
 
@@ -157,8 +155,8 @@ write_res_file (const char *fn,const rc_res_directory *resdir)
                                          (const rc_res_id *) NULL,
                                          &language, 1);
   if (sec_length != sec_length_wrote)
                                          (const rc_res_id *) NULL,
                                          &language, 1);
   if (sec_length != sec_length_wrote)
-    fatal ("res write failed with different sizes (%lu/%lu).", (long) sec_length,
-          (long) sec_length_wrote);
+    fatal ("res write failed with different sizes (%lu/%lu).",
+          (unsigned long) sec_length, (unsigned long) sec_length_wrote);
 
   bfd_close (abfd);
   return;
 
   bfd_close (abfd);
   return;
@@ -554,10 +552,12 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
   rc_uint_type l;
   rc_uint_type soff = off[0];
 
   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. */
   l = ((soff - off[0]) / sizeof (unichar));
 
   /* there are hardly any names longer than 256 characters, but anyway. */
@@ -592,8 +592,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 + 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;
 }
 
   return 1;
 }
 
@@ -644,7 +647,7 @@ res_add_resource (rc_res_resource *r, const rc_res_id *type, const rc_res_id *id
    and modified to add an existing resource.
  */
 static void
    and modified to add an existing resource.
  */
 static void
-res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
+res_append_resource (rc_res_directory **res_dirs, rc_res_resource *resource,
                     int cids, const rc_res_id *ids, int dupok)
 {
   rc_res_entry *re = NULL;
                     int cids, const rc_res_id *ids, int dupok)
 {
   rc_res_entry *re = NULL;
@@ -655,7 +658,7 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
     {
       rc_res_entry **pp;
 
     {
       rc_res_entry **pp;
 
-      if (*resources == NULL)
+      if (*res_dirs == NULL)
        {
          static unsigned long timeval;
 
        {
          static unsigned long timeval;
 
@@ -664,16 +667,16 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
          if (timeval == 0)
            timeval = time (NULL);
 
          if (timeval == 0)
            timeval = time (NULL);
 
-         *resources = ((rc_res_directory *)
+         *res_dirs = ((rc_res_directory *)
                        res_alloc (sizeof (rc_res_directory)));
                        res_alloc (sizeof (rc_res_directory)));
-         (*resources)->characteristics = 0;
-         (*resources)->time = timeval;
-         (*resources)->major = 0;
-         (*resources)->minor = 0;
-         (*resources)->entries = NULL;
+         (*res_dirs)->characteristics = 0;
+         (*res_dirs)->time = timeval;
+         (*res_dirs)->major = 0;
+         (*res_dirs)->minor = 0;
+         (*res_dirs)->entries = NULL;
        }
 
        }
 
-      for (pp = &(*resources)->entries; *pp != NULL; pp = &(*pp)->next)
+      for (pp = &(*res_dirs)->entries; *pp != NULL; pp = &(*pp)->next)
        if (res_id_cmp ((*pp)->id, ids[i]) == 0)
          break;
 
        if (res_id_cmp ((*pp)->id, ids[i]) == 0)
          break;
 
@@ -708,7 +711,7 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
              xexit (1);
            }
 
              xexit (1);
            }
 
-         resources = &re->u.dir;
+         res_dirs = &re->u.dir;
        }
     }
 
        }
     }