|
|
9ae3a8 |
From 3be810287878138e5f72568d1ba1160b5bad22f8 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
From: "Daniel P. Berrange" <berrange@redhat.com>
|
|
|
9ae3a8 |
Date: Thu, 8 Feb 2018 17:50:32 +0100
|
|
|
9ae3a8 |
Subject: [PATCH 18/27] ui: track how much decoded data we consumed when doing
|
|
|
9ae3a8 |
SASL encoding
|
|
|
9ae3a8 |
MIME-Version: 1.0
|
|
|
9ae3a8 |
Content-Type: text/plain; charset=UTF-8
|
|
|
9ae3a8 |
Content-Transfer-Encoding: 8bit
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Daniel P. Berrange <berrange@redhat.com>
|
|
|
9ae3a8 |
Message-id: <20180208175041.5634-19-berrange@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 78951
|
|
|
9ae3a8 |
O-Subject: [RHEL-7.5 qemu-kvm PATCH v1 18/27] ui: track how much decoded data we consumed when doing SASL encoding
|
|
|
9ae3a8 |
Bugzilla: 1527405
|
|
|
9ae3a8 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
From: "Daniel P. Berrange" <berrange@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
When we encode data for writing with SASL, we encode the entire pending output
|
|
|
9ae3a8 |
buffer. The subsequent write, however, may not be able to send the full encoded
|
|
|
9ae3a8 |
data in one go though, particularly with a slow network. So we delay setting the
|
|
|
9ae3a8 |
output buffer offset back to zero until all the SASL encoded data is sent.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Between encoding the data and completing sending of the SASL encoded data,
|
|
|
9ae3a8 |
however, more data might have been placed on the pending output buffer. So it
|
|
|
9ae3a8 |
is not valid to set offset back to zero. Instead we must keep track of how much
|
|
|
9ae3a8 |
data we consumed during encoding and subtract only that amount.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
With the current bug we would be throwing away some pending data without having
|
|
|
9ae3a8 |
sent it at all. By sheer luck this did not previously cause any serious problem
|
|
|
9ae3a8 |
because appending data to the send buffer is always an atomic action, so we
|
|
|
9ae3a8 |
only ever throw away complete RFB protocol messages. In the case of frame buffer
|
|
|
9ae3a8 |
updates we'd catch up fairly quickly, so no obvious problem was visible.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RHEL-7 note: context difference in the last argument to
|
|
|
9ae3a8 |
vnc_client_io_error() due to downstream lacking commit 04d2529da27d
|
|
|
9ae3a8 |
("ui: convert VNC server to use QIOChannelSocket", 2015-12-18).
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
|
|
9ae3a8 |
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
|
|
|
9ae3a8 |
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
|
9ae3a8 |
Message-id: 20171218191228.31018-6-berrange@redhat.com
|
|
|
9ae3a8 |
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit 8f61f1c5a6bc06438a1172efa80bc7606594fa07)
|
|
|
9ae3a8 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
ui/vnc-auth-sasl.c | 3 ++-
|
|
|
9ae3a8 |
ui/vnc-auth-sasl.h | 1 +
|
|
|
9ae3a8 |
2 files changed, 3 insertions(+), 1 deletion(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
|
|
|
9ae3a8 |
index f3ad75d..804b8e7 100644
|
|
|
9ae3a8 |
--- a/ui/vnc-auth-sasl.c
|
|
|
9ae3a8 |
+++ b/ui/vnc-auth-sasl.c
|
|
|
9ae3a8 |
@@ -64,6 +64,7 @@ long vnc_client_write_sasl(VncState *vs)
|
|
|
9ae3a8 |
if (err != SASL_OK)
|
|
|
9ae3a8 |
return vnc_client_io_error(vs, -1, EIO);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ vs->sasl.encodedRawLength = vs->output.offset;
|
|
|
9ae3a8 |
vs->sasl.encodedOffset = 0;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
@@ -75,7 +76,7 @@ long vnc_client_write_sasl(VncState *vs)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
vs->sasl.encodedOffset += ret;
|
|
|
9ae3a8 |
if (vs->sasl.encodedOffset == vs->sasl.encodedLength) {
|
|
|
9ae3a8 |
- vs->output.offset = 0;
|
|
|
9ae3a8 |
+ vs->output.offset -= vs->sasl.encodedRawLength;
|
|
|
9ae3a8 |
vs->sasl.encoded = NULL;
|
|
|
9ae3a8 |
vs->sasl.encodedOffset = vs->sasl.encodedLength = 0;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
diff --git a/ui/vnc-auth-sasl.h b/ui/vnc-auth-sasl.h
|
|
|
9ae3a8 |
index 8091d68..4ec6fb5 100644
|
|
|
9ae3a8 |
--- a/ui/vnc-auth-sasl.h
|
|
|
9ae3a8 |
+++ b/ui/vnc-auth-sasl.h
|
|
|
9ae3a8 |
@@ -54,6 +54,7 @@ struct VncStateSASL {
|
|
|
9ae3a8 |
*/
|
|
|
9ae3a8 |
const uint8_t *encoded;
|
|
|
9ae3a8 |
unsigned int encodedLength;
|
|
|
9ae3a8 |
+ unsigned int encodedRawLength;
|
|
|
9ae3a8 |
unsigned int encodedOffset;
|
|
|
9ae3a8 |
char *username;
|
|
|
9ae3a8 |
char *mechlist;
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.8.3.1
|
|
|
9ae3a8 |
|