!5 openEuler-cpio

Merge pull request !5 from Liquor/liquor
This commit is contained in:
openeuler-ci-bot 2020-07-30 18:29:03 +08:00 committed by Gitee
commit 22994b87a8
10 changed files with 86 additions and 481 deletions

View File

@ -1,322 +0,0 @@
From 7293fc357b13ba490daf0b99b505b3a019f1eb2a Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Sun, 3 Nov 2019 23:59:39 +0200
Subject: [PATCH] Fix CVE-2019-14866
* src/copyout.c (to_ascii): Additional argument nul controls whether
to add the terminating nul character.
(field_width_error): Improve diagnostics: print the actual and the
maximum allowed field value.
* src/extern.h (to_ascii, field_width_error): New prototypes.
* src/tar.c (to_oct): Remove.
(to_oct_or_error): New function.
(TO_OCT): New macro.
(write_out_tar_header): Use TO_OCT and to_ascii. Return 0 on
success, 1 on error.
backport from http://git.savannah.gnu.org/cgit/cpio.git/commit/?id=7554e3e42cd72f6f8304410c47fe6f8918e9bfd7
---
src/copyout.c | 49 +++++++++++++++++++++--------------
src/extern.h | 15 +++++++++--
src/tar.c | 72 +++++++++++++++++++++++----------------------------
3 files changed, 76 insertions(+), 60 deletions(-)
diff --git a/src/copyout.c b/src/copyout.c
index dcae449..1ae5477 100644
--- a/src/copyout.c
+++ b/src/copyout.c
@@ -269,26 +269,32 @@ writeout_final_defers (int out_des)
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)
+to_ascii (char *where, uintmax_t v, size_t digits, unsigned logbase, bool nul)
{
static char codetab[] = "0123456789ABCDEF";
- int i = digits;
-
- do
+
+ if (nul)
+ where[--digits] = 0;
+ while (digits > 0)
{
- where[--i] = codetab[(v & ((1 << logbase) - 1))];
+ where[--digits] = codetab[(v & ((1 << logbase) - 1))];
v >>= logbase;
}
- while (i);
return v != 0;
}
-static void
-field_width_error (const char *filename, const char *fieldname)
+void
+field_width_error (const char *filename, const char *fieldname,
+ uintmax_t value, size_t width, bool nul)
{
- error (1, 0, _("%s: field width not sufficient for storing %s"),
- filename, fieldname);
+ char valbuf[UINTMAX_STRSIZE_BOUND + 1];
+ char maxbuf[UINTMAX_STRSIZE_BOUND + 1];
+ error (0, 0, _("%s: value %s %s out of allowed range 0..%s"),
+ filename, fieldname,
+ STRINGIFY_BIGINT (value, valbuf),
+ STRINGIFY_BIGINT (MAX_VAL_WITH_DIGITS (width - nul, LG_8),
+ maxbuf));
}
static void
@@ -303,7 +309,7 @@ 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))
+ if (to_ascii (where, n, digits, logbase, false))
field_width_warning (filename, fieldname);
}
@@ -312,9 +318,9 @@ to_ascii_or_error (char *where, uintmax_t n, size_t digits,
unsigned logbase,
const char *filename, const char *fieldname)
{
- if (to_ascii (where, n, digits, logbase))
+ if (to_ascii (where, n, digits, logbase, false))
{
- field_width_error (filename, fieldname);
+ field_width_error (filename, fieldname, n, digits, false);
return 1;
}
return 0;
@@ -371,7 +377,7 @@ write_out_new_ascii_header (const char *magic_string,
_("name size")))
return 1;
p += 8;
- to_ascii (p, file_hdr->c_chksum & 0xffffffff, 8, LG_16);
+ to_ascii (p, file_hdr->c_chksum & 0xffffffff, 8, LG_16, false);
tape_buffered_write (ascii_header, out_des, sizeof ascii_header);
@@ -388,7 +394,7 @@ write_out_old_ascii_header (dev_t dev, dev_t rdev,
char ascii_header[76];
char *p = ascii_header;
- to_ascii (p, file_hdr->c_magic, 6, LG_8);
+ to_ascii (p, file_hdr->c_magic, 6, LG_8, false);
p += 6;
to_ascii_or_warn (p, dev, 6, LG_8, file_hdr->c_name, _("device number"));
p += 6;
@@ -492,7 +498,10 @@ write_out_binary_header (dev_t rdev,
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"));
+ char maxbuf[UINTMAX_STRSIZE_BOUND + 1];
+ error (0, 0, _("%s: value %s %s out of allowed range 0..%u"),
+ file_hdr->c_name, _("name size"),
+ STRINGIFY_BIGINT (file_hdr->c_namesize, maxbuf), 0xFFFFu);
return 1;
}
@@ -502,7 +511,10 @@ write_out_binary_header (dev_t rdev,
if (((off_t)short_hdr.c_filesizes[0] << 16) + short_hdr.c_filesizes[1]
!= file_hdr->c_filesize)
{
- field_width_error (file_hdr->c_name, _("file size"));
+ char maxbuf[UINTMAX_STRSIZE_BOUND + 1];
+ error (0, 0, _("%s: value %s %s out of allowed range 0..%lu"),
+ file_hdr->c_name, _("file size"),
+ STRINGIFY_BIGINT (file_hdr->c_namesize, maxbuf), 0xFFFFFFFFlu);
return 1;
}
@@ -552,8 +564,7 @@ write_out_header (struct cpio_file_stat *file_hdr, int out_des)
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;
+ return write_out_tar_header (file_hdr, out_des);
case arf_binary:
return write_out_binary_header (makedev (file_hdr->c_rdev_maj,
diff --git a/src/extern.h b/src/extern.h
index e27d662..f9ef56a 100644
--- a/src/extern.h
+++ b/src/extern.h
@@ -117,6 +117,10 @@ void print_name_with_quoting (char *p);
/* copyout.c */
int write_out_header (struct cpio_file_stat *file_hdr, int out_des);
void process_copy_out (void);
+int to_ascii (char *where, uintmax_t v, size_t digits, unsigned logbase,
+ bool nul);
+void field_width_error (const char *filename, const char *fieldname,
+ uintmax_t value, size_t width, bool nul);
/* copypass.c */
void process_copy_pass (void);
@@ -145,7 +149,7 @@ int make_path (char *argpath, uid_t owner, gid_t group,
const char *verbose_fmt_string);
/* tar.c */
-void write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des);
+int write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des);
int null_block (long *block, int size);
void read_in_tar_header (struct cpio_file_stat *file_hdr, int in_des);
int otoa (char *s, unsigned long *n);
@@ -204,9 +208,16 @@ void cpio_safer_name_suffix (char *name, bool link_target,
int cpio_create_dir (struct cpio_file_stat *file_hdr, int existing_dir);
void change_dir (void);
-/* FIXME: These two defines should be defined in paxutils */
+/* FIXME: The following three should be defined in paxutils */
#define LG_8 3
#define LG_16 4
+/* The maximum uintmax_t value that can be represented with DIGITS digits,
+ assuming that each digit is BITS_PER_DIGIT wide. */
+#define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
+ ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
+ ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
+ : (uintmax_t) -1)
+
uintmax_t from_ascii (char const *where, size_t digs, unsigned logbase);
diff --git a/src/tar.c b/src/tar.c
index e2b5f45..1a1f8c8 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -1,6 +1,5 @@
/* tar.c - read in write tar headers for cpio
- Copyright (C) 1992, 2001, 2004, 2006-2007, 2010, 2014-2015 Free
- Software Foundation, Inc.
+ Copyright (C) 1992-2019 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
@@ -81,36 +80,17 @@ stash_tar_filename (char *prefix, char *filename)
return hold_tar_filename;
}
-/* Convert a number into a string of octal digits.
- Convert long VALUE into a DIGITS-digit field at WHERE,
- including a trailing space and room for a NUL. DIGITS==3 means
- 1 digit, a space, and room for a NUL.
-
- We assume the trailing NUL is already there and don't fill it in.
- This fact is used by start_header and finish_header, so don't change it!
-
- This is be equivalent to:
- sprintf (where, "%*lo ", digits - 2, value);
- except that sprintf fills in the trailing NUL and we don't. */
-
-static void
-to_oct (register long value, register int digits, register char *where)
+static int
+to_oct_or_error (uintmax_t value, size_t digits, char *where, char const *field,
+ char const *file)
{
- --digits; /* Leave the trailing NUL slot alone. */
-
- /* Produce the digits -- at least one. */
- do
+ if (to_ascii (where, value, digits, LG_8, true))
{
- where[--digits] = '0' + (char) (value & 7); /* One octal digit. */
- value >>= 3;
+ field_width_error (file, field, value, digits, true);
+ return 1;
}
- while (digits > 0 && value != 0);
-
- /* Add leading zeroes, if necessary. */
- while (digits > 0)
- where[--digits] = '0';
+ return 0;
}
-
/* Compute and return a checksum for TAR_HDR,
@@ -136,10 +116,22 @@ tar_checksum (struct tar_header *tar_hdr)
return sum;
}
+#define TO_OCT(file_hdr, c_fld, digits, tar_hdr, tar_field) \
+ do \
+ { \
+ if (to_oct_or_error (file_hdr -> c_fld, \
+ digits, \
+ tar_hdr -> tar_field, \
+ #tar_field, \
+ file_hdr->c_name)) \
+ return 1; \
+ } \
+ while (0)
+
/* Write out header FILE_HDR, including the file name, to file
descriptor OUT_DES. */
-void
+int
write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des)
{
int name_len;
@@ -168,11 +160,11 @@ write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des)
/* Ustar standard (POSIX.1-1988) requires the mode to contain only 3 octal
digits */
- to_oct (file_hdr->c_mode & MODE_ALL, 8, tar_hdr->mode);
- to_oct (file_hdr->c_uid, 8, tar_hdr->uid);
- to_oct (file_hdr->c_gid, 8, tar_hdr->gid);
- to_oct (file_hdr->c_filesize, 12, tar_hdr->size);
- to_oct (file_hdr->c_mtime, 12, tar_hdr->mtime);
+ TO_OCT (file_hdr, c_mode & MODE_ALL, 8, tar_hdr, mode);
+ TO_OCT (file_hdr, c_uid, 8, tar_hdr, uid);
+ TO_OCT (file_hdr, c_gid, 8, tar_hdr, gid);
+ TO_OCT (file_hdr, c_filesize, 12, tar_hdr, size);
+ TO_OCT (file_hdr, c_mtime, 12, tar_hdr, mtime);
switch (file_hdr->c_mode & CP_IFMT)
{
@@ -184,7 +176,7 @@ write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des)
strncpy (tar_hdr->linkname, file_hdr->c_tar_linkname,
TARLINKNAMESIZE);
tar_hdr->typeflag = LNKTYPE;
- to_oct (0, 12, tar_hdr->size);
+ to_ascii (tar_hdr->size, 0, 12, LG_8, true);
}
else
tar_hdr->typeflag = REGTYPE;
@@ -210,7 +202,7 @@ write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des)
than TARLINKNAMESIZE. */
strncpy (tar_hdr->linkname, file_hdr->c_tar_linkname,
TARLINKNAMESIZE);
- to_oct (0, 12, tar_hdr->size);
+ to_ascii (tar_hdr->size, 0, 12, LG_8, true);
break;
#endif /* CP_IFLNK */
}
@@ -229,13 +221,15 @@ write_out_tar_header (struct cpio_file_stat *file_hdr, int out_des)
if (name)
strcpy (tar_hdr->gname, name);
- to_oct (file_hdr->c_rdev_maj, 8, tar_hdr->devmajor);
- to_oct (file_hdr->c_rdev_min, 8, tar_hdr->devminor);
+ TO_OCT (file_hdr, c_rdev_maj, 8, tar_hdr, devmajor);
+ TO_OCT (file_hdr, c_rdev_min, 8, tar_hdr, devminor);
}
- to_oct (tar_checksum (tar_hdr), 8, tar_hdr->chksum);
+ to_ascii (tar_hdr->chksum, tar_checksum (tar_hdr), 8, LG_8, true);
tape_buffered_write ((char *) &tar_rec, out_des, TARRECORDSIZE);
+
+ return 0;
}
/* Return nonzero iff all the bytes in BLOCK are NUL.
--
2.18.1

View File

@ -1,71 +0,0 @@
From 7d55037f89ab630125c37e6fc571cf36bb0a94c3 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org.ua>
Date: Thu, 10 Nov 2016 12:48:19 +0200
Subject: [PATCH 02/15] Fix out-of-bounds read
* src/copyin.c (process_copy_in): Skip records with zero filename length.
---
src/copyin.c | 41 +++++++++++++++++++++++------------------
1 file changed, 23 insertions(+), 18 deletions(-)
diff --git a/src/copyin.c b/src/copyin.c
index cde911e..05279d2 100644
--- a/src/copyin.c
+++ b/src/copyin.c
@@ -1378,30 +1378,35 @@ process_copy_in ()
}
#endif
- /* Is this the header for the TRAILER file? */
- if (strcmp (CPIO_TRAILER_NAME, file_hdr.c_name) == 0)
+ if (file_hdr.c_namesize == 0)
+ skip_file = true;
+ else
{
- done = true;
- break;
- }
+ /* Is this the header for the TRAILER file? */
+ if (strcmp (CPIO_TRAILER_NAME, file_hdr.c_name) == 0)
+ {
+ done = true;
+ break;
+ }
- cpio_safer_name_suffix (file_hdr.c_name, false, !no_abs_paths_flag,
- false);
+ cpio_safer_name_suffix (file_hdr.c_name, false, !no_abs_paths_flag,
+ false);
- /* Does the file name match one of the given patterns? */
- if (num_patterns <= 0)
- skip_file = false;
- else
- {
- skip_file = copy_matching_files;
- for (i = 0; i < num_patterns
- && skip_file == copy_matching_files; i++)
+ /* Does the file name match one of the given patterns? */
+ if (num_patterns <= 0)
+ skip_file = false;
+ else
{
- if (fnmatch (save_patterns[i], file_hdr.c_name, 0) == 0)
- skip_file = !copy_matching_files;
+ skip_file = copy_matching_files;
+ for (i = 0; i < num_patterns
+ && skip_file == copy_matching_files; i++)
+ {
+ if (fnmatch (save_patterns[i], file_hdr.c_name, 0) == 0)
+ skip_file = !copy_matching_files;
+ }
}
}
-
+
if (skip_file)
{
/* If we're skipping a file with links, there might be other
--
1.8.3.1

View File

@ -1,25 +0,0 @@
From 404600ebb4d417238bfabf7ec1561a62dc83c168 Mon Sep 17 00:00:00 2001
From: grajagandev <dmoorefo@gmail.com>
Date: Mon, 8 Feb 2016 07:58:45 -0800
Subject: [PATCH 04/15] Fix signed integer overflow - big block sizes
---
src/main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/main.c b/src/main.c
index a13861f..5a30a7b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -321,7 +321,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
case BLOCK_SIZE_OPTION: /* --block-size */
io_block_size = atoi (arg);
- if (io_block_size < 1)
+ if (io_block_size < 1 || io_block_size > INT_MAX/512)
USAGE_ERROR ((0, 0, _("invalid block size")));
io_block_size *= 512;
break;
--
1.8.3.1

View File

@ -20,21 +20,21 @@ The format of metadata for the xattr type is:
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
--- ---
doc/cpio.texi | 3 ++ doc/cpio.texi | 3 ++
src/copyout.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++-- src/copyout.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
src/dstring.c | 26 +++++++-- src/dstring.c | 26 +++++++++--
src/dstring.h | 1 + src/dstring.h | 1 +
src/extern.h | 4 +- src/extern.h | 4 +-
src/global.c | 2 + src/global.c | 2 +
src/initramfs.h | 21 ++++++++ src/initramfs.h | 21 +++++++++
src/main.c | 22 ++++++++ src/main.c | 22 +++++++++
8 files changed, 211 insertions(+), 8 deletions(-) 8 files changed, 211 insertions(+), 8 deletions(-)
create mode 100644 src/initramfs.h create mode 100644 src/initramfs.h
diff --git a/doc/cpio.texi b/doc/cpio.texi diff --git a/doc/cpio.texi b/doc/cpio.texi
index a788b5d..df2d15d 100644 index 31a15fa..03d9585 100644
--- a/doc/cpio.texi --- a/doc/cpio.texi
+++ b/doc/cpio.texi +++ b/doc/cpio.texi
@@ -269,6 +269,9 @@ Set the I/O block size to the given @var{number} of bytes. @@ -276,6 +276,9 @@ Set the I/O block size to the given @var{number} of bytes.
@item -D @var{dir} @item -D @var{dir}
@itemx --directory=@var{dir} @itemx --directory=@var{dir}
Change to directory @var{dir} Change to directory @var{dir}
@ -45,7 +45,7 @@ index a788b5d..df2d15d 100644
Treat the archive file as local, even if its name contains colons. Treat the archive file as local, even if its name contains colons.
@item -F [[@var{user}@@]@var{host}:]@var{archive-file} @item -F [[@var{user}@@]@var{host}:]@var{archive-file}
diff --git a/src/copyout.c b/src/copyout.c diff --git a/src/copyout.c b/src/copyout.c
index 1ae5477..a7fc593 100644 index 4b7336b..fdafb37 100644
--- a/src/copyout.c --- a/src/copyout.c
+++ b/src/copyout.c +++ b/src/copyout.c
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
@ -151,7 +151,7 @@ index 1ae5477..a7fc593 100644
/* Read a list of file names from the standard input /* Read a list of file names from the standard input
and write a cpio collection on the standard output. and write a cpio collection on the standard output.
The format of the header depends on the compatibility (-c) flag. */ The format of the header depends on the compatibility (-c) flag. */
@@ -602,6 +691,8 @@ process_copy_out () @@ -603,6 +692,8 @@ process_copy_out ()
int in_file_des; /* Source file descriptor. */ int in_file_des; /* Source file descriptor. */
int out_file_des; /* Output file descriptor. */ int out_file_des; /* Output file descriptor. */
char *orig_file_name = NULL; char *orig_file_name = NULL;
@ -160,7 +160,7 @@ index 1ae5477..a7fc593 100644
/* Initialize the copy out. */ /* Initialize the copy out. */
ds_init (&input_name, 128); ds_init (&input_name, 128);
@@ -634,9 +725,37 @@ process_copy_out () @@ -635,9 +726,37 @@ process_copy_out ()
prepare_append (out_file_des); prepare_append (out_file_des);
} }
@ -199,7 +199,7 @@ index 1ae5477..a7fc593 100644
/* Check for blank line. */ /* Check for blank line. */
if (input_name.ds_string[0] == 0) if (input_name.ds_string[0] == 0)
{ {
@@ -666,8 +785,15 @@ process_copy_out () @@ -667,8 +786,15 @@ process_copy_out ()
} }
} }
} }
@ -216,8 +216,8 @@ index 1ae5477..a7fc593 100644
+ +
cpio_safer_name_suffix (input_name.ds_string, false, cpio_safer_name_suffix (input_name.ds_string, false,
!no_abs_paths_flag, true); !no_abs_paths_flag, true);
#ifndef HPUX_CDF cpio_set_c_name (&file_hdr, input_name.ds_string);
@@ -721,6 +847,7 @@ process_copy_out () @@ -700,6 +826,7 @@ process_copy_out ()
else else
{ {
add_link_defer (&file_hdr); add_link_defer (&file_hdr);
@ -225,7 +225,7 @@ index 1ae5477..a7fc593 100644
break; break;
} }
} }
@@ -857,6 +984,8 @@ process_copy_out () @@ -836,6 +963,8 @@ process_copy_out ()
fprintf (stderr, "%s\n", orig_file_name); fprintf (stderr, "%s\n", orig_file_name);
if (dot_flag) if (dot_flag)
fputc ('.', stderr); fputc ('.', stderr);
@ -234,10 +234,10 @@ index 1ae5477..a7fc593 100644
} }
} }
@@ -896,6 +1025,11 @@ process_copy_out () @@ -875,6 +1004,11 @@ process_copy_out ()
ngettext ("%lu block\n", "%lu blocks\n",
(unsigned long) blocks), (unsigned long) blocks); (unsigned long) blocks), (unsigned long) blocks);
} }
cpio_file_stat_free (&file_hdr);
+ +
+ if (metadata_type != TYPE_NONE) { + if (metadata_type != TYPE_NONE) {
+ close(metadata_fd); + close(metadata_fd);
@ -247,10 +247,10 @@ index 1ae5477..a7fc593 100644
diff --git a/src/dstring.c b/src/dstring.c diff --git a/src/dstring.c b/src/dstring.c
index 2e6b97b..2c1516e 100644 index e9c063f..1021d21 100644
--- a/src/dstring.c --- a/src/dstring.c
+++ b/src/dstring.c +++ b/src/dstring.c
@@ -60,8 +60,8 @@ ds_resize (dynamic_string *string, int size) @@ -58,8 +58,8 @@ ds_resize (dynamic_string *string, int size)
Return NULL if end of file is detected. Otherwise, Return NULL if end of file is detected. Otherwise,
Return a pointer to the null-terminated string in S. */ Return a pointer to the null-terminated string in S. */
@ -261,7 +261,7 @@ index 2e6b97b..2c1516e 100644
{ {
int insize; /* Amount needed for line. */ int insize; /* Amount needed for line. */
int strsize; /* Amount allocated for S. */ int strsize; /* Amount allocated for S. */
@@ -72,7 +72,10 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos) @@ -70,7 +70,10 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos)
strsize = s->ds_length; strsize = s->ds_length;
/* Read the input string. */ /* Read the input string. */
@ -273,7 +273,7 @@ index 2e6b97b..2c1516e 100644
while (next_ch != eos && next_ch != EOF) while (next_ch != eos && next_ch != EOF)
{ {
if (insize >= strsize - 1) if (insize >= strsize - 1)
@@ -81,7 +84,10 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos) @@ -79,7 +82,10 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos)
strsize = s->ds_length; strsize = s->ds_length;
} }
s->ds_string[insize++] = next_ch; s->ds_string[insize++] = next_ch;
@ -285,20 +285,20 @@ index 2e6b97b..2c1516e 100644
} }
s->ds_string[insize++] = '\0'; s->ds_string[insize++] = '\0';
@@ -91,6 +97,12 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos) @@ -90,6 +96,12 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos)
return s->ds_string;
} }
+char * char *
+ds_fgetstr (FILE *f, dynamic_string *s, char eos) +ds_fgetstr (FILE *f, dynamic_string *s, char eos)
+{ +{
+ return ds_fgetstr_common (f, NULL, s, eos); + return ds_fgetstr_common (f, NULL, s, eos);
+} +}
+ +
char * +char *
ds_fgets (FILE *f, dynamic_string *s) ds_fgets (FILE *f, dynamic_string *s)
{ {
@@ -102,3 +114,9 @@ ds_fgetname (FILE *f, dynamic_string *s) return ds_fgetstr (f, s, '\n');
@@ -100,3 +112,9 @@ ds_fgetname (FILE *f, dynamic_string *s)
{ {
return ds_fgetstr (f, s, '\0'); return ds_fgetstr (f, s, '\0');
} }
@ -309,7 +309,7 @@ index 2e6b97b..2c1516e 100644
+ return ds_fgetstr_common (NULL, input_string, s, eos); + return ds_fgetstr_common (NULL, input_string, s, eos);
+} +}
diff --git a/src/dstring.h b/src/dstring.h diff --git a/src/dstring.h b/src/dstring.h
index 5b49def..a0f36fb 100644 index b5135fe..f5f95ec 100644
--- a/src/dstring.h --- a/src/dstring.h
+++ b/src/dstring.h +++ b/src/dstring.h
@@ -49,3 +49,4 @@ void ds_resize (dynamic_string *string, int size); @@ -49,3 +49,4 @@ void ds_resize (dynamic_string *string, int size);
@ -318,7 +318,7 @@ index 5b49def..a0f36fb 100644
char *ds_fgetstr (FILE *f, dynamic_string *s, char eos); char *ds_fgetstr (FILE *f, dynamic_string *s, char eos);
+char *ds_sgetstr (char *input_string, dynamic_string *s, char eos); +char *ds_sgetstr (char *input_string, dynamic_string *s, char eos);
diff --git a/src/extern.h b/src/extern.h diff --git a/src/extern.h b/src/extern.h
index f9ef56a..935f8f8 100644 index 11ac6bf..f295fcf 100644
--- a/src/extern.h --- a/src/extern.h
+++ b/src/extern.h +++ b/src/extern.h
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
@ -340,7 +340,7 @@ index f9ef56a..935f8f8 100644
/* copyin.c */ /* copyin.c */
void warn_junk_bytes (long bytes_skipped); void warn_junk_bytes (long bytes_skipped);
diff --git a/src/global.c b/src/global.c diff --git a/src/global.c b/src/global.c
index 57e505a..34ea42d 100644 index fb3abe9..0c40be0 100644
--- a/src/global.c --- a/src/global.c
+++ b/src/global.c +++ b/src/global.c
@@ -199,3 +199,5 @@ char *change_directory_option; @@ -199,3 +199,5 @@ char *change_directory_option;
@ -377,10 +377,10 @@ index 0000000..88abae7
+ +
+#endif /*_LINUX_INITRAMFS_H*/ +#endif /*_LINUX_INITRAMFS_H*/
diff --git a/src/main.c b/src/main.c diff --git a/src/main.c b/src/main.c
index 72ed25d..9206917 100644 index 6f90055..e343286 100644
--- a/src/main.c --- a/src/main.c
+++ b/src/main.c +++ b/src/main.c
@@ -200,6 +200,8 @@ static struct argp_option options[] = { @@ -199,6 +199,8 @@ static struct argp_option options[] = {
{"device-independent", DEVICE_INDEPENDENT_OPTION, NULL, 0, {"device-independent", DEVICE_INDEPENDENT_OPTION, NULL, 0,
N_("Create device-independent (reproducible) archives") }, N_("Create device-independent (reproducible) archives") },
{"reproducible", 0, NULL, OPTION_ALIAS }, {"reproducible", 0, NULL, OPTION_ALIAS },
@ -389,7 +389,7 @@ index 72ed25d..9206917 100644
#undef GRID #undef GRID
/* ********** */ /* ********** */
@@ -293,6 +295,22 @@ warn_control (char *arg) @@ -292,6 +294,22 @@ warn_control (char *arg)
return 1; return 1;
} }
@ -412,7 +412,7 @@ index 72ed25d..9206917 100644
static error_t static error_t
parse_opt (int key, char *arg, struct argp_state *state) parse_opt (int key, char *arg, struct argp_state *state)
{ {
@@ -355,6 +373,10 @@ parse_opt (int key, char *arg, struct argp_state *state) @@ -354,6 +372,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
copy_matching_files = false; copy_matching_files = false;
break; break;
@ -424,5 +424,5 @@ index 72ed25d..9206917 100644
pattern_file_name = arg; pattern_file_name = arg;
break; break;
-- --
2.19.1 1.8.3.1

Binary file not shown.

View File

@ -3,10 +3,10 @@ Date: Mon, 14 Sep 2015 09:37:15 +0200
Subject: [PATCH 3/7] Support major/minor device numbers over 127 (bz#450109) Subject: [PATCH 3/7] Support major/minor device numbers over 127 (bz#450109)
diff --git a/src/copyin.c b/src/copyin.c diff --git a/src/copyin.c b/src/copyin.c
index cde911e..12bd27c 100644 index b29f348..1142d6a 100644
--- a/src/copyin.c --- a/src/copyin.c
+++ b/src/copyin.c +++ b/src/copyin.c
@@ -1196,15 +1196,15 @@ read_in_binary (struct cpio_file_stat *file_hdr, @@ -1123,15 +1123,15 @@ read_in_binary (struct cpio_file_stat *file_hdr,
swab_array ((char *) short_hdr, 13); swab_array ((char *) short_hdr, 13);
} }
@ -25,4 +25,4 @@ index cde911e..12bd27c 100644
+ file_hdr->c_rdev_min = minor ((unsigned short)short_hdr->c_rdev); + file_hdr->c_rdev_min = minor ((unsigned short)short_hdr->c_rdev);
file_hdr->c_mtime = (unsigned long) short_hdr->c_mtimes[0] << 16 file_hdr->c_mtime = (unsigned long) short_hdr->c_mtimes[0] << 16
| short_hdr->c_mtimes[1]; | short_hdr->c_mtimes[1];
file_hdr->c_filesize = (unsigned long) short_hdr->c_filesizes[0] << 16

39
cpio-2.13-exitCode.patch Normal file
View File

@ -0,0 +1,39 @@
Subject: [PATCH 2/7] set exit code to 1 when cpio fails to store file > 4GB
(#183224)
diff --git a/src/copyout.c b/src/copyout.c
index 8b0beb6..4b7336b 100644
--- a/src/copyout.c
+++ b/src/copyout.c
@@ -290,7 +290,7 @@ field_width_error (const char *filename, const char *fieldname,
{
char valbuf[UINTMAX_STRSIZE_BOUND + 1];
char maxbuf[UINTMAX_STRSIZE_BOUND + 1];
- error (0, 0, _("%s: value %s %s out of allowed range 0..%s"),
+ error (1, 0, _("%s: value %s %s out of allowed range 0..%s"),
filename, fieldname,
STRINGIFY_BIGINT (value, valbuf),
STRINGIFY_BIGINT (MAX_VAL_WITH_DIGITS (width - nul, LG_8),
diff --git a/tests/CVE-2019-14866.at b/tests/CVE-2019-14866.at
index e877b39..50ad60b 100644
--- a/tests/CVE-2019-14866.at
+++ b/tests/CVE-2019-14866.at
@@ -30,6 +30,5 @@ fi
[0],
[],
[cpio: file: value size 17179869184 out of allowed range 0..8589934591
-2 blocks
])
AT_CLEANUP
diff --git a/tests/testsuite b/tests/testsuite
index b45c731..fd8454d 100755
--- a/tests/testsuite
+++ b/tests/testsuite
@@ -2885,7 +2885,6 @@ fi
at_status=$? at_failed=false
$at_check_filter
echo >>"$at_stderr"; $as_echo "cpio: file: value size 17179869184 out of allowed range 0..8589934591
-2 blocks
" | \
$at_diff - "$at_stderr" || at_failed=:
at_fn_diff_devnull "$at_stdout" || at_failed=:

BIN
cpio-2.13.tar.bz2 Normal file

Binary file not shown.

View File

@ -1,18 +0,0 @@
From: Peter Vrabec <pvrabec@redhat.com>
Date: Mon, 14 Sep 2015 09:31:08 +0200
Subject: [PATCH 2/7] set exit code to 1 when cpio fails to store file > 4GB
(#183224)
diff --git a/src/copyout.c b/src/copyout.c
index 1f0987a..dcae449 100644
--- a/src/copyout.c
+++ b/src/copyout.c
@@ -287,7 +287,7 @@ to_ascii (char *where, uintmax_t v, size_t digits, unsigned logbase)
static void
field_width_error (const char *filename, const char *fieldname)
{
- error (0, 0, _("%s: field width not sufficient for storing %s"),
+ error (1, 0, _("%s: field width not sufficient for storing %s"),
filename, fieldname);
}

View File

@ -1,6 +1,6 @@
Name: cpio Name: cpio
Version: 2.12 Version: 2.13
Release: 16 Release: 1
Summary: A GNU archiving program Summary: A GNU archiving program
License: GPLv3+ License: GPLv3+
@ -8,17 +8,14 @@ URL: https://www.gnu.org/software/cpio
Source0: https://ftp.gnu.org/gnu/cpio/%{name}-%{version}.tar.bz2 Source0: https://ftp.gnu.org/gnu/cpio/%{name}-%{version}.tar.bz2
Patch0: cpio-2.9-rh.patch Patch0: cpio-2.9-rh.patch
Patch1: cpio-2.9-exitCode.patch Patch1: cpio-2.13-exitCode.patch
Patch2: cpio-2.9-dev_number.patch Patch2: cpio-2.13-dev_number.patch
Patch3: cpio-2.9.90-defaultremoteshell.patch Patch3: cpio-2.9.90-defaultremoteshell.patch
Patch4: cpio-2.10-patternnamesigsegv.patch Patch4: cpio-2.10-patternnamesigsegv.patch
Patch5: cpio-2.10-longnames-split.patch Patch5: cpio-2.10-longnames-split.patch
Patch6: cpio-2.11-crc-fips-nit.patch Patch6: cpio-2.11-crc-fips-nit.patch
Patch6000: Fix-out-of-bounds-read.patch Patch7: add-option-to-add-metadata-in-copy-out-mode.patch
Patch6001: Fix-signed-integer-overflow-big-block-sizes.patch Patch8: Fix-use-after-free-and-return-appropriate-error.patch
Patch6002: Fix-CVE-2019-14866.patch
Patch6003: add-option-to-add-metadata-in-copy-out-mode.patch
Patch6004: Fix-use-after-free-and-return-appropriate-error.patch
Provides: bundled(gnulib) Provides: bundled(gnulib)
Provides: /bin/cpio Provides: /bin/cpio
@ -39,7 +36,6 @@ tape, or a pipe.
%make_build %make_build
%install %install
rm -rf %RPM_BUILD_ROOT
%make_install %make_install
rm -rf %{buildroot}/usr/share/man/man8* rm -rf %{buildroot}/usr/share/man/man8*
rm -rf %{buildroot}/usr/libexec/ rm -rf %{buildroot}/usr/libexec/
@ -61,6 +57,12 @@ make check
%{_datadir}/man/man1/%{name}.1.gz %{_datadir}/man/man1/%{name}.1.gz
%changelog %changelog
* Thu Jul 30 2020 Liquor <lirui130@huawei.com> - 2.13-1
- Type:enhancement
- ID:NA
- SUG:NA
- DESC:update to 2.13
* Thu Jul 2 2020 Roberto Sassu<roberto.sassu@huawei.com> - 2.12-16 * Thu Jul 2 2020 Roberto Sassu<roberto.sassu@huawei.com> - 2.12-16
- Type:bugfix - Type:bugfix
- ID:NA - ID:NA