aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Srb <michalsrb@gmail.com>2017-03-27 19:02:15 +0300
committerMichal Srb <michalsrb@gmail.com>2017-03-27 19:02:15 +0300
commitf3afa24da144409a3c3a0e35913112583d987671 (patch)
tree3318ab59e016e6e55ec1b7d3135cc3f1f960c475
parent53f520567202928f908b5f94f6d143e7067a8bdd (diff)
downloadtigervnc-f3afa24da144409a3c3a0e35913112583d987671.tar.gz
tigervnc-f3afa24da144409a3c3a0e35913112583d987671.zip
Prevent double free by crafted fences.
If client sent fence with some data, followed by fence with no data (length 0), the original fence data were freed, but the pointer kept pointing at them. Sending one more fence would attempt to free them again.
-rw-r--r--common/rfb/SMsgWriter.cxx4
-rw-r--r--common/rfb/VNCSConnectionST.cxx1
2 files changed, 4 insertions, 1 deletions
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index cf3264e8..bc3f4398 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -101,7 +101,9 @@ void SMsgWriter::writeFence(rdr::U32 flags, unsigned len, const char data[])
os->writeU32(flags);
os->writeU8(len);
- os->writeBytes(data, len);
+
+ if (len > 0)
+ os->writeBytes(data, len);
endMsg();
}
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 0a2ca334..d2206f9b 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -666,6 +666,7 @@ void VNCSConnectionST::fence(rdr::U32 flags, unsigned len, const char data[])
fenceFlags = flags & (fenceFlagBlockBefore | fenceFlagBlockAfter | fenceFlagSyncNext);
fenceDataLen = len;
delete [] fenceData;
+ fenceData = NULL;
if (len > 0) {
fenceData = new char[len];
memcpy(fenceData, data, len);