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/" |
