forked from pool/tigervnc
d27e09437d
* Fix zlib stream reset in tight encoding. (bnc#963417) OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/tigervnc?expand=0&rev=89
160 lines
4.0 KiB
Diff
160 lines
4.0 KiB
Diff
From 6f318e4451fcb45054408eaf568ca1c30c2d1ab6 Mon Sep 17 00:00:00 2001
|
|
From: Pierre Ossman <ossman@cendio.se>
|
|
Date: Wed, 11 Nov 2015 13:11:09 +0100
|
|
Subject: [PATCH] Clear up ZlibInStream::reset() behaviour
|
|
|
|
It previously only did a reset of the ZlibInStream object, not the
|
|
underlying zlib stream. It also had the side effect of flushing
|
|
the underlying stream and disassociating from it.
|
|
|
|
Clear things up by changing the naming, and introducing a proper
|
|
reset function (which is needed by the Tight decoder).
|
|
|
|
Index: tigervnc-1.5.0/common/rdr/ZlibInStream.cxx
|
|
===================================================================
|
|
--- tigervnc-1.5.0.orig/common/rdr/ZlibInStream.cxx
|
|
+++ tigervnc-1.5.0/common/rdr/ZlibInStream.cxx
|
|
@@ -16,6 +16,8 @@
|
|
* USA.
|
|
*/
|
|
|
|
+#include <assert.h>
|
|
+
|
|
#include <rdr/ZlibInStream.h>
|
|
#include <rdr/Exception.h>
|
|
#include <zlib.h>
|
|
@@ -26,26 +28,16 @@ enum { DEFAULT_BUF_SIZE = 16384 };
|
|
|
|
ZlibInStream::ZlibInStream(int bufSize_)
|
|
: underlying(0), bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0),
|
|
- bytesIn(0)
|
|
+ zs(NULL), bytesIn(0)
|
|
{
|
|
- zs = new z_stream;
|
|
- zs->zalloc = Z_NULL;
|
|
- zs->zfree = Z_NULL;
|
|
- zs->opaque = Z_NULL;
|
|
- zs->next_in = Z_NULL;
|
|
- zs->avail_in = 0;
|
|
- if (inflateInit(zs) != Z_OK) {
|
|
- delete zs;
|
|
- throw Exception("ZlibInStream: inflateInit failed");
|
|
- }
|
|
ptr = end = start = new U8[bufSize];
|
|
+ init();
|
|
}
|
|
|
|
ZlibInStream::~ZlibInStream()
|
|
{
|
|
+ deinit();
|
|
delete [] start;
|
|
- inflateEnd(zs);
|
|
- delete zs;
|
|
}
|
|
|
|
void ZlibInStream::setUnderlying(InStream* is, int bytesIn_)
|
|
@@ -60,7 +52,7 @@ int ZlibInStream::pos()
|
|
return offset + ptr - start;
|
|
}
|
|
|
|
-void ZlibInStream::reset()
|
|
+void ZlibInStream::removeUnderlying()
|
|
{
|
|
ptr = end = start;
|
|
if (!underlying) return;
|
|
@@ -72,6 +64,38 @@ void ZlibInStream::reset()
|
|
underlying = 0;
|
|
}
|
|
|
|
+void ZlibInStream::reset()
|
|
+{
|
|
+ deinit();
|
|
+ init();
|
|
+}
|
|
+
|
|
+void ZlibInStream::init()
|
|
+{
|
|
+ assert(zs == NULL);
|
|
+
|
|
+ zs = new z_stream;
|
|
+ zs->zalloc = Z_NULL;
|
|
+ zs->zfree = Z_NULL;
|
|
+ zs->opaque = Z_NULL;
|
|
+ zs->next_in = Z_NULL;
|
|
+ zs->avail_in = 0;
|
|
+ if (inflateInit(zs) != Z_OK) {
|
|
+ delete zs;
|
|
+ zs = NULL;
|
|
+ throw Exception("ZlibInStream: inflateInit failed");
|
|
+ }
|
|
+}
|
|
+
|
|
+void ZlibInStream::deinit()
|
|
+{
|
|
+ assert(zs != NULL);
|
|
+ removeUnderlying();
|
|
+ inflateEnd(zs);
|
|
+ delete zs;
|
|
+ zs = NULL;
|
|
+}
|
|
+
|
|
int ZlibInStream::overrun(int itemSize, int nItems, bool wait)
|
|
{
|
|
if (itemSize > bufSize)
|
|
Index: tigervnc-1.5.0/common/rdr/ZlibInStream.h
|
|
===================================================================
|
|
--- tigervnc-1.5.0.orig/common/rdr/ZlibInStream.h
|
|
+++ tigervnc-1.5.0/common/rdr/ZlibInStream.h
|
|
@@ -38,11 +38,15 @@ namespace rdr {
|
|
virtual ~ZlibInStream();
|
|
|
|
void setUnderlying(InStream* is, int bytesIn);
|
|
- void reset();
|
|
+ void removeUnderlying();
|
|
int pos();
|
|
+ void reset();
|
|
|
|
private:
|
|
|
|
+ void init();
|
|
+ void deinit();
|
|
+
|
|
int overrun(int itemSize, int nItems, bool wait);
|
|
bool decompress(bool wait);
|
|
|
|
Index: tigervnc-1.5.0/common/rfb/zrleDecode.h
|
|
===================================================================
|
|
--- tigervnc-1.5.0.orig/common/rfb/zrleDecode.h
|
|
+++ tigervnc-1.5.0/common/rfb/zrleDecode.h
|
|
@@ -177,7 +177,7 @@ void ZRLE_DECODE (const Rect& r, rdr::In
|
|
}
|
|
}
|
|
|
|
- zis->reset();
|
|
+ zis->removeUnderlying();
|
|
}
|
|
|
|
#undef ZRLE_DECODE
|
|
Index: tigervnc-1.5.0/common/rfb/tightDecode.h
|
|
===================================================================
|
|
--- tigervnc-1.5.0.orig/common/rfb/tightDecode.h
|
|
+++ tigervnc-1.5.0/common/rfb/tightDecode.h
|
|
@@ -59,7 +59,7 @@ void TIGHT_DECODE (const Rect& r)
|
|
|
|
rdr::U8 comp_ctl = is->readU8();
|
|
|
|
- // Flush zlib streams if we are told by the server to do so.
|
|
+ // Reset zlib streams if we are told by the server to do so.
|
|
for (int i = 0; i < 4; i++) {
|
|
if (comp_ctl & 1) {
|
|
zis[i].reset();
|
|
@@ -231,7 +231,7 @@ void TIGHT_DECODE (const Rect& r)
|
|
delete [] netbuf;
|
|
|
|
if (streamId != -1) {
|
|
- zis[streamId].reset();
|
|
+ zis[streamId].removeUnderlying();
|
|
}
|
|
}
|
|
|