diff options
author | Mauro Matteo Cascella <mcascell@redhat.com> | 2023-07-04 10:41:22 +0200 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2023-07-17 15:20:56 +0400 |
commit | d921fea338c1059a27ce7b75309d7a2e485f710b (patch) | |
tree | f239072cd590cde62cc59fa6af1db4713a5d144f /ui/vnc-clipboard.c | |
parent | 9c18a9234bab9d5e903f897b30fb4a37888aebfc (diff) | |
download | qemu-d921fea338c1059a27ce7b75309d7a2e485f710b.zip qemu-d921fea338c1059a27ce7b75309d7a2e485f710b.tar.gz qemu-d921fea338c1059a27ce7b75309d7a2e485f710b.tar.bz2 |
ui/vnc-clipboard: fix infinite loop in inflate_buffer (CVE-2023-3255)
A wrong exit condition may lead to an infinite loop when inflating a
valid zlib buffer containing some extra bytes in the `inflate_buffer`
function. The bug only occurs post-authentication. Return the buffer
immediately if the end of the compressed data has been reached
(Z_STREAM_END).
Fixes: CVE-2023-3255
Fixes: 0bf41cab ("ui/vnc: clipboard support")
Reported-by: Kevin Denis <kevin.denis@synacktiv.com>
Signed-off-by: Mauro Matteo Cascella <mcascell@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20230704084210.101822-1-mcascell@redhat.com>
Diffstat (limited to 'ui/vnc-clipboard.c')
-rw-r--r-- | ui/vnc-clipboard.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/ui/vnc-clipboard.c b/ui/vnc-clipboard.c index 8aeadfa..c759be3 100644 --- a/ui/vnc-clipboard.c +++ b/ui/vnc-clipboard.c @@ -50,8 +50,11 @@ static uint8_t *inflate_buffer(uint8_t *in, uint32_t in_len, uint32_t *size) ret = inflate(&stream, Z_FINISH); switch (ret) { case Z_OK: - case Z_STREAM_END: break; + case Z_STREAM_END: + *size = stream.total_out; + inflateEnd(&stream); + return out; case Z_BUF_ERROR: out_len <<= 1; if (out_len > (1 << 20)) { @@ -66,11 +69,6 @@ static uint8_t *inflate_buffer(uint8_t *in, uint32_t in_len, uint32_t *size) } } - *size = stream.total_out; - inflateEnd(&stream); - - return out; - err_end: inflateEnd(&stream); err: |