X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fresres.c;h=161ea354fec9cea0c80d1b8f21e42c642431f9c2;hb=1296bc99b1bf5da38be18ac1fdf6ad8d1b697e6b;hp=8b75bcf59422cfe317e39b6a2da2c4b138809217;hpb=4a594fce16683232bbb2e239d3e3ebcfcde16d1a;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/resres.c b/binutils/resres.c index 8b75bcf594..161ea354fe 100644 --- a/binutils/resres.c +++ b/binutils/resres.c @@ -1,6 +1,5 @@ /* resres.c: read_res_file and write_res_file implementation for windres. - Copyright 1998, 1999, 2001, 2002, 2007 - Free Software Foundation, Inc. + Copyright (C) 1998-2019 Free Software Foundation, Inc. Written by Anders Norlander . Rewritten by Kai Tietz, Onevision. @@ -8,7 +7,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, @@ -32,7 +31,6 @@ #include "windres.h" #include -#include static rc_uint_type write_res_directory (windres_bfd *, rc_uint_type, const rc_res_directory *, const rc_res_id *, @@ -98,7 +96,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 +126,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; @@ -146,7 +142,7 @@ write_res_file (const char *fn,const rc_res_directory *resdir) sec_length = write_res_directory ((windres_bfd *) NULL, 0x20UL, resdir, (const rc_res_id *) NULL, (const rc_res_id *) NULL, &language, 1); - if (! bfd_set_section_size (abfd, sec, (sec_length + 3) & ~3)) + if (!bfd_set_section_size (sec, (sec_length + 3) & ~3)) bfd_fatal ("bfd_set_section_size"); if ((sec_length & 3) != 0) set_windres_bfd_content (&wrbfd, sign, sec_length, 4-(sec_length & 3)); @@ -157,8 +153,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; @@ -390,8 +386,7 @@ write_res_bin (windres_bfd *wrbfd, rc_uint_type off, const rc_res_resource *res, /* Get number of bytes needed to store an id in binary format */ static unsigned long -get_id_size (id) - const rc_res_id *id; +get_id_size (const rc_res_id *id) { if (id->named) return sizeof (unichar) * (id->u.n.length + 1); @@ -503,7 +498,7 @@ write_res_info (windres_bfd *wrbfd, rc_uint_type off, const rc_res_res_info *inf if (wrbfd) { struct bin_res_info l; - + windres_put_32 (wrbfd, l.version, info->version); windres_put_16 (wrbfd, l.memflags, info->memflags); windres_put_16 (wrbfd, l.language, info->language); @@ -554,10 +549,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 +589,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 +644,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,25 +655,21 @@ 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; - - /* Use the same timestamp for every resource created in a - single run. */ - 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; + /* Using a real timestamp only serves to create non-deterministic + results. Use zero instead. */ + (*res_dirs)->time = 0; + (*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 +704,7 @@ res_append_resource (rc_res_directory **resources, rc_res_resource *resource, xexit (1); } - resources = &re->u.dir; + res_dirs = &re->u.dir; } }