Grab fixes from Fedora to resolve buffer overflow #112140.
authorMike Frysinger <vapier@gentoo.org>
Thu, 1 Dec 2005 09:45:20 +0000 (09:45 +0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 1 Dec 2005 09:45:20 +0000 (09:45 +0000)
Package-Manager: portage-2.0.53_rc7

app-arch/cpio/ChangeLog
app-arch/cpio/Manifest
app-arch/cpio/cpio-2.6-r5.ebuild [new file with mode: 0644]
app-arch/cpio/files/cpio-2.6-checksum.patch [new file with mode: 0644]
app-arch/cpio/files/cpio-2.6-warnings.patch [new file with mode: 0644]
app-arch/cpio/files/cpio-2.6-writeOutHeaderBufferOverflow.patch [new file with mode: 0644]
app-arch/cpio/files/digest-cpio-2.6-r5 [new file with mode: 0644]

index b84d60183301550b508ef77ca924b1260bed8039..4031c52219935ee47f96ddede986bf385e561a06 100644 (file)
@@ -1,6 +1,13 @@
 # ChangeLog for app-arch/cpio
 # Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/app-arch/cpio/ChangeLog,v 1.37 2005/06/28 05:10:00 kumba Exp $
+# $Header: /var/cvsroot/gentoo-x86/app-arch/cpio/ChangeLog,v 1.38 2005/12/01 09:45:20 vapier Exp $
+
+*cpio-2.6-r5 (01 Dec 2005)
+
+  01 Dec 2005; Mike Frysinger <vapier@gentoo.org>
+  +files/cpio-2.6-checksum.patch, +files/cpio-2.6-warnings.patch,
+  +files/cpio-2.6-writeOutHeaderBufferOverflow.patch, +cpio-2.6-r5.ebuild:
+  Grab fixes from Fedora to resolve buffer overflow #112140.
 
   28 Jun 2005; Joshua Kinard <kumba@gentoo.org> cpio-2.6-r4.ebuild:
   Marked stable on mips.
index b6d0eccee3b3551fb7ff3f87ed932706a14c55cc..7167f3283f03a48043d84912af5fee65f0aec878 100644 (file)
@@ -1,15 +1,28 @@
-MD5 03b5988757bdf7135fc3337e4e6a57aa ChangeLog 6532
-MD5 f70830cbd6b8132c9595fd7f13d0cc66 cpio-2.6-r2.ebuild 1117
-MD5 9a09f8d531c582e78977dbfd96edc1f2 metadata.xml 164
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+MD5 43e45b8ed1f32b225ec50b06574389c8 ChangeLog 6814
 MD5 e55fdc50aad5d87ac28cc3317fc750d8 cpio-2.6-r3.ebuild 1367
 MD5 f6a1777511b6fdef55f762281e3b97fc cpio-2.6-r4.ebuild 1419
+MD5 957285418337d57db3d5246219ee1d45 cpio-2.6-r5.ebuild 1593
 MD5 527f6d401d12741d17a7ac7761a6d2d7 files/2.6-isnumber.patch 861
 MD5 ae93625090241de60fb662d4dd0153dc files/2.6-lstat.patch 843
 MD5 7894f923500cbeeb0b36117e08049b5d files/2.6-rili-big-files.patch 2709
 MD5 e5b0619beac9b1fe4490c3424e903f1f files/2.6-umask.patch 1382
-MD5 898f15e2e1a554916e69e9397f130e81 files/digest-cpio-2.6-r3 61
-MD5 898f15e2e1a554916e69e9397f130e81 files/digest-cpio-2.6-r2 61
-MD5 c1efb6f13ac85b99cf4f468083101b53 files/cpio-2.6-gcc4-tests.patch 542
+MD5 30a2b9b7ee23e9f02c93e8eca8c466c2 files/cpio-2.6-checksum.patch 1244
 MD5 08647cfda931b161030477956f57b03b files/cpio-2.6-chmodRaceC.patch 4153
 MD5 ad27a9309017220fb814c7877fd52cb1 files/cpio-2.6-dirTraversal.patch 6673
+MD5 c1efb6f13ac85b99cf4f468083101b53 files/cpio-2.6-gcc4-tests.patch 542
+MD5 5264c887ab223304098de4bc540617a0 files/cpio-2.6-warnings.patch 6280
+MD5 8e7b24c3c6b13e2228034d738bc9732b files/cpio-2.6-writeOutHeaderBufferOverflow.patch 18611
+MD5 898f15e2e1a554916e69e9397f130e81 files/digest-cpio-2.6-r3 61
 MD5 898f15e2e1a554916e69e9397f130e81 files/digest-cpio-2.6-r4 61
+MD5 898f15e2e1a554916e69e9397f130e81 files/digest-cpio-2.6-r5 61
+MD5 9a09f8d531c582e78977dbfd96edc1f2 metadata.xml 164
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+iD8DBQFDjsbEgIKl8Uu19MoRAn5SAJ49XkIIcwacrjhRdKMKoNfYm7qIDwCfeHSM
+qOCNDIL5FE4Rvg+Ik5dcXrw=
+=o7tt
+-----END PGP SIGNATURE-----
diff --git a/app-arch/cpio/cpio-2.6-r5.ebuild b/app-arch/cpio/cpio-2.6-r5.ebuild
new file mode 100644 (file)
index 0000000..4fd9e7f
--- /dev/null
@@ -0,0 +1,51 @@
+# Copyright 1999-2005 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-arch/cpio/cpio-2.6-r5.ebuild,v 1.1 2005/12/01 09:45:20 vapier Exp $
+
+inherit eutils
+
+DESCRIPTION="A file archival tool which can also read and write tar files"
+HOMEPAGE="http://www.gnu.org/software/cpio/cpio.html"
+SRC_URI="mirror://gnu/cpio/${P}.tar.bz2"
+
+LICENSE="GPL-2 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc-macos ~ppc64 ~s390 ~sh ~sparc ~x86"
+IUSE="nls"
+
+DEPEND=""
+
+src_unpack() {
+       unpack ${A}
+       cd "${S}"
+       epatch "${FILESDIR}"/${PV}-rili-big-files.patch #68520
+       epatch "${FILESDIR}"/${PV}-isnumber.patch #74929
+       epatch "${FILESDIR}"/${PV}-umask.patch #79844
+       epatch "${FILESDIR}"/${PV}-lstat.patch #80246
+       epatch "${FILESDIR}"/${P}-chmodRaceC.patch #90619
+       epatch "${FILESDIR}"/${P}-gcc4-tests.patch #89123
+       epatch "${FILESDIR}"/${P}-dirTraversal.patch #90619
+       epatch "${FILESDIR}"/${P}-checksum.patch
+       epatch "${FILESDIR}"/${P}-warnings.patch
+       epatch "${FILESDIR}"/${P}-writeOutHeaderBufferOverflow.patch #112140
+}
+
+src_compile() {
+       # The configure script has a useless check for gethostname in 
+       # libnsl ... but cpio doesn't utilize the lib/func anywhere, 
+       # so let's force the lib to not be detected
+       ac_cv_lib_nsl_gethostname=no \
+       econf \
+               $(use_enable nls) \
+               --bindir=/bin \
+               --with-rmt=/usr/sbin/rmt \
+               || die
+       emake || die
+}
+
+src_install() {
+       make install DESTDIR="${D}" || die
+       dodoc ChangeLog NEWS README INSTALL
+       rm -f "${D}"/usr/share/man/man1/mt.1
+       rmdir "${D}"/usr/libexec || die
+}
diff --git a/app-arch/cpio/files/cpio-2.6-checksum.patch b/app-arch/cpio/files/cpio-2.6-checksum.patch
new file mode 100644 (file)
index 0000000..0612e0e
--- /dev/null
@@ -0,0 +1,35 @@
+Ripped from Fedora
+
+--- cpio-2.6/src/extern.h.checksum     2005-10-26 11:17:11.000000000 +0200
++++ cpio-2.6/src/extern.h      2005-10-26 11:15:42.000000000 +0200
+@@ -66,7 +66,7 @@
+ extern int archive_des;
+ extern char *archive_name;
+ extern char *rsh_command_option;
+-extern unsigned long crc;
++extern unsigned int crc;
+ extern int delayed_seek_count;
+ #ifdef DEBUG_CPIO
+ extern int debug_flag;
+--- cpio-2.6/src/copyout.c.checksum    2005-10-26 11:17:11.000000000 +0200
++++ cpio-2.6/src/copyout.c     2005-10-26 11:20:01.000000000 +0200
+@@ -311,7 +311,7 @@
+              file_hdr->c_gid, file_hdr->c_nlink, file_hdr->c_mtime,
+            file_hdr->c_filesize, file_hdr->c_dev_maj, file_hdr->c_dev_min,
+          file_hdr->c_rdev_maj, file_hdr->c_rdev_min, file_hdr->c_namesize,
+-             file_hdr->c_chksum);
++             file_hdr->c_chksum & 0xffffffff);
+       tape_buffered_write (ascii_header, out_des, 110L);
+ 
+       /* Write file name to output.  */
+--- cpio-2.6/src/global.c.checksum     2005-10-26 11:17:11.000000000 +0200
++++ cpio-2.6/src/global.c      2005-10-26 11:15:29.000000000 +0200
+@@ -139,7 +139,7 @@
+ char *rsh_command_option = NULL;
+ 
+ /* CRC checksum.  */
+-unsigned long crc;
++unsigned int crc;
+ 
+ /* Input and output buffers.  */
+ char *input_buffer, *output_buffer;
diff --git a/app-arch/cpio/files/cpio-2.6-warnings.patch b/app-arch/cpio/files/cpio-2.6-warnings.patch
new file mode 100644 (file)
index 0000000..1d76c1d
--- /dev/null
@@ -0,0 +1,174 @@
+Ripped from upstream
+
+2005-05-04  Dmitry V. Levin <ldv@altlinux.org>
+
+       Deal with compilation warnings generated by gcc compiler.
+
+       * src/copyin.c (list_file, copyin_regular_file, long_format,
+       process_copy_in): Fix format strings.
+       (create_defered_links_to_skipped): Remove unused variable
+       `link_res'.
+       (process_copy_in): Initialize tty_in, tty_out and rename_in.
+       * src/copyout.c (write_out_header): Initialize dev along with
+       rdev.
+       * src/tar.c (is_tar_filename_too_long): Remove unused variable `p';
+       * src/util.c: Include <safe-read.h> and <full-write.h>
+       (sparse_write): Add forward declaration.  Initialize write_count
+       and cur_write_start variables.
+       (copy_files_disk_to_tape, copy_files_disk_to_disk): Add
+       parentheses around assignment.
+
+diff -uprk.orig cpio-2.6.orig/src/copyin.c cpio-2.6/src/copyin.c
+--- cpio-2.6.orig/src/copyin.c 2004-09-08 11:10:02 +0000
++++ cpio-2.6/src/copyin.c      2005-05-04 12:43:42 +0000
+@@ -176,7 +176,7 @@ list_file(struct new_cpio_header* file_h
+ #endif
+       if (crc != file_hdr->c_chksum)
+       {
+-        error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
++        error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
+                file_hdr->c_name, crc, file_hdr->c_chksum);
+       }
+     }
+@@ -307,7 +307,6 @@ create_defered_links_to_skipped (struct 
+   int ino;
+   int         maj;
+   int   min;
+-  int         link_res;
+   if (file_hdr->c_filesize == 0)
+     {
+       /* The file doesn't have any data attached to it so we don't have
+@@ -541,7 +540,7 @@ copyin_regular_file (struct new_cpio_hea
+       if (archive_format == arf_crcascii)
+       {
+         if (crc != file_hdr->c_chksum)
+-          error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
++          error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
+                  file_hdr->c_name, crc, file_hdr->c_chksum);
+       }
+       tape_skip_padding (in_file_des, file_hdr->c_filesize);
+@@ -563,7 +562,7 @@ copyin_regular_file (struct new_cpio_hea
+   if (archive_format == arf_crcascii)
+     {
+       if (crc != file_hdr->c_chksum)
+-      error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
++      error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
+              file_hdr->c_name, crc, file_hdr->c_chksum);
+     }
+ 
+@@ -897,7 +896,7 @@ long_format (struct new_cpio_header *fil
+     }
+   tbuf[16] = '\0';
+ 
+-  printf ("%s %3u ", mbuf, file_hdr->c_nlink);
++  printf ("%s %3lu ", mbuf, file_hdr->c_nlink);
+ 
+   if (numeric_uid)
+     printf ("%-8u %-8u ", (unsigned int) file_hdr->c_uid,
+@@ -908,7 +907,7 @@ long_format (struct new_cpio_header *fil
+ 
+   if ((file_hdr->c_mode & CP_IFMT) == CP_IFCHR
+       || (file_hdr->c_mode & CP_IFMT) == CP_IFBLK)
+-    printf ("%3u, %3u ", file_hdr->c_rdev_maj,
++    printf ("%3lu, %3lu ", file_hdr->c_rdev_maj,
+           file_hdr->c_rdev_min);
+   else
+     printf ("%8lu ", file_hdr->c_filesize);
+@@ -1342,9 +1341,9 @@ void
+ process_copy_in ()
+ {
+   char done = false;          /* True if trailer reached.  */
+-  FILE *tty_in;                       /* Interactive file for rename option.  */
+-  FILE *tty_out;              /* Interactive file for rename option.  */
+-  FILE *rename_in;            /* Batch file for rename option.  */
++  FILE *tty_in = NULL;                /* Interactive file for rename option.  */
++  FILE *tty_out = NULL;               /* Interactive file for rename option.  */
++  FILE *rename_in = NULL;     /* Batch file for rename option.  */
+   struct stat file_stat;      /* Output file stat record.  */
+   struct new_cpio_header file_hdr;    /* Output header information.  */
+   int in_file_des;            /* Input file descriptor.  */
+@@ -1530,7 +1529,7 @@ process_copy_in ()
+           tape_skip_padding (in_file_des, file_hdr.c_filesize);
+           if (crc != file_hdr.c_chksum)
+             {
+-              error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
++              error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
+                      file_hdr.c_name, crc, file_hdr.c_chksum);
+             }
+          /* Debian hack: -v and -V now work with --only-verify-crc.
+diff -uprk.orig cpio-2.6.orig/src/copyout.c cpio-2.6/src/copyout.c
+--- cpio-2.6.orig/src/copyout.c        2004-10-14 09:14:03 +0000
++++ cpio-2.6/src/copyout.c     2005-05-04 12:41:08 +0000
+@@ -346,7 +346,7 @@ write_out_header (struct new_cpio_header
+ #endif
+               file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
+                                               file_hdr->c_rdev_min);
+-              rdev = 1;
++              dev = rdev = 1;
+               break;
+             default:
+               dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+diff -uprk.orig cpio-2.6.orig/src/tar.c cpio-2.6/src/tar.c
+--- cpio-2.6.orig/src/tar.c    2004-10-14 09:33:41 +0000
++++ cpio-2.6/src/tar.c 2005-05-04 12:41:47 +0000
+@@ -473,7 +473,6 @@ is_tar_filename_too_long (char *name)
+ {
+   int whole_name_len;
+   int prefix_name_len;
+-  char *p;
+ 
+   whole_name_len = strlen (name);
+   if (whole_name_len <= TARNAMESIZE)
+diff -uprk.orig cpio-2.6.orig/src/util.c cpio-2.6/src/util.c
+--- cpio-2.6.orig/src/util.c   2004-09-08 10:44:49 +0000
++++ cpio-2.6/src/util.c        2005-05-04 13:13:24 +0000
+@@ -24,6 +24,8 @@
+ #include "dstring.h"
+ #include "extern.h"
+ #include <rmt.h>
++#include <safe-read.h>
++#include <full-write.h>
+ 
+ #include <sys/ioctl.h>
+ 
+@@ -38,6 +40,8 @@
+ extern int errno;
+ #endif
+ 
++int sparse_write (int fildes, char *buf, unsigned int nbyte);
++
+ /* Write `output_size' bytes of `output_buffer' to file
+    descriptor OUT_DES and reset `output_size' and `out_buff'.  */
+ 
+@@ -471,9 +475,9 @@ copy_files_disk_to_tape (int in_des, int
+   while (num_bytes > 0)
+     {
+       if (input_size == 0)
+-      if (rc = disk_fill_input_buffer (in_des,
++      if ((rc = disk_fill_input_buffer (in_des,
+         num_bytes < DISK_IO_BLOCK_SIZE ?
+-        num_bytes : DISK_IO_BLOCK_SIZE))
++        num_bytes : DISK_IO_BLOCK_SIZE)))
+         {
+           if (rc > 0)
+             error (0, 0, _("File %s shrunk by %ld bytes, padding with zeros"),
+@@ -517,7 +521,7 @@ copy_files_disk_to_disk (int in_des, int
+   while (num_bytes > 0)
+     {
+       if (input_size == 0)
+-      if (rc = disk_fill_input_buffer (in_des, num_bytes))
++      if ((rc = disk_fill_input_buffer (in_des, num_bytes)))
+         {
+           if (rc > 0)
+             error (0, 0, _("File %s shrunk by %ld bytes, padding with zeros"),
+@@ -1157,8 +1161,8 @@ sparse_write (int fildes, char *buf, uns
+   int complete_block_count;
+   int leftover_bytes_count;
+   int seek_count;
+-  int write_count;
+-  char *cur_write_start;
++  int write_count = 0;
++  char *cur_write_start = buf;
+   int lseek_rc;
+   int write_rc;
+   int i;
diff --git a/app-arch/cpio/files/cpio-2.6-writeOutHeaderBufferOverflow.patch b/app-arch/cpio/files/cpio-2.6-writeOutHeaderBufferOverflow.patch
new file mode 100644 (file)
index 0000000..95bd0e3
--- /dev/null
@@ -0,0 +1,560 @@
+Ripped from Fedora who ripped from upstream
+
+https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=172669
+http://bugs.gentoo.org/112140
+
+--- cpio-2.6/src/copyout.c.bufferOverflow      2005-11-23 16:51:56.000000000 -0500
++++ cpio-2.6/src/copyout.c     2005-11-23 17:00:38.000000000 -0500
+@@ -159,7 +159,7 @@
+ }
+ 
+ /* We are about to put a file into a newc or crc archive that is
+-   multiply linked.  We have already seen and defered all of the
++   multiply linked.  We have already seen and deferred all of the
+    other links to the file but haven't written them into the archive.
+    Write the other links into the archive, and remove them from the
+    deferouts list.  */
+@@ -231,8 +231,10 @@
+                                          file_hdr.c_filesize,
+                                          header->c_name);
+ 
+-  write_out_header (&file_hdr, out_file_des);
+-  copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize, header->c_name);
++  if (write_out_header (&file_hdr, out_file_des))
++    return;
++  copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize,
++                         header->c_name);
+   warn_if_file_changed(header->c_name, file_hdr.c_filesize, file_hdr.c_mtime);
+ 
+   if (archive_format == arf_tar || archive_format == arf_ustar)
+@@ -288,153 +290,311 @@
+     }
+ }
+ 
+-\f
+-/* Write out header FILE_HDR, including the file name, to file
+-   descriptor OUT_DES.  */
++/* FIXME: These two defines should be defined in paxutils */
++#define LG_8  3
++#define LG_16 4
++
++/* FIXME: to_ascii could be used instead of to_oct() and to_octal() from tar,
++   so it should be moved to paxutils too.
++   Allowed values for logbase are: 1 (binary), 2, 3 (octal), 4 (hex) */
++int
++to_ascii (char *where, uintmax_t v, size_t digits, unsigned logbase)
++{
++  static char codetab[] = "0123456789ABCDEF";
++  int i = digits;
++  
++  do
++    {
++      where[--i] = codetab[(v & ((1 << logbase) - 1))];
++      v >>= logbase;
++    }
++  while (i);
++
++  return v != 0;
++}
++
++static void
++field_width_error (const char *filename, const char *fieldname)
++{
++  error (0, 0, _("%s: field width not sufficient for storing %s"),
++       filename, fieldname);
++}
++
++static void
++field_width_warning (const char *filename, const char *fieldname)
++{
++  if (warn_option & CPIO_WARN_TRUNCATE)
++    error (0, 0, _("%s: truncating %s"), filename, fieldname);
++}
+ 
+ void
+-write_out_header (struct new_cpio_header *file_hdr, int out_des)
++to_ascii_or_warn (char *where, uintmax_t n, size_t digits,
++                unsigned logbase,
++                const char *filename, const char *fieldname)
++{
++  if (to_ascii (where, n, digits, logbase))
++    field_width_warning (filename, fieldname);
++}    
++
++int
++to_ascii_or_error (char *where, uintmax_t n, size_t digits,
++                 unsigned logbase,
++                 const char *filename, const char *fieldname)
+ {
+-  if (archive_format == arf_newascii || archive_format == arf_crcascii)
++  if (to_ascii (where, n, digits, logbase))
+     {
+-      char ascii_header[112];
+-      char *magic_string;
++      field_width_error (filename, fieldname);
++      return 1;
++    }
++  return 0;
++}    
+ 
+-      if (archive_format == arf_crcascii)
+-      magic_string = "070702";
+-      else
+-      magic_string = "070701";
+-      sprintf (ascii_header,
+-             "%6s%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx",
+-             magic_string,
+-             file_hdr->c_ino, file_hdr->c_mode, file_hdr->c_uid,
+-             file_hdr->c_gid, file_hdr->c_nlink, file_hdr->c_mtime,
+-           file_hdr->c_filesize, file_hdr->c_dev_maj, file_hdr->c_dev_min,
+-         file_hdr->c_rdev_maj, file_hdr->c_rdev_min, file_hdr->c_namesize,
+-             file_hdr->c_chksum & 0xffffffff);
+-      tape_buffered_write (ascii_header, out_des, 110L);
+-
+-      /* Write file name to output.  */
+-      tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
+-      tape_pad_output (out_des, file_hdr->c_namesize + 110);
+-    }
+-  else if (archive_format == arf_oldascii || archive_format == arf_hpoldascii)
+-    {
+-      char ascii_header[78];
+-      dev_t dev;
+-      dev_t rdev;
++int
++write_out_new_ascii_header (const char *magic_string,
++                          struct new_cpio_header *file_hdr, int out_des)
++{
++  char ascii_header[110];
++  char *p;
+ 
+-      if (archive_format == arf_oldascii)
+-      {
+-        dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+-        rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
+-      }
+-      else
+-      {
+-        /* HP/UX cpio creates archives that look just like ordinary archives,
+-           but for devices it sets major = 0, minor = 1, and puts the
+-           actual major/minor number in the filesize field.  */
+-        switch (file_hdr->c_mode & CP_IFMT)
+-          {
+-            case CP_IFCHR:
+-            case CP_IFBLK:
++  p = stpcpy (ascii_header, magic_string);
++  to_ascii_or_warn (p, file_hdr->c_ino, 8, LG_16,
++                  file_hdr->c_name, _("inode number"));
++  p += 8;
++  to_ascii_or_warn (p, file_hdr->c_mode, 8, LG_16, file_hdr->c_name,
++                  _("file mode"));
++  p += 8;
++  to_ascii_or_warn (p, file_hdr->c_uid, 8, LG_16, file_hdr->c_name,
++                  _("uid"));
++  p += 8;
++  to_ascii_or_warn (p, file_hdr->c_gid, 8, LG_16, file_hdr->c_name,
++                  _("gid"));
++  p += 8;
++  to_ascii_or_warn (p, file_hdr->c_nlink, 8, LG_16, file_hdr->c_name,
++                  _("number of links"));
++  p += 8;
++  to_ascii_or_warn (p, file_hdr->c_mtime, 8, LG_16, file_hdr->c_name,
++                  _("modification time"));
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_filesize, 8, LG_16, file_hdr->c_name,
++                       _("file size")))
++    return 1;
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_dev_maj, 8, LG_16, file_hdr->c_name,
++                       _("device major number")))
++    return 1;
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_dev_min, 8, LG_16, file_hdr->c_name,
++                       _("device minor number")))
++    return 1;
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_rdev_maj, 8, LG_16, file_hdr->c_name,
++                       _("rdev major")))
++    return 1;
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_rdev_min, 8, LG_16, file_hdr->c_name,
++                       _("rdev minor")))
++    return 1;
++  p += 8;
++  if (to_ascii_or_error (p, file_hdr->c_namesize, 8, LG_16, file_hdr->c_name,
++                       _("name size")))
++    return 1;
++  p += 8;
++  to_ascii (p, file_hdr->c_chksum & 0xffffffff, 8, LG_16);
++
++  tape_buffered_write (ascii_header, out_des, sizeof ascii_header);
++
++  /* Write file name to output.  */
++  tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
++  tape_pad_output (out_des, file_hdr->c_namesize + sizeof ascii_header);
++  return 0;
++}  
++
++int
++write_out_old_ascii_header (dev_t dev, dev_t rdev,
++                          struct new_cpio_header *file_hdr, int out_des)
++{
++  char ascii_header[76];
++  char *p = ascii_header;
++  
++  to_ascii (p, file_hdr->c_magic, 6, LG_8);
++  p += 6;
++  to_ascii_or_warn (p, dev, 6, LG_8, file_hdr->c_name, _("device number"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_ino, 6, LG_8, file_hdr->c_name,
++                  _("inode number"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_mode, 6, LG_8, file_hdr->c_name,
++                  _("file mode"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_uid, 6, LG_8, file_hdr->c_name, _("uid"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_gid, 6, LG_8, file_hdr->c_name, _("gid"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_nlink, 6, LG_8, file_hdr->c_name,
++                  _("number of links"));
++  p += 6;
++  to_ascii_or_warn (p, rdev, 6, LG_8, file_hdr->c_name, _("rdev"));
++  p += 6;
++  to_ascii_or_warn (p, file_hdr->c_mtime, 11, LG_8, file_hdr->c_name,
++                  _("modification time"));
++  p += 11;
++  if (to_ascii_or_error (p, file_hdr->c_namesize, 6, LG_8, file_hdr->c_name,
++                       _("name size")))
++    return 1;
++  p += 6;
++  if (to_ascii_or_error (p, file_hdr->c_filesize, 11, LG_8, file_hdr->c_name,
++                       _("file size")))
++    return 1;
++
++  tape_buffered_write (ascii_header, out_des, sizeof ascii_header);
++
++  /* Write file name to output.  */
++  tape_buffered_write (file_hdr->c_name, out_des, file_hdr->c_namesize);
++  return 0;
++}
++
++void
++hp_compute_dev (struct new_cpio_header *file_hdr, dev_t *pdev, dev_t *prdev)
++{
++  /* HP/UX cpio creates archives that look just like ordinary archives,
++     but for devices it sets major = 0, minor = 1, and puts the
++     actual major/minor number in the filesize field.  */
++  switch (file_hdr->c_mode & CP_IFMT)
++    {
++    case CP_IFCHR:
++    case CP_IFBLK:
+ #ifdef CP_IFSOCK
+-            case CP_IFSOCK:
++    case CP_IFSOCK:
+ #endif
+ #ifdef CP_IFIFO
+-            case CP_IFIFO:
++    case CP_IFIFO:
+ #endif
+-              file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
+-                                              file_hdr->c_rdev_min);
+-              dev = rdev = 1;
+-              break;
+-            default:
+-              dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+-              rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
+-              break;
+-          }
+-      }
++      file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
++                                    file_hdr->c_rdev_min);
++      *pdev = *prdev = makedev (0, 1);
++      break;
++
++    default:
++      *pdev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
++      *prdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
++      break;
++    }
++}
+ 
+-      if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
+-      error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
++int
++write_out_binary_header (dev_t rdev,
++                       struct new_cpio_header *file_hdr, int out_des)
++{
++  struct old_cpio_header short_hdr;
+ 
+-      /* Debian hack: The type of dev_t has changed in glibc.  Fixed output
+-         to ensure that a long int is passed to sprintf.  This has been
+-         reported to "bug-gnu-utils@prep.ai.mit.edu". (1998/5/26) -BEM */
+-      sprintf (ascii_header,
+-             "%06ho%06lo%06lo%06lo%06lo%06lo%06lo%06lo%011lo%06lo%011lo",
+-             file_hdr->c_magic & 0xFFFF, (long) dev & 0xFFFF,
+-             file_hdr->c_ino & 0xFFFF, file_hdr->c_mode & 0xFFFF,
+-             file_hdr->c_uid & 0xFFFF, file_hdr->c_gid & 0xFFFF,
+-             file_hdr->c_nlink & 0xFFFF, (long) rdev & 0xFFFF,
+-             file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF,
+-             file_hdr->c_filesize);
+-      tape_buffered_write (ascii_header, out_des, 76L);
++  short_hdr.c_magic = 070707;
++  short_hdr.c_dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+ 
+-      /* Write file name to output.  */
+-      tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
+-    }
+-  else if (archive_format == arf_tar || archive_format == arf_ustar)
+-    {
+-      write_out_tar_header (file_hdr, out_des);
+-    }
+-  else
+-    {
+-      struct old_cpio_header short_hdr;
++  if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
++    error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
+ 
+-      short_hdr.c_magic = 070707;
+-      short_hdr.c_dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
++  short_hdr.c_ino = file_hdr->c_ino & 0xFFFF;
++  if (short_hdr.c_ino != file_hdr->c_ino)
++    field_width_warning (file_hdr->c_name, _("inode number"));
++  
++  short_hdr.c_mode = file_hdr->c_mode & 0xFFFF;
++  if (short_hdr.c_mode != file_hdr->c_mode)
++    field_width_warning (file_hdr->c_name, _("file mode"));
++  
++  short_hdr.c_uid = file_hdr->c_uid & 0xFFFF;
++  if (short_hdr.c_uid != file_hdr->c_uid)
++    field_width_warning (file_hdr->c_name, _("uid"));
++  
++  short_hdr.c_gid = file_hdr->c_gid & 0xFFFF;
++  if (short_hdr.c_gid != file_hdr->c_gid)
++    field_width_warning (file_hdr->c_name, _("gid"));
++  
++  short_hdr.c_nlink = file_hdr->c_nlink & 0xFFFF;
++  if (short_hdr.c_nlink != file_hdr->c_nlink)
++    field_width_warning (file_hdr->c_name, _("number of links"));
++                    
++  short_hdr.c_rdev = rdev;
++  short_hdr.c_mtimes[0] = file_hdr->c_mtime >> 16;
++  short_hdr.c_mtimes[1] = file_hdr->c_mtime & 0xFFFF;
++
++  short_hdr.c_namesize = file_hdr->c_namesize & 0xFFFF;
++  if (short_hdr.c_namesize != file_hdr->c_namesize)
++    {
++      field_width_error (file_hdr->c_name, _("name size"));
++      return 1;
++    }
++                    
++  short_hdr.c_filesize = file_hdr->c_filesize;
++  if (short_hdr.c_filesize != file_hdr->c_filesize)
++    {
++      field_width_error (file_hdr->c_name, _("file size"));
++      return 1;
++    }
++                    
++  short_hdr.c_filesizes[0] = file_hdr->c_filesize >> 16;
++  short_hdr.c_filesizes[1] = file_hdr->c_filesize & 0xFFFF;
+ 
+-      if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
+-      error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
++  /* Output the file header.  */
++  tape_buffered_write ((char *) &short_hdr, out_des, 26);
+ 
+-      short_hdr.c_ino = file_hdr->c_ino & 0xFFFF;
+-      short_hdr.c_mode = file_hdr->c_mode & 0xFFFF;
+-      short_hdr.c_uid = file_hdr->c_uid & 0xFFFF;
+-      short_hdr.c_gid = file_hdr->c_gid & 0xFFFF;
+-      short_hdr.c_nlink = file_hdr->c_nlink & 0xFFFF;
+-      if (archive_format != arf_hpbinary)
+-      short_hdr.c_rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
+-      else
+-      {
+-        switch (file_hdr->c_mode & CP_IFMT)
+-          {
+-            /* HP/UX cpio creates archives that look just like ordinary 
+-               archives, but for devices it sets major = 0, minor = 1, and 
+-               puts the actual major/minor number in the filesize field.  */
+-            case CP_IFCHR:
+-            case CP_IFBLK:
+-#ifdef CP_IFSOCK
+-            case CP_IFSOCK:
+-#endif
+-#ifdef CP_IFIFO
+-            case CP_IFIFO:
+-#endif
+-              file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
+-                                              file_hdr->c_rdev_min);
+-              short_hdr.c_rdev = makedev (0, 1);
+-              break;
+-            default:
+-              short_hdr.c_rdev = makedev (file_hdr->c_rdev_maj, 
+-                                          file_hdr->c_rdev_min);
+-              break;
+-          }
+-      }
+-      short_hdr.c_mtimes[0] = file_hdr->c_mtime >> 16;
+-      short_hdr.c_mtimes[1] = file_hdr->c_mtime & 0xFFFF;
++  /* Write file name to output.  */
++  tape_buffered_write (file_hdr->c_name, out_des, file_hdr->c_namesize);
+ 
+-      short_hdr.c_namesize = file_hdr->c_namesize & 0xFFFF;
++  tape_pad_output (out_des, file_hdr->c_namesize + 26);
++  return 0;
++}
+ 
+-      short_hdr.c_filesizes[0] = file_hdr->c_filesize >> 16;
+-      short_hdr.c_filesizes[1] = file_hdr->c_filesize & 0xFFFF;
++\f
++/* Write out header FILE_HDR, including the file name, to file
++   descriptor OUT_DES.  */
+ 
+-      /* Output the file header.  */
+-      tape_buffered_write ((char *) &short_hdr, out_des, 26L);
++int 
++write_out_header (struct new_cpio_header *file_hdr, int out_des)
++{
++  dev_t dev;
++  dev_t rdev;
++  
++  switch (archive_format)
++    {
++    case arf_newascii:
++      return write_out_new_ascii_header ("070701", file_hdr, out_des);
++      
++    case arf_crcascii:
++      return write_out_new_ascii_header ("070702", file_hdr, out_des);
++      
++    case arf_oldascii:
++      return write_out_old_ascii_header (makedev (file_hdr->c_dev_maj,
++                                                file_hdr->c_dev_min),
++                                       makedev (file_hdr->c_rdev_maj,
++                                                file_hdr->c_rdev_min),
++                                       file_hdr, out_des);
++      
++    case arf_hpoldascii:
++      hp_compute_dev (file_hdr, &dev, &rdev);
++      return write_out_old_ascii_header (dev, rdev, file_hdr, out_des);
++      
++    case arf_tar:
++    case arf_ustar:
++      if (is_tar_filename_too_long (file_hdr->c_name))
++      {
++        error (0, 0, _("%s: file name too long"), file_hdr->c_name);
++        return 1;
++      }
++      write_out_tar_header (file_hdr, out_des); /* FIXME: No error checking */
++      return 0;
+ 
+-      /* Write file name to output.  */
+-      tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
++    case arf_binary:
++      return write_out_binary_header (makedev (file_hdr->c_rdev_maj,
++                                             file_hdr->c_rdev_min),
++                                    file_hdr, out_des);
++
++    case arf_hpbinary:
++      hp_compute_dev (file_hdr, &dev, &rdev);
++      /* FIXME: dev ignored. Should it be? */
++      return write_out_binary_header (rdev, file_hdr, out_des);
+ 
+-      tape_pad_output (out_des, file_hdr->c_namesize + 26);
++    default:
++      abort ();
+     }
+ }
+ 
+@@ -593,14 +753,7 @@
+             file_hdr.c_namesize = strlen (p) + 1;
+           }
+ #endif
+-        if ((archive_format == arf_tar || archive_format == arf_ustar)
+-            && is_tar_filename_too_long (file_hdr.c_name))
+-          {
+-            error (0, 0, _("%s: file name too long"),
+-                   file_hdr.c_name);
+-            continue;
+-          }
+-        
++
+         /* Copy the named file to the output.  */
+         switch (file_hdr.c_mode & CP_IFMT)
+           {
+@@ -613,7 +766,8 @@
+                                                   file_hdr.c_dev_min)))
+                   {
+                     file_hdr.c_tar_linkname = otherfile;
+-                    write_out_header (&file_hdr, out_file_des);
++                    if (write_out_header (&file_hdr, out_file_des))
++                      continue;
+                     break;
+                   }
+               }
+@@ -643,7 +797,8 @@
+                                                      file_hdr.c_filesize,
+                                                      input_name.ds_string);
+ 
+-            write_out_header (&file_hdr, out_file_des);
++            if (write_out_header (&file_hdr, out_file_des))
++              continue;
+             copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize, input_name.ds_string);
+             warn_if_file_changed(input_name.ds_string, file_hdr.c_filesize,
+                                    file_hdr.c_mtime);
+@@ -673,7 +828,8 @@
+ 
+           case CP_IFDIR:
+             file_hdr.c_filesize = 0;
+-            write_out_header (&file_hdr, out_file_des);
++            if (write_out_header (&file_hdr, out_file_des))
++              continue;
+             break;
+ 
+           case CP_IFCHR:
+@@ -702,14 +858,16 @@
+                     file_hdr.c_mode = (file_stat.st_mode & 07777);
+                     file_hdr.c_mode |= CP_IFREG;
+                     file_hdr.c_tar_linkname = otherfile;
+-                    write_out_header (&file_hdr, out_file_des);
++                    if (write_out_header (&file_hdr, out_file_des))
++                      continue;
+                     break;
+                   }
+                 add_inode (file_hdr.c_ino, file_hdr.c_name, 
+                            file_hdr.c_dev_maj, file_hdr.c_dev_min);
+               }
+             file_hdr.c_filesize = 0;
+-            write_out_header (&file_hdr, out_file_des);
++            if (write_out_header (&file_hdr, out_file_des))
++              continue;
+             break;
+ 
+ #ifdef CP_IFLNK
+@@ -738,12 +896,14 @@
+                     {
+                       link_name[link_size] = '\0';
+                       file_hdr.c_tar_linkname = link_name;
+-                      write_out_header (&file_hdr, out_file_des);
++                      if (write_out_header (&file_hdr, out_file_des))
++                        continue;
+                     }
+                 }
+               else
+                 {
+-                  write_out_header (&file_hdr, out_file_des);
++                  if (write_out_header (&file_hdr, out_file_des))
++                    continue;
+                   tape_buffered_write (link_name, out_file_des, link_size);
+                   tape_pad_output (out_file_des, link_size);
+                 }
+--- cpio-2.6/src/extern.h.bufferOverflow       2005-11-23 16:51:56.000000000 -0500
++++ cpio-2.6/src/extern.h      2005-11-23 16:51:56.000000000 -0500
+@@ -112,7 +112,7 @@
+ void print_name_with_quoting P_((char *p));
+ 
+ /* copyout.c */
+-void write_out_header P_((struct new_cpio_header *file_hdr, int out_des));
++int write_out_header P_((struct new_cpio_header *file_hdr, int out_des));
+ void process_copy_out P_((void));
+ 
+ /* copypass.c */
diff --git a/app-arch/cpio/files/digest-cpio-2.6-r5 b/app-arch/cpio/files/digest-cpio-2.6-r5
new file mode 100644 (file)
index 0000000..822d7f4
--- /dev/null
@@ -0,0 +1 @@
+MD5 25e0e8725bc60ed3460c9cde92752674 cpio-2.6.tar.bz2 448452