+++ /dev/null
-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);
- }
--
-+\f
-+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;
-+}
- \f
- 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 @@
- }
- \f
- 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])