Blame SOURCES/0012-quic-Check-RLE-lengths.patch

3575c3
From d45a4954d73b41a255b8b4ec57c01ae87ec2936e Mon Sep 17 00:00:00 2001
3575c3
From: Frediano Ziglio <freddy77@gmail.com>
3575c3
Date: Wed, 29 Apr 2020 15:11:38 +0100
3575c3
Subject: [PATCH spice-common 3/4] quic: Check RLE lengths
3575c3
3575c3
Avoid buffer overflows decoding images. On compression we compute
3575c3
lengths till end of line so it won't cause regressions.
3575c3
Proved by fuzzing the code.
3575c3
3575c3
Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
3575c3
Acked-by: Uri Lublin <uril@redhat.com>
3575c3
---
3575c3
 common/quic_tmpl.c | 6 +++++-
3575c3
 1 file changed, 5 insertions(+), 1 deletion(-)
3575c3
3575c3
diff --git a/spice-common/common/quic_rgb_tmpl.c b/spice-common/common/quic_rgb_tmpl.c
3575c3
index 4800ece..7fdfedf 100644
3575c3
--- a/spice-common/common/quic_rgb_tmpl.c
3575c3
+++ b/spice-common/common/quic_rgb_tmpl.c
3575c3
@@ -599,7 +599,11 @@ static void FNAME(uncompress_row_seg)(Encoder *encoder,
3575c3
 do_run:
3575c3
         state->waitcnt = stopidx - i;
3575c3
         run_index = i;
3575c3
-        run_end = i + decode_run(encoder);
3575c3
+        run_end = decode_run(encoder);
3575c3
+        if (run_end < 0 || run_end > (end - i)) {
3575c3
+            encoder->usr->error(encoder->usr, "wrong RLE\n");
3575c3
+        }
3575c3
+        run_end += i;
3575c3
 
3575c3
         for (; i < run_end; i++) {
3575c3
             UNCOMPRESS_PIX_START(&cur_row[i]);
3575c3
diff --git a/spice-common/common/quic_tmpl.c b/spice-common/common/quic_tmpl.c
3575c3
index dc2f81b..7f6db92 100644
3575c3
--- a/spice-common/common/quic_tmpl.c
3575c3
+++ b/spice-common/common/quic_tmpl.c
3575c3
@@ -486,7 +486,11 @@ static void FNAME(uncompress_row_seg)(Encoder *encoder, Channel *channel,
3575c3
 do_run:
3575c3
         state->waitcnt = stopidx - i;
3575c3
         run_index = i;
3575c3
-        run_end = i + decode_channel_run(encoder, channel);
3575c3
+        run_end = decode_channel_run(encoder, channel);
3575c3
+        if (run_end < 0 || run_end > (end - i)) {
3575c3
+            encoder->usr->error(encoder->usr, "wrong RLE\n");
3575c3
+        }
3575c3
+        run_end += i;
3575c3
 
3575c3
         for (; i < run_end; i++) {
3575c3
             UNCOMPRESS_PIX_START(&cur_row[i]);
3575c3
-- 
3575c3
2.25.4
3575c3