diff options
author | Peter Marko <peter.marko@siemens.com> | 2025-08-23 23:51:04 +0200 |
---|---|---|
committer | Steve Sakoman <steve@sakoman.com> | 2025-08-29 10:02:59 -0700 |
commit | 7570380173cf5059f47403428e2b2faff1247742 (patch) | |
tree | 293cd0bdd9f7c851f114ce230645dbfd6b14e0a6 | |
parent | 16858730757977f208657a5cc0f090ea99939911 (diff) | |
download | poky-7570380173cf5059f47403428e2b2faff1247742.tar.gz |
libarchive: patch CVE-2025-5916
Pick commit per [1]
[1] https://security-tracker.debian.org/tracker/CVE-2025-5916
(From OE-Core rev: aa9adf9b4d5b0169dfe44503c247d48538d16929)
Signed-off-by: Peter Marko <peter.marko@siemens.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
-rw-r--r-- | meta/recipes-extended/libarchive/libarchive/CVE-2025-5916.patch | 111 | ||||
-rw-r--r-- | meta/recipes-extended/libarchive/libarchive_3.7.9.bb | 1 |
2 files changed, 112 insertions, 0 deletions
diff --git a/meta/recipes-extended/libarchive/libarchive/CVE-2025-5916.patch b/meta/recipes-extended/libarchive/libarchive/CVE-2025-5916.patch new file mode 100644 index 0000000000..0ea2278cb6 --- /dev/null +++ b/meta/recipes-extended/libarchive/libarchive/CVE-2025-5916.patch | |||
@@ -0,0 +1,111 @@ | |||
1 | From ef093729521fcf73fa4007d5ae77adfe4df42403 Mon Sep 17 00:00:00 2001 | ||
2 | From: Tobias Stoeckmann <stoeckmann@users.noreply.github.com> | ||
3 | Date: Mon, 7 Apr 2025 00:24:13 +0200 | ||
4 | Subject: [PATCH] warc: Prevent signed integer overflow (#2568) | ||
5 | |||
6 | If a warc archive claims to have more than INT64_MAX - 4 content bytes, | ||
7 | the inevitable failure to skip all these bytes could lead to parsing | ||
8 | data which should be ignored instead. | ||
9 | |||
10 | The test case contains a conversation entry with that many bytes and if | ||
11 | the entry is not properly skipped, the warc implementation would read | ||
12 | the conversation data as a new file entry. | ||
13 | |||
14 | Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> | ||
15 | |||
16 | CVE: CVE-2025-5916 | ||
17 | Upstream-Status: Backport [https://github.com/libarchive/libarchive/commit/ef093729521fcf73fa4007d5ae77adfe4df42403] | ||
18 | Signed-off-by: Peter Marko <peter.marko@siemens.com> | ||
19 | --- | ||
20 | Makefile.am | 1 + | ||
21 | libarchive/archive_read_support_format_warc.c | 7 ++++-- | ||
22 | libarchive/test/test_read_format_warc.c | 24 +++++++++++++++++++ | ||
23 | .../test_read_format_warc_incomplete.warc.uu | 10 ++++++++ | ||
24 | 4 files changed, 40 insertions(+), 2 deletions(-) | ||
25 | create mode 100644 libarchive/test/test_read_format_warc_incomplete.warc.uu | ||
26 | |||
27 | diff --git a/Makefile.am b/Makefile.am | ||
28 | index efc49180..f372cbcb 100644 | ||
29 | --- a/Makefile.am | ||
30 | +++ b/Makefile.am | ||
31 | @@ -964,6 +964,7 @@ libarchive_test_EXTRA_DIST=\ | ||
32 | libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu \ | ||
33 | libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu \ | ||
34 | libarchive/test/test_read_format_warc.warc.uu \ | ||
35 | + libarchive/test/test_read_format_warc_incomplete.warc.uu \ | ||
36 | libarchive/test/test_read_format_xar_doublelink.xar.uu \ | ||
37 | libarchive/test/test_read_format_xar_duplicate_filename_node.xar.uu \ | ||
38 | libarchive/test/test_read_format_zip.zip.uu \ | ||
39 | diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c | ||
40 | index fcec5bc4..696f959c 100644 | ||
41 | --- a/libarchive/archive_read_support_format_warc.c | ||
42 | +++ b/libarchive/archive_read_support_format_warc.c | ||
43 | @@ -386,7 +386,8 @@ start_over: | ||
44 | case LAST_WT: | ||
45 | default: | ||
46 | /* consume the content and start over */ | ||
47 | - _warc_skip(a); | ||
48 | + if (_warc_skip(a) < 0) | ||
49 | + return (ARCHIVE_FATAL); | ||
50 | goto start_over; | ||
51 | } | ||
52 | return (ARCHIVE_OK); | ||
53 | @@ -439,7 +440,9 @@ _warc_skip(struct archive_read *a) | ||
54 | { | ||
55 | struct warc_s *w = a->format->data; | ||
56 | |||
57 | - __archive_read_consume(a, w->cntlen + 4U/*\r\n\r\n separator*/); | ||
58 | + if (__archive_read_consume(a, w->cntlen) < 0 || | ||
59 | + __archive_read_consume(a, 4U/*\r\n\r\n separator*/) < 0) | ||
60 | + return (ARCHIVE_FATAL); | ||
61 | w->cntlen = 0U; | ||
62 | w->cntoff = 0U; | ||
63 | return (ARCHIVE_OK); | ||
64 | diff --git a/libarchive/test/test_read_format_warc.c b/libarchive/test/test_read_format_warc.c | ||
65 | index 91e6dc67..745aabff 100644 | ||
66 | --- a/libarchive/test/test_read_format_warc.c | ||
67 | +++ b/libarchive/test/test_read_format_warc.c | ||
68 | @@ -78,3 +78,27 @@ DEFINE_TEST(test_read_format_warc) | ||
69 | assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); | ||
70 | assertEqualInt(ARCHIVE_OK, archive_read_free(a)); | ||
71 | } | ||
72 | + | ||
73 | +DEFINE_TEST(test_read_format_warc_incomplete) | ||
74 | +{ | ||
75 | + const char reffile[] = "test_read_format_warc_incomplete.warc"; | ||
76 | + struct archive_entry *ae; | ||
77 | + struct archive *a; | ||
78 | + | ||
79 | + extract_reference_file(reffile); | ||
80 | + assert((a = archive_read_new()) != NULL); | ||
81 | + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); | ||
82 | + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); | ||
83 | + assertEqualIntA(a, ARCHIVE_OK, | ||
84 | + archive_read_open_filename(a, reffile, 10240)); | ||
85 | + | ||
86 | + /* Entry cannot be parsed */ | ||
87 | + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); | ||
88 | + | ||
89 | + /* Verify archive format. */ | ||
90 | + assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); | ||
91 | + | ||
92 | + /* Verify closing and resource freeing */ | ||
93 | + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); | ||
94 | + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); | ||
95 | +} | ||
96 | diff --git a/libarchive/test/test_read_format_warc_incomplete.warc.uu b/libarchive/test/test_read_format_warc_incomplete.warc.uu | ||
97 | new file mode 100644 | ||
98 | index 00000000..b91b97ef | ||
99 | --- /dev/null | ||
100 | +++ b/libarchive/test/test_read_format_warc_incomplete.warc.uu | ||
101 | @@ -0,0 +1,10 @@ | ||
102 | +begin 644 test_read_format_warc_incomplete.warc | ||
103 | +M5T%20R\Q+C`-"E=!4D,M5'EP93H@8V]N=F5R<VEO;@T*5T%20RU$871E.B`R | ||
104 | +M,#(U+3`S+3,P5#$U.C`P.C0P6@T*0V]N=&5N="U,96YG=&@Z(#DR,C,S-S(P | ||
105 | +M,S8X-30W-S4X,#<-"@T*5T%20R\Q+C`-"E=!4D,M5'EP93H@<F5S;W5R8V4- | ||
106 | +M"E=!4D,M5&%R9V5T+55223H@9FEL93HO+W)E861M92YT>'0-"E=!4D,M1&%T | ||
107 | +M93H@,C`R-2TP,RTS,%0Q-3HP,#HT,%H-"D-O;G1E;G0M5'EP93H@=&5X="]P | ||
108 | +M;&%I;@T*0V]N=&5N="U,96YG=&@Z(#,X#0H-"E1H92!R96%D;64N='AT('-H | ||
109 | +4;W5L9"!N;W0@8F4@=FES:6)L90H` | ||
110 | +` | ||
111 | +end | ||
diff --git a/meta/recipes-extended/libarchive/libarchive_3.7.9.bb b/meta/recipes-extended/libarchive/libarchive_3.7.9.bb index c091508799..1015de3fce 100644 --- a/meta/recipes-extended/libarchive/libarchive_3.7.9.bb +++ b/meta/recipes-extended/libarchive/libarchive_3.7.9.bb | |||
@@ -32,6 +32,7 @@ EXTRA_OECONF += "--enable-largefile --without-iconv" | |||
32 | SRC_URI = "https://libarchive.org/downloads/libarchive-${PV}.tar.gz \ | 32 | SRC_URI = "https://libarchive.org/downloads/libarchive-${PV}.tar.gz \ |
33 | file://CVE-2025-5914.patch \ | 33 | file://CVE-2025-5914.patch \ |
34 | file://CVE-2025-5915.patch \ | 34 | file://CVE-2025-5915.patch \ |
35 | file://CVE-2025-5916.patch \ | ||
35 | " | 36 | " |
36 | 37 | ||
37 | UPSTREAM_CHECK_URI = "http://libarchive.org/" | 38 | UPSTREAM_CHECK_URI = "http://libarchive.org/" |