From fb98f7b7824bd394d64f56e6aa05436f8c1a7c6c Mon Sep 17 00:00:00 2001
From: Kai Tietz <kai.tietz@onevision.com>
Date: Wed, 28 Nov 2012 15:53:37 +0000
Subject:         * resbin.c (bin_to_res_version):  Correct offset         and
 length calculation of resource.         (get_version_header): Apply
 alignement of 4 to len.

---
 binutils/resbin.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

(limited to 'binutils/resbin.c')

diff --git a/binutils/resbin.c b/binutils/resbin.c
index b5dcd9b5f2c..548ff38a6c8 100644
--- a/binutils/resbin.c
+++ b/binutils/resbin.c
@@ -909,7 +909,7 @@ get_version_header (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
   if (length < 8)
     toosmall (key);
 
-  *len = windres_get_16 (wrbfd, data, 2);
+  *len = (windres_get_16 (wrbfd, data, 2) + 3) & ~3;
   *vallen = windres_get_16 (wrbfd, data + 2, 2);
   *type = windres_get_16 (wrbfd, data + 4, 2);
 
@@ -1041,10 +1041,7 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
 	  data += off;
 	  length -= off;
 
-	  /* It's convenient to round verlen to a 4 byte alignment,
-             since we round the subvariables in the loop.  */
-
-	  verlen = (verlen + 3) &~ 3;
+	  verlen -= off;
 
 	  vi->u.string.stringtables = NULL;
 	  ppvst = &vi->u.string.stringtables;
@@ -1070,7 +1067,7 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
 	      length -= off;
 	      verlen -= off;
 
-	  stverlen = (stverlen + 3) &~ 3;
+	  stverlen -= off;
  
 	  vst->strings = NULL;
 	  ppvs = &vst->strings;
@@ -1088,14 +1085,12 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
 	      get_version_header (wrbfd, data, length, (const char *) NULL,
 				  &vs->key, &sverlen, &vallen, &type, &off);
 
-	      sverlen = (sverlen + 3) &~ 3;
-
 	      data += off;
 	      length -= off;
 
 	      vs->value = get_unicode (wrbfd, data, length, &vslen);
 	      valoff = vslen * 2 + 2;
-	      valoff = (valoff + 3) &~ 3;
+	      valoff = (valoff + 3) & ~3;
 
 	      if (off + valoff != sverlen)
 		fatal (_("unexpected version string length %ld != %ld + %ld"),
@@ -1108,6 +1103,7 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
 		fatal (_("unexpected version string length %ld < %ld"),
 		       (long) verlen, (long) sverlen);
 	      stverlen -= sverlen;
+	      verlen -= sverlen;
 
 	      vs->next = NULL;
 	      *ppvs = vs;
-- 
cgit v1.2.1