From 6bb21700abb61cdb62a3d9fdf417971d528d5a37 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Wed, 18 Jan 2017 11:40:06 +0000 Subject: Stop the (optional) dialong control data from being aligned when parsing/writing windows resource files. binutils* resbin.c: Optional dialog control data immediately follow the control description without alignment. * testsuite/binutils-all/windres/controldata.rc: New test. source. * testsuite/binutils-all/windres/controldata.rsd: New test. --- binutils/ChangeLog | 8 ++++++++ binutils/resbin.c | 7 ++----- binutils/testsuite/binutils-all/windres/controldata.rc | 6 ++++++ .../testsuite/binutils-all/windres/controldata.rsd | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 binutils/testsuite/binutils-all/windres/controldata.rc create mode 100644 binutils/testsuite/binutils-all/windres/controldata.rsd (limited to 'binutils') diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 16e9c60..4c89edc 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2017-01-17 Dmitry Timoshkov + + * resbin.c: Optional dialog control data immediately follows + the control description without alignment. + * testsuite/binutils-all/windres/controldata.rc: New test. + source. + * testsuite/binutils-all/windres/controldata.rsd: New test. + 2017-01-12 Nick Clifton PR binutils/20876 diff --git a/binutils/resbin.c b/binutils/resbin.c index f836a5a..07bce49 100644 --- a/binutils/resbin.c +++ b/binutils/resbin.c @@ -574,8 +574,6 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length dc->data = NULL; else { - off = (off + 3) &~ 3; - if (length < off + datalen) toosmall (_("dialog control data")); @@ -1582,7 +1580,6 @@ res_to_bin_dialog (windres_bfd *wrbfd, rc_uint_type off, const rc_dialog *dialog { rc_uint_type saved_off = off; rc_uint_type old_off; - off += (4 - ((off - off_delta) & 3)) & 3; old_off = off; off = res_to_bin_rcdata (wrbfd, off, dc->data); @@ -1590,10 +1587,10 @@ res_to_bin_dialog (windres_bfd *wrbfd, rc_uint_type off, const rc_dialog *dialog old_off = off = saved_off; if (wrbfd) windres_put_16 (wrbfd, dc_rclen, off - old_off); - } + } if (wrbfd) set_windres_bfd_content (wrbfd, dc_rclen, marker, 2); - } + } if (wrbfd) { diff --git a/binutils/testsuite/binutils-all/windres/controldata.rc b/binutils/testsuite/binutils-all/windres/controldata.rc new file mode 100644 index 0000000..67b8df2 --- /dev/null +++ b/binutils/testsuite/binutils-all/windres/controldata.rc @@ -0,0 +1,6 @@ +1 DIALOGEX DISCARDABLE 0, 0, 200, 150 +STYLE 0 +BEGIN + CONTROL "evenlengthtext", -1, "TESTCONTROL", 0x50810000, 10,10,100,50 { 1,2,3,4,5 } + CONTROL "oddlengthtext", -1, "TESTCONTROL", 0x50810000, 10,60,100,50 { 1,2,3,4,5 } +END diff --git a/binutils/testsuite/binutils-all/windres/controldata.rsd b/binutils/testsuite/binutils-all/windres/controldata.rsd new file mode 100644 index 0000000..1357e05 --- /dev/null +++ b/binutils/testsuite/binutils-all/windres/controldata.rsd @@ -0,0 +1,18 @@ + 0000 00000000 20000000 ffff0000 ffff0000 .... ........... + 0010 00000000 00000000 00000000 00000000 ................ + 0020 d4000000 20000000 ffff0500 ffff0100 .... ........... + 0030 00000000 30100904 00000000 00000000 ....0........... + 0040 0100ffff 00000000 00000000 00000000 ................ + 0050 02000000 0000c800 96000000 00000000 ................ + 0060 00000000 00000000 00008150 0a000a00 ...........P.... + 0070 64003200 ffffffff 54004500 53005400 d.2.....T.E.S.T. + 0080 43004f00 4e005400 52004f00 4c000000 C.O.N.T.R.O.L... + 0090 65007600 65006e00 6c006500 6e006700 e.v.e.n.l.e.n.g. + 00a0 74006800 74006500 78007400 00000a00 t.h.t.e.x.t..... + 00b0 01000200 03000400 05000000 00000000 ................ + 00c0 00000000 00008150 0a003c00 64003200 .......P..<.d.2. + 00d0 ffffffff 54004500 53005400 43004f00 ....T.E.S.T.C.O. + 00e0 4e005400 52004f00 4c000000 6f006400 N.T.R.O.L...o.d. + 00f0 64006c00 65006e00 67007400 68007400 d.l.e.n.g.t.h.t. + 0100 65007800 74000000 0a000100 02000300 e.x.t........... + 0110 04000500 .... -- cgit v1.1