| diff -uNr cpio-2.11.ORIG/src/copyin.c cpio-2.11/src/copyin.c |
| --- cpio-2.11.ORIG/src/copyin.c 2015-01-09 11:31:49.017090090 +0000 |
| +++ cpio-2.11/src/copyin.c 2015-01-09 11:35:37.723092293 +0000 |
| @@ -124,10 +124,30 @@ |
| if (pad != 0) |
| tape_toss_input (in_file_des, pad); |
| } |
| - |
| + |
| +static char * |
| +get_link_name (struct cpio_file_stat *file_hdr, int in_file_des) |
| +{ |
| + char *link_name; |
| + |
| + if (file_hdr->c_filesize < 0 || file_hdr->c_filesize > SIZE_MAX-1) |
| + { |
| + error (0, 0, _("%s: stored filename length is out of range"), |
| + file_hdr->c_name); |
| + link_name = NULL; |
| + } |
| + else |
| + { |
| + link_name = xmalloc (file_hdr->c_filesize + 1); |
| + tape_buffered_read (link_name, in_file_des, file_hdr->c_filesize); |
| + link_name[file_hdr->c_filesize] = '\0'; |
| + tape_skip_padding (in_file_des, file_hdr->c_filesize); |
| + } |
| + return link_name; |
| +} |
| |
| static void |
| -list_file(struct cpio_file_stat* file_hdr, int in_file_des) |
| +list_file (struct cpio_file_stat* file_hdr, int in_file_des) |
| { |
| if (verbose_flag) |
| { |
| @@ -136,21 +156,16 @@ |
| { |
| if (archive_format != arf_tar && archive_format != arf_ustar) |
| { |
| - char *link_name = NULL; /* Name of hard and symbolic links. */ |
| - |
| - link_name = (char *) xmalloc ((unsigned int) file_hdr->c_filesize + 1); |
| - link_name[file_hdr->c_filesize] = '\0'; |
| - tape_buffered_read (link_name, in_file_des, file_hdr->c_filesize); |
| - long_format (file_hdr, link_name); |
| - free (link_name); |
| - tape_skip_padding (in_file_des, file_hdr->c_filesize); |
| - return; |
| + char *link_name = get_link_name (file_hdr, in_file_des); |
| + if (link_name) |
| + { |
| + long_format (file_hdr, link_name); |
| + free (link_name); |
| + } |
| } |
| else |
| - { |
| - long_format (file_hdr, file_hdr->c_tar_linkname); |
| - return; |
| - } |
| + long_format (file_hdr, file_hdr->c_tar_linkname); |
| + return; |
| } |
| else |
| #endif |
| @@ -640,7 +655,7 @@ |
| } |
| |
| static void |
| -copyin_link(struct cpio_file_stat *file_hdr, int in_file_des) |
| +copyin_link (struct cpio_file_stat *file_hdr, int in_file_des) |
| { |
| char *link_name = NULL; /* Name of hard and symbolic links. */ |
| int res; /* Result of various function calls. */ |
| @@ -650,10 +665,9 @@ |
| |
| if (archive_format != arf_tar && archive_format != arf_ustar) |
| { |
| - link_name = (char *) xmalloc ((unsigned int) file_hdr->c_filesize + 1); |
| - link_name[file_hdr->c_filesize] = '\0'; |
| - tape_buffered_read (link_name, in_file_des, file_hdr->c_filesize); |
| - tape_skip_padding (in_file_des, file_hdr->c_filesize); |
| + link_name = get_link_name (file_hdr, in_file_des); |
| + if (!link_name) |
| + return; |
| } |
| else |
| { |
| @@ -1005,7 +1019,7 @@ |
| |
| file_hdr->c_tar_linkname = NULL; |
| |
| - tape_buffered_read (magic.str, in_des, 6L); |
| + tape_buffered_read (magic.str, in_des, sizeof (magic.str)); |
| while (1) |
| { |
| if (append_flag) |
| @@ -1050,8 +1064,8 @@ |
| break; |
| } |
| bytes_skipped++; |
| - memmove (magic.str, magic.str + 1, 5); |
| - tape_buffered_read (magic.str, in_des, 1L); |
| + memmove (magic.str, magic.str + 1, sizeof (magic.str) - 1); |
| + tape_buffered_read (magic.str + sizeof (magic.str) - 1, in_des, 1L); |
| } |
| } |
| |
| diff -uNr cpio-2.11.ORIG/src/util.c cpio-2.11/src/util.c |
| --- cpio-2.11.ORIG/src/util.c 2015-01-09 11:31:49.018090090 +0000 |
| +++ cpio-2.11/src/util.c 2015-01-09 11:36:55.794093045 +0000 |
| @@ -206,10 +206,7 @@ |
| if (input_size < 0) |
| error (1, errno, _("read error")); |
| if (input_size == 0) |
| - { |
| - error (0, 0, _("premature end of file")); |
| - exit (1); |
| - } |
| + error (PAXEXIT_FAILURE, 0, _("premature end of file")); |
| input_bytes += input_size; |
| } |
| |
| diff -uNr cpio-2.11.ORIG/tests/Makefile.am cpio-2.11/tests/Makefile.am |
| --- cpio-2.11.ORIG/tests/Makefile.am 2015-01-09 11:31:49.020090090 +0000 |
| +++ cpio-2.11/tests/Makefile.am 2015-01-09 11:34:05.121091401 +0000 |
| @@ -52,6 +52,8 @@ |
| setstat04.at\ |
| setstat05.at\ |
| symlink.at\ |
| + symlink-bad-length.at\ |
| + symlink-long.at\ |
| version.at |
| |
| TESTSUITE = $(srcdir)/testsuite |
| diff -uNr cpio-2.11.ORIG/tests/symlink-bad-length.at cpio-2.11/tests/symlink-bad-length.at |
| --- cpio-2.11.ORIG/tests/symlink-bad-length.at 1970-01-01 01:00:00.000000000 +0100 |
| +++ cpio-2.11/tests/symlink-bad-length.at 2015-01-09 11:35:52.124092432 +0000 |
| @@ -0,0 +1,64 @@ |
| +# Process this file with autom4te to create testsuite. -*- Autotest -*- |
| +# Copyright (C) 2014 Free Software Foundation, Inc. |
| + |
| +# 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 3, or (at your option) |
| +# any later version. |
| + |
| +# This program is distributed in the hope that it will be useful, |
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +# GNU General Public License for more details. |
| + |
| +# You should have received a copy of the GNU General Public License |
| +# along with this program; if not, write to the Free Software |
| +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| +# 02110-1301 USA. |
| + |
| +# Cpio v2.11 did segfault with badly set symlink length. |
| +# References: |
| +# http://lists.gnu.org/archive/html/bug-cpio/2014-11/msg00007.html |
| + |
| +AT_SETUP([symlink-bad-length]) |
| +AT_KEYWORDS([symlink-long copyout]) |
| + |
| +AT_DATA([ARCHIVE.base64], |
| +[x3EjAIBAtIEtJy8nAQAAAHRUYW0FAAAADQBGSUxFAABzb21lIGNvbnRlbnQKAMdxIwBgQ/+hLScv |
| +JwEAAAB0VEhuBQD/////TElOSwAARklMRcdxAAAAAAAAAAAAAAEAAAAAAAAACwAAAAAAVFJBSUxF |
| +UiEhIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= |
| +]) |
| + |
| +# The exact error message and exit status depend on the host architecture, |
| +# therefore strderr is filtered out and error code is not checked. |
| + |
| +# So far the only case when cpio would exit with code 0 is when it skips |
| +# several bytes and encounters a valid record header. Perhaps it should |
| +# exit with code 2 (non-critical error), if at least one byte was skipped, |
| +# but that could hurt backward compatibility. |
| + |
| +AT_CHECK([ |
| +base64 -d ARCHIVE.base64 > ARCHIVE || AT_SKIP_TEST |
| +TZ=UTC cpio -ntv < ARCHIVE 2>stderr |
| +cat stderr | grep -v \ |
| + -e 'stored filename length is out of range' \ |
| + -e 'premature end of file' \ |
| + -e 'archive header has reverse byte-order' \ |
| + -e 'memory exhausted' \ |
| + -e 'skipped [[0-9][0-9]*] bytes of junk' \ |
| + -e '[[0-9][0-9]*] block' \ |
| + >&2 |
| +echo >&2 STDERR |
| +], |
| +[0], |
| +[-rw-rw-r-- 1 10029 10031 13 Nov 25 11:52 FILE |
| +],[STDERR |
| +]) |
| + |
| +AT_CLEANUP |
| diff -uNr cpio-2.11.ORIG/tests/symlink-long.at cpio-2.11/tests/symlink-long.at |
| --- cpio-2.11.ORIG/tests/symlink-long.at 1970-01-01 01:00:00.000000000 +0100 |
| +++ cpio-2.11/tests/symlink-long.at 2015-01-09 11:32:53.908090715 +0000 |
| @@ -0,0 +1,46 @@ |
| +# Process this file with autom4te to create testsuite. -*- Autotest -*- |
| +# Copyright (C) 2014 Free Software Foundation, Inc. |
| + |
| +# 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 3, or (at your option) |
| +# any later version. |
| + |
| +# This program is distributed in the hope that it will be useful, |
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +# GNU General Public License for more details. |
| + |
| +# You should have received a copy of the GNU General Public License |
| +# along with this program; if not, write to the Free Software |
| +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| +# 02110-1301 USA. |
| + |
| +# Cpio v2.11.90 changed the way symlink name is read from archive. |
| +# References: |
| +# http://lists.gnu.org/archive/html/bug-cpio/2014-11/msg00007.html |
| + |
| +AT_SETUP([symlink-long]) |
| +AT_KEYWORDS([symlink-long copyout]) |
| + |
| +AT_CHECK([ |
| + |
| +# len(dirname) > READBUFSIZE |
| +dirname= |
| +for i in {1..52}; do |
| + dirname="xxxxxxxxx/$dirname" |
| + mkdir "$dirname" |
| +done |
| +ln -s "$dirname" x || AT_SKIP_TEST |
| + |
| +echo x | cpio -o > ar |
| +list=`cpio -tv < ar | sed 's|.*-> ||'` |
| +test "$list" = "$dirname" && echo success || echo fail |
| +], |
| +[0], |
| +[success |
| +],[2 blocks |
| +2 blocks |
| +]) |
| + |
| +AT_CLEANUP |
| diff -uNr cpio-2.11.ORIG/tests/testsuite.at cpio-2.11/tests/testsuite.at |
| --- cpio-2.11.ORIG/tests/testsuite.at 2015-01-09 11:31:49.020090090 +0000 |
| +++ cpio-2.11/tests/testsuite.at 2015-01-09 11:34:34.386091683 +0000 |
| @@ -31,6 +31,8 @@ |
| |
| m4_include([inout.at]) |
| m4_include([symlink.at]) |
| +m4_include([symlink-bad-length.at]) |
| +m4_include([symlink-long.at]) |
| m4_include([interdir.at]) |
| |
| m4_include([setstat01.at]) |