blob: bc264a1242306520b712a1c4eadc807c38db4059 [file] [log] [blame]
Brad Bishop19323692019-04-05 15:28:33 -04001CVE: CVE-2018-1000880
2Upstream-Status: Backport
3Signed-off-by: Ross Burton <ross.burton@intel.com>
4
5From 9c84b7426660c09c18cc349f6d70b5f8168b5680 Mon Sep 17 00:00:00 2001
6From: Daniel Axtens <dja@axtens.net>
7Date: Tue, 4 Dec 2018 16:33:42 +1100
8Subject: [PATCH] warc: consume data once read
9
10The warc decoder only used read ahead, it wouldn't actually consume
11data that had previously been printed. This means that if you specify
12an invalid content length, it will just reprint the same data over
13and over and over again until it hits the desired length.
14
15This means that a WARC resource with e.g.
16Content-Length: 666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665
17but only a few hundred bytes of data, causes a quasi-infinite loop.
18
19Consume data in subsequent calls to _warc_read.
20
21Found with an AFL + afl-rb + qsym setup.
22---
23 libarchive/archive_read_support_format_warc.c | 5 +++++
24 1 file changed, 5 insertions(+)
25
26diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c
27index e8753853..e8fc8428 100644
28--- a/libarchive/archive_read_support_format_warc.c
29+++ b/libarchive/archive_read_support_format_warc.c
30@@ -386,6 +386,11 @@ _warc_read(struct archive_read *a, const void **buf, size_t *bsz, int64_t *off)
31 return (ARCHIVE_EOF);
32 }
33
34+ if (w->unconsumed) {
35+ __archive_read_consume(a, w->unconsumed);
36+ w->unconsumed = 0U;
37+ }
38+
39 rab = __archive_read_ahead(a, 1U, &nrd);
40 if (nrd < 0) {
41 *bsz = 0U;
42--
432.20.0
44