diff options
Diffstat (limited to 'meta/recipes-extended/cpio/cpio-2.12')
-rw-r--r-- | meta/recipes-extended/cpio/cpio-2.12/0001-Fix-segfault-with-append.patch | 100 |
1 files changed, 32 insertions, 68 deletions
diff --git a/meta/recipes-extended/cpio/cpio-2.12/0001-Fix-segfault-with-append.patch b/meta/recipes-extended/cpio/cpio-2.12/0001-Fix-segfault-with-append.patch index 2043c890cd..ec8b303c43 100644 --- a/meta/recipes-extended/cpio/cpio-2.12/0001-Fix-segfault-with-append.patch +++ b/meta/recipes-extended/cpio/cpio-2.12/0001-Fix-segfault-with-append.patch | |||
@@ -1,87 +1,51 @@ | |||
1 | Upstream-Status: Submitted [bugs-cpio] | 1 | Upstream-Status: Backport |
2 | Signed-off-by: Ross Burton <ross.burton@intel.com> | 2 | Signed-off-by: Ross Burton <ross.burton@intel.com> |
3 | 3 | ||
4 | From 3f0bd5a40ad0ceaee78c74a52a7166ed7f08db81 Mon Sep 17 00:00:00 2001 | 4 | From 32d95fe0c90c59352a0ce3102fc9866cbfb0f629 Mon Sep 17 00:00:00 2001 |
5 | From: Pavel Raiskup <praiskup@redhat.com> | 5 | From: Sergey Poznyakoff <gray@gnu.org> |
6 | Date: Thu, 29 Nov 2018 07:03:48 +0100 | 6 | Date: Sat, 1 Dec 2018 11:40:02 +0200 |
7 | Subject: [PATCH] Fix segfault with --append | 7 | Subject: [PATCH] Fix sigfault when appending to archive |
8 | 8 | ||
9 | The --append mode combines both process_copy_in() and | 9 | Bug reported by Ross Burton. See |
10 | process_copy_out() methods, each of them working with different | 10 | <http://lists.gnu.org/archive/html/bug-cpio/2018-11/msg00000.html> |
11 | (local) file_hdr->c_name buffers. So ensure that | ||
12 | cpio_set_c_name() isn't using the same static variable for | ||
13 | maintaining length of different buffers. | ||
14 | 11 | ||
15 | Complements d36ec5f4e93130efb24fb9. Thanks to Ross Burton. | 12 | * src/util.c: Keep static copy of the buffer pointer; always |
16 | 13 | assign it to file_hdr->c_name. Use x2realloc for memory management. | |
17 | * src/copyin.c (process_copy_in): Always initialize file_hdr. | ||
18 | * src/copyout.c (process_copy_out): Likewise. | ||
19 | * src/cpiohdr.h (cpio_file_stat): Add c_name_buflen variable. | ||
20 | * src/util.c (cpio_set_c_name): Use file_hdr->c_name_buflen. | ||
21 | --- | 14 | --- |
22 | src/copyin.c | 1 + | 15 | src/util.c | 17 ++++------------- |
23 | src/copyout.c | 1 + | 16 | 1 file changed, 4 insertions(+), 13 deletions(-) |
24 | src/cpiohdr.h | 1 + | ||
25 | src/util.c | 3 ++- | ||
26 | 4 files changed, 5 insertions(+), 1 deletion(-) | ||
27 | 17 | ||
28 | diff --git a/src/copyin.c b/src/copyin.c | ||
29 | index ba887ae..767c2f8 100644 | ||
30 | --- a/src/copyin.c | ||
31 | +++ b/src/copyin.c | ||
32 | @@ -1213,6 +1213,7 @@ process_copy_in () | ||
33 | |||
34 | newdir_umask = umask (0); /* Reset umask to preserve modes of | ||
35 | created files */ | ||
36 | + memset (&file_hdr, 0, sizeof (struct cpio_file_stat)); | ||
37 | |||
38 | /* Initialize the copy in. */ | ||
39 | if (pattern_file_name) | ||
40 | diff --git a/src/copyout.c b/src/copyout.c | ||
41 | index 7532dac..fb890cb 100644 | ||
42 | --- a/src/copyout.c | ||
43 | +++ b/src/copyout.c | ||
44 | @@ -594,6 +594,7 @@ process_copy_out () | ||
45 | |||
46 | /* Initialize the copy out. */ | ||
47 | ds_init (&input_name, 128); | ||
48 | + memset (&file_hdr, 0, sizeof (struct cpio_file_stat)); | ||
49 | file_hdr.c_magic = 070707; | ||
50 | |||
51 | /* Check whether the output file might be a tape. */ | ||
52 | diff --git a/src/cpiohdr.h b/src/cpiohdr.h | ||
53 | index 588135b..cf64f3e 100644 | ||
54 | --- a/src/cpiohdr.h | ||
55 | +++ b/src/cpiohdr.h | ||
56 | @@ -127,6 +127,7 @@ struct cpio_file_stat /* Internal representation of a CPIO header */ | ||
57 | uint32_t c_chksum; | ||
58 | char *c_name; | ||
59 | char *c_tar_linkname; | ||
60 | + size_t c_name_buflen; | ||
61 | }; | ||
62 | |||
63 | void cpio_set_c_name(struct cpio_file_stat *file_hdr, char *name); | ||
64 | diff --git a/src/util.c b/src/util.c | 18 | diff --git a/src/util.c b/src/util.c |
65 | index 10486dc..1256469 100644 | 19 | index 10486dc..4e49124 100644 |
66 | --- a/src/util.c | 20 | --- a/src/util.c |
67 | +++ b/src/util.c | 21 | +++ b/src/util.c |
68 | @@ -1413,7 +1413,7 @@ set_file_times (int fd, | 22 | @@ -1413,22 +1413,13 @@ set_file_times (int fd, |
69 | void | 23 | void |
70 | cpio_set_c_name (struct cpio_file_stat *file_hdr, char *name) | 24 | cpio_set_c_name (struct cpio_file_stat *file_hdr, char *name) |
71 | { | 25 | { |
72 | - static size_t buflen = 0; | 26 | + static char *buf = NULL; |
73 | + size_t buflen = file_hdr->c_name_buflen; | 27 | static size_t buflen = 0; |
74 | size_t len = strlen (name) + 1; | 28 | size_t len = strlen (name) + 1; |
75 | 29 | ||
76 | if (buflen == 0) | 30 | - if (buflen == 0) |
77 | @@ -1430,6 +1430,7 @@ cpio_set_c_name (struct cpio_file_stat *file_hdr, char *name) | 31 | - { |
78 | } | 32 | - buflen = len; |
79 | 33 | - if (buflen < 32) | |
34 | - buflen = 32; | ||
35 | - file_hdr->c_name = xmalloc (buflen); | ||
36 | - } | ||
37 | - else if (buflen < len) | ||
38 | - { | ||
39 | - buflen = len; | ||
40 | - file_hdr->c_name = xrealloc (file_hdr->c_name, buflen); | ||
41 | - } | ||
42 | - | ||
43 | + while (buflen < len) | ||
44 | + buf = x2realloc (buf, &buflen); | ||
45 | + file_hdr->c_name = buf; | ||
80 | file_hdr->c_namesize = len; | 46 | file_hdr->c_namesize = len; |
81 | + file_hdr->c_name_buflen = buflen; | ||
82 | memmove (file_hdr->c_name, name, len); | 47 | memmove (file_hdr->c_name, name, len); |
83 | } | 48 | } |
84 | |||
85 | -- | 49 | -- |
86 | 2.11.0 | 50 | 2.18.0 |
87 | 51 | ||