From 4fc874242f8f1bf17cf6e65b159dd804e793e6cd Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 7 Mar 2016 17:29:25 +0000 Subject: [PATCH] Allow zero length archive elements. bfd PR binutils/19775 * archive.c (bfd_generic_openr_next_archived_file): Allow zero length elements in the archive. binutils PR binutils/19775 * testsuite/binutils-all/ar.exp (proc empty_archive): New proc. Run the new proc. * testsuite/binutils-all/empty: New, empty, file. --- bfd/ChangeLog | 6 ++++ bfd/archive.c | 2 +- binutils/ChangeLog | 7 +++++ binutils/testsuite/binutils-all/ar.exp | 40 ++++++++++++++++++++++++++ binutils/testsuite/binutils-all/empty | 0 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 binutils/testsuite/binutils-all/empty diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d9d9e77df2e..8c2da68af34 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-03-07 Nick Clifton + + PR binutils/19775 + * archive.c (bfd_generic_openr_next_archived_file): Allow zero + length elements in the archive. + 2016-03-07 Jiong Wang * elfnn-aarch64.c (elfNN_aarch64_check_relocs): Always create .got diff --git a/bfd/archive.c b/bfd/archive.c index 68c18bff6a2..53e295eb26c 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -802,7 +802,7 @@ bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file) Note that last_file->origin can be odd in the case of BSD-4.4-style element with a long odd size. */ filestart += filestart % 2; - if (filestart <= last_file->proxy_origin) + if (filestart < last_file->proxy_origin) { /* Prevent looping. See PR19256. */ bfd_set_error (bfd_error_malformed_archive); diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 7ba4aecfc4e..918299a1298 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2016-03-07 Nick Clifton + + PR binutils/19775 + * testsuite/binutils-all/ar.exp (proc empty_archive): New proc. + Run the new proc. + * testsuite/binutils-all/empty: New, empty, file. + 2016-03-04 Matthew Wahab * readelf.c (arm_attry_tag_FP_arch): Add "NEON for ARMv8.1". diff --git a/binutils/testsuite/binutils-all/ar.exp b/binutils/testsuite/binutils-all/ar.exp index 508ae9c1d75..45be9b1b594 100644 --- a/binutils/testsuite/binutils-all/ar.exp +++ b/binutils/testsuite/binutils-all/ar.exp @@ -555,6 +555,45 @@ proc move_an_element { } { pass $testname } +# PR 19775: Test creating and listing archives with an empty element. + +proc empty_archive { } { + global AR + global srcdir + global subdir + + set testname "archive with empty element" + + # FIXME: There ought to be a way to dynamically create an empty file. + set empty $srcdir/$subdir/empty + + if [is_remote host] { + set archive artest.a + set objfile [remote_download host $empty] + remote_file host delete $archive + } else { + set archive tmpdir/artest.a + set objfile $empty + } + + remote_file build delete tmpdir/artest.a + + set got [binutils_run $AR "-r -c $archive ${objfile}"] + if ![string match "" $got] { + fail $testname + return + } + + # This commmand used to fail with: "Malformed archive". + set got [binutils_run $AR "-t $archive"] + if ![string match "empty " $got] { + fail $testname + return + } + + pass $testname +} + # Run the tests. # Only run the bfdtest checks if the programs exist. Since these @@ -574,6 +613,7 @@ argument_parsing deterministic_archive delete_an_element move_an_element +empty_archive if { [is_elf_format] && ![istarget "*-*-hpux*"] diff --git a/binutils/testsuite/binutils-all/empty b/binutils/testsuite/binutils-all/empty new file mode 100644 index 00000000000..e69de29bb2d -- 2.30.2