*** empty log message ***
[platform/upstream/binutils.git] / binutils / resres.c
index 8b75bcf..ff95cb5 100644 (file)
@@ -1,5 +1,5 @@
 /* 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, 2011
    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
-   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,
@@ -98,7 +98,7 @@ read_res_file (const char *fn)
   off = 0;
 
   if (! probe_binary (&wrbfd, flen))
-    set_windres_bfd_endianess (&wrbfd, ! target_is_bigendian);
+    set_windres_bfd_endianness (&wrbfd, ! target_is_bigendian);
 
   skip_null_resource (&wrbfd, &off, flen);
 
@@ -128,13 +128,11 @@ write_res_file (const char *fn,const rc_res_directory *resdir)
   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 (! 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;
 
@@ -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)
-    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;
@@ -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];
 
-  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 +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 + 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;
 }
 
@@ -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
-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;
@@ -655,7 +658,7 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
     {
       rc_res_entry **pp;
 
-      if (*resources == NULL)
+      if (*res_dirs == NULL)
        {
          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);
 
-         *resources = ((rc_res_directory *)
+         *res_dirs = ((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;
 
@@ -708,7 +711,7 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource,
              xexit (1);
            }
 
-         resources = &re->u.dir;
+         res_dirs = &re->u.dir;
        }
     }