summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Marko <peter.marko@siemens.com>2025-08-23 23:51:04 +0200
committerSteve Sakoman <steve@sakoman.com>2025-08-29 10:02:59 -0700
commit7570380173cf5059f47403428e2b2faff1247742 (patch)
tree293cd0bdd9f7c851f114ce230645dbfd6b14e0a6
parent16858730757977f208657a5cc0f090ea99939911 (diff)
downloadpoky-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.patch111
-rw-r--r--meta/recipes-extended/libarchive/libarchive_3.7.9.bb1
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 @@
1From ef093729521fcf73fa4007d5ae77adfe4df42403 Mon Sep 17 00:00:00 2001
2From: Tobias Stoeckmann <stoeckmann@users.noreply.github.com>
3Date: Mon, 7 Apr 2025 00:24:13 +0200
4Subject: [PATCH] warc: Prevent signed integer overflow (#2568)
5
6If a warc archive claims to have more than INT64_MAX - 4 content bytes,
7the inevitable failure to skip all these bytes could lead to parsing
8data which should be ignored instead.
9
10The test case contains a conversation entry with that many bytes and if
11the entry is not properly skipped, the warc implementation would read
12the conversation data as a new file entry.
13
14Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
15
16CVE: CVE-2025-5916
17Upstream-Status: Backport [https://github.com/libarchive/libarchive/commit/ef093729521fcf73fa4007d5ae77adfe4df42403]
18Signed-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
27diff --git a/Makefile.am b/Makefile.am
28index 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 \
39diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c
40index 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);
64diff --git a/libarchive/test/test_read_format_warc.c b/libarchive/test/test_read_format_warc.c
65index 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+}
96diff --git a/libarchive/test/test_read_format_warc_incomplete.warc.uu b/libarchive/test/test_read_format_warc_incomplete.warc.uu
97new file mode 100644
98index 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"
32SRC_URI = "https://libarchive.org/downloads/libarchive-${PV}.tar.gz \ 32SRC_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
37UPSTREAM_CHECK_URI = "http://libarchive.org/" 38UPSTREAM_CHECK_URI = "http://libarchive.org/"