Date: Thursday, February 15, 2018 @ 01:14:13 Author: bisson Revision: 317074
archrelease: copy trunk to extra-x86_64 Added: x11vnc/repos/extra-x86_64/PKGBUILD (from rev 317073, x11vnc/trunk/PKGBUILD) x11vnc/repos/extra-x86_64/cursor.patch (from rev 317073, x11vnc/trunk/cursor.patch) x11vnc/repos/extra-x86_64/fix-buffer-overflows.patch (from rev 317073, x11vnc/trunk/fix-buffer-overflows.patch) x11vnc/repos/extra-x86_64/openssl-detect.patch (from rev 317073, x11vnc/trunk/openssl-detect.patch) x11vnc/repos/extra-x86_64/openssl-support.patch (from rev 317073, x11vnc/trunk/openssl-support.patch) x11vnc/repos/extra-x86_64/service (from rev 317073, x11vnc/trunk/service) Deleted: x11vnc/repos/extra-x86_64/PKGBUILD x11vnc/repos/extra-x86_64/cursor.patch x11vnc/repos/extra-x86_64/fix-buffer-overflows.patch x11vnc/repos/extra-x86_64/openssl-detect.patch x11vnc/repos/extra-x86_64/openssl-support.patch x11vnc/repos/extra-x86_64/service ----------------------------+ PKGBUILD | 86 +-- cursor.patch | 562 ++++++++++++------------- fix-buffer-overflows.patch | 52 +- openssl-detect.patch | 68 +-- openssl-support.patch | 962 +++++++++++++++++++++---------------------- service | 14 6 files changed, 864 insertions(+), 880 deletions(-) Deleted: PKGBUILD =================================================================== --- PKGBUILD 2018-02-15 01:13:13 UTC (rev 317073) +++ PKGBUILD 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,51 +0,0 @@ -# $Id$ -# Maintainer: Gaetan Bisson <bis...@archlinux.org> -# Contributor: damir <da...@archlinux.org> - -pkgname=x11vnc -epoch=1 -pkgver=0.9.14 -pkgrel=4 -pkgdesc='VNC server for real X displays' -url='https://github.com/LibVNC/x11vnc' -arch=('x86_64') -license=('GPL2') -optdepends=('tk: GUI support' - 'net-tools: -auth guess' - 'xf86-video-dummy: Xdummy script') -depends=('libvncserver' 'openssl' 'libjpeg' 'libxtst' 'libxinerama' - 'libxdamage' 'libxrandr' 'avahi' 'xorg-xdpyinfo') -source=("https://github.com/LibVNC/x11vnc/archive/${pkgver}.tar.gz" - 'fix-buffer-overflows.patch' - 'openssl-detect.patch' - 'openssl-support.patch' - 'cursor.patch' - 'service') -sha256sums=('45f87c5e4382988c73e8c7891ac2bfb45d8f9ce1196ae06651c84636684ea143' - '1d19edf54c6216b830150e5b05175a81ee8be3288d8584d3de0276df9a38384e' - 'f356009176a11a793fef4514b26468c04908c961e6be226a83b631b6df5a2fdc' - 'f9cafe56cb878b067bc95c6bd84aa8d480af6400bea836d87a08e24e0c4eca0b' - '0559a163f62c308a993a911f5ced5d00cd20afd3e267e9057fe37a2436768f62' - 'cfb19d44e09e960e2fdb958c9258bccf23c2677715314985f7e819f1dcedb6e4') - -prepare() { - cd "${srcdir}/${pkgname}-${pkgver}" - patch -p1 -i ../fix-buffer-overflows.patch - patch -p1 -i ../openssl-detect.patch - patch -p1 -i ../openssl-support.patch - patch -p1 -i ../cursor.patch - autoreconf -fi -} - -build() { - cd "${srcdir}/${pkgname}-${pkgver}" - ./configure --prefix=/usr --mandir=/usr/share/man - make -} - -package() { - cd "${srcdir}/${pkgname}-${pkgver}" - make DESTDIR="${pkgdir}" install - install misc/{rx11vnc,Xdummy} "${pkgdir}"/usr/bin - install -Dm644 ../service "${pkgdir}/usr/lib/systemd/system/x11vnc.service" -} Copied: x11vnc/repos/extra-x86_64/PKGBUILD (from rev 317073, x11vnc/trunk/PKGBUILD) =================================================================== --- PKGBUILD (rev 0) +++ PKGBUILD 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,35 @@ +# $Id$ +# Maintainer: Gaetan Bisson <bis...@archlinux.org> +# Contributor: damir <da...@archlinux.org> + +pkgname=x11vnc +epoch=1 +pkgver=0.9.15 +pkgrel=1 +pkgdesc='VNC server for real X displays' +url='https://github.com/LibVNC/x11vnc' +arch=('x86_64') +license=('GPL2') +optdepends=('tk: GUI support' + 'net-tools: -auth guess' + 'xf86-video-dummy: Xdummy script') +depends=('libvncserver' 'openssl' 'libjpeg' 'libxtst' 'libxinerama' + 'libxdamage' 'libxrandr' 'avahi' 'xorg-xdpyinfo') +source=("https://github.com/LibVNC/x11vnc/archive/${pkgver}.tar.gz" + 'service') +sha256sums=('3e43bd875edc3c7f52a0d3676c4ec7de910fcd210240ee20b4522deb2bf84cff' + 'cfb19d44e09e960e2fdb958c9258bccf23c2677715314985f7e819f1dcedb6e4') + +build() { + cd "${srcdir}/${pkgname}-${pkgver}" + autoreconf -fi + ./configure --prefix=/usr --mandir=/usr/share/man + make +} + +package() { + cd "${srcdir}/${pkgname}-${pkgver}" + make DESTDIR="${pkgdir}" install + install misc/{rx11vnc,Xdummy} "${pkgdir}"/usr/bin + install -Dm644 ../service "${pkgdir}/usr/lib/systemd/system/x11vnc.service" +} Deleted: cursor.patch =================================================================== --- cursor.patch 2018-02-15 01:13:13 UTC (rev 317073) +++ cursor.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,281 +0,0 @@ -From 37c946191a0f36490531624a2d03ec1ce7c714ac Mon Sep 17 00:00:00 2001 -From: Stephan Fuhrmann <stfu...@freenet.de> -Date: Tue, 18 Jul 2017 11:28:25 +0200 -Subject: [PATCH] Broken cursor bugfix for 64 bit systems (#49) - -* Proper 32 bit types assigned - -* The size dependent conversions are not necessary if input type is 32 bit in every case - -* Unused variable - -* Another type problem 32/64 fixed - -* Prototype fixed - -* Pointer cast missing - -* * Multiple conversions from (unsigned long*) to proper (uint32_t*). -* Bugfix for XFixesCursorImage type problem. Structure contains (unsigned long*), but protocol says the pixels are just 32 bit. - This is a problem for 64 bit systems where (unsigned long) is 64 bits wide. ---- - src/cursor.c | 79 ++++++++++++++++++++++++------------------------------------ - src/cursor.h | 3 +-- - src/screen.c | 28 ++++++++++----------- - 3 files changed, 45 insertions(+), 65 deletions(-) - -diff --git a/src/cursor.c b/src/cursor.c -index 8c14b6c..6e135be 100644 ---- a/src/cursor.c -+++ b/src/cursor.c -@@ -68,7 +68,7 @@ void set_no_cursor(void); - void set_warrow_cursor(void); - int set_cursor(int x, int y, int which); - int check_x11_pointer(void); --int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, int xhot, int yhot); -+int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, int xhot, int yhot); - unsigned long get_cursor_serial(int mode); - rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, int xhot, int yhot, int Bpp); - void save_under_cursor_buffer(rfbClientPtr cl); -@@ -1008,14 +1008,13 @@ void initialize_xfixes(void) { - rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, - int xhot, int yhot, int Bpp) { - rfbCursorPtr c; -- static unsigned long black = 0, white = 1; -+ static uint32_t black = 0, white = 1; - static int first = 1; - char *bitmap, *rich, *alpha; - char *pixels_new = NULL; - int n_opaque, n_trans, n_alpha, len, histo[256]; - int send_alpha = 0, alpha_shift = 0, thresh; - int i, x, y; -- - if (first && dpy) { /* raw_fb hack */ - X_LOCK; - black = BlackPixel(dpy, scr); -@@ -1033,7 +1032,6 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, - if (scaling_cursor && (scale_cursor_fac_x != 1.0 || scale_cursor_fac_y != 1.0)) { - int W, H; - char *pixels_use = (char *) pixels; -- unsigned int *pixels32 = NULL; - - W = w; - H = h; -@@ -1043,48 +1041,10 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, - - pixels_new = (char *) malloc(4*w*h); - -- if (sizeof(unsigned long) == 8) { -- int i, j, k = 0; -- /* -- * to avoid 64bpp code in scale_rect() we knock -- * down to unsigned int on 64bit machines: -- */ -- pixels32 = (unsigned int*) malloc(4*W*H); -- for (j=0; j<H; j++) { -- for (i=0; i<W; i++) { -- *(pixels32+k) = 0xffffffff & (*(pixels+k)); -- k++; -- } -- } -- pixels_use = (char *) pixels32; -- } -- - scale_rect(scale_cursor_fac_x, scale_cursor_fac_y, scaling_cursor_blend, - scaling_cursor_interpolate, - 4, pixels_use, 4*W, pixels_new, 4*w, - W, H, w, h, 0, 0, W, H, 0); -- -- if (sizeof(unsigned long) == 8) { -- int i, j, k = 0; -- unsigned long *pixels64; -- unsigned int* source = (unsigned int*) pixels_new; -- /* -- * now knock it back up to unsigned long: -- */ -- pixels64 = (unsigned long*) malloc(8*w*h); -- for (j=0; j<h; j++) { -- for (i=0; i<w; i++) { -- *(pixels64+k) = (unsigned long) (*(source+k)); -- k++; -- } -- } -- free(pixels_new); -- pixels_new = (char *) pixels64; -- if (pixels32) { -- free(pixels32); -- pixels32 = NULL; -- } -- } - - pixels = (uint32_t *) pixels_new; - -@@ -1111,7 +1071,7 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, - i = 0; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { -- unsigned long a; -+ uint32_t a; - - a = 0xff000000 & (*(pixels+i)); - a = a >> 24; /* alpha channel */ -@@ -1154,8 +1114,8 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, - i = 0; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { -- unsigned long r, g, b, a; -- unsigned int ui; -+ uint32_t r, g, b, a; -+ uint32_t ui; - char *p; - - a = 0xff000000 & (*(pixels+i)); -@@ -1322,6 +1282,7 @@ static int get_exact_cursor(int init) { - } - if (xfixes_present && dpy) { - #if HAVE_LIBXFIXES -+ uint32_t *pixel32 = NULL; - int last_idx = (int) get_cursor_serial(1); - XFixesCursorImage *xfc; - -@@ -1350,15 +1311,37 @@ static int get_exact_cursor(int init) { - - /* retrieve the cursor info + pixels from server: */ - xfc = XFixesGetCursorImage(dpy); -+ { -+ /* 2017-07-09, Stephan Fuhrmann: This fixes an implementation flaw for 64 bit systems. -+ * The XFixesCursorImage structure says xfc->pixels is (unsigned long*) in the structure, but -+ * the protocol spec says it's 32 bit per pixel -+ * (https://www.x.org/releases/X11R7.6/doc/fixesproto/fixesproto.txt). -+ * I'm converting the data anyway to 32 bit to be sure. Only necessary for 64 bit systems, -+ * but doing it anyway for 32 bit. -+ * */ -+ int x,y; -+ pixel32 = malloc(xfc->width * xfc->height * sizeof(uint32_t)); -+ for (y = 0; y < xfc->height; y++) { -+ for (x = 0; x < xfc->width; x++) { -+ uint32_t ofs = x + y*xfc->width; -+ *(pixel32 + ofs) = *(xfc->pixels + ofs); -+ } -+ } -+ } -+ - X_UNLOCK; - if (! xfc) { - /* failure. */ - return which; - } - -- which = store_cursor(xfc->cursor_serial, xfc->pixels, -+ which = store_cursor(xfc->cursor_serial, pixel32, - xfc->width, xfc->height, 32, xfc->xhot, xfc->yhot); - -+ if (pixel32 != NULL) { -+ free(pixel32); -+ } -+ - X_LOCK; - XFree_wr(xfc); - X_UNLOCK; -@@ -1367,7 +1350,7 @@ static int get_exact_cursor(int init) { - return(which); - } - --int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, -+int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, - int xhot, int yhot) { - int which = CURS_ARROW; - int use, oldest, i; -@@ -1453,7 +1436,7 @@ fprintf(stderr, "sc: %d %d/%d %d - %d %d\n", serial, w, h, cbpp, xhot, yhot); - } - - /* place cursor into our collection */ -- cursors[use]->rfb = pixels2curs((uint32_t*)data, w, h, xhot, yhot, bpp/8); -+ cursors[use]->rfb = pixels2curs(data, w, h, xhot, yhot, bpp/8); - - /* update time and serial index: */ - curs_times[use] = now; -diff --git a/src/cursor.h b/src/cursor.h -index 0cd42d1..e8ed248 100644 ---- a/src/cursor.h -+++ b/src/cursor.h -@@ -47,7 +47,6 @@ extern int alpha_blend; - extern int alt_arrow; - extern int alt_arrow_max; - -- - extern void first_cursor(void); - extern void setup_cursors_and_push(void); - extern void initialize_xfixes(void); -@@ -64,7 +63,7 @@ extern void set_no_cursor(void); - extern void set_warrow_cursor(void); - extern int set_cursor(int x, int y, int which); - extern int check_x11_pointer(void); --extern int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, int xhot, int yhot); -+extern int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, int xhot, int yhot); - extern unsigned long get_cursor_serial(int mode); - extern rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, int xhot, int yhot, int Bpp); - void save_under_cursor_buffer(rfbClientPtr cl); -diff --git a/src/screen.c b/src/screen.c -index bda4690..395b503 100644 ---- a/src/screen.c -+++ b/src/screen.c -@@ -1206,10 +1206,10 @@ void vnc_reflect_got_update(rfbClient *cl, int x, int y, int w, int h) { - void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, int height, int bytesPerPixel) { - static int serial = 1; - int i, j; -- char *pixels = NULL; -- unsigned long r, g, b; -- unsigned int ui = 0; -- unsigned long red_mask, green_mask, blue_mask; -+ uint32_t *pixels = NULL; -+ uint32_t r, g, b; -+ uint32_t ui = 0; -+ uint32_t red_mask, green_mask, blue_mask; - - if (cl) {} - if (unixpw_in_progress) { -@@ -1230,21 +1230,20 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i - green_mask = (client->format.greenMax << client->format.greenShift); - blue_mask = (client->format.blueMax << client->format.blueShift); - -- pixels = (char *)malloc(4*width*height); -+ pixels = (uint32_t *)malloc(4*width*height); - for (j=0; j<height; j++) { - for (i=0; i<width; i++) { -- unsigned int* uip; - unsigned char* uic; - int m; - if (bytesPerPixel == 1) { -- unsigned char* p = (unsigned char *) client->rcSource; -- ui = (unsigned long) *(p + j * width + i); -+ uint8_t* p = (uint8_t *) client->rcSource; -+ ui = (uint32_t) *(p + j * width + i); - } else if (bytesPerPixel == 2) { -- unsigned short* p = (unsigned short *) client->rcSource; -- ui = (unsigned long) *(p + j * width + i); -+ uint16_t* p = (uint16_t *) client->rcSource; -+ ui = (uint32_t) *(p + j * width + i); - } else if (bytesPerPixel == 4) { -- unsigned int* p = (unsigned int *) client->rcSource; -- ui = (unsigned long) *(p + j * width + i); -+ uint32_t* p = (uint32_t *) client->rcSource; -+ ui = (uint32_t) *(p + j * width + i); - } - r = (red_mask & ui) >> client->format.redShift; - g = (green_mask & ui) >> client->format.greenShift; -@@ -1261,12 +1260,11 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i - if (m) { - ui |= 0xff000000; - } -- uip = (unsigned int *)pixels; -- *(uip + j * width + i) = ui; -+ *(pixels + j * width + i) = ui; - } - } - -- store_cursor(serial++, (unsigned long*) pixels, width, height, 32, xhot, yhot); -+ store_cursor(serial++, pixels, width, height, 32, xhot, yhot); - free(pixels); - set_cursor(cursor_x, cursor_y, get_which_cursor()); - } Copied: x11vnc/repos/extra-x86_64/cursor.patch (from rev 317073, x11vnc/trunk/cursor.patch) =================================================================== --- cursor.patch (rev 0) +++ cursor.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,281 @@ +From 37c946191a0f36490531624a2d03ec1ce7c714ac Mon Sep 17 00:00:00 2001 +From: Stephan Fuhrmann <stfu...@freenet.de> +Date: Tue, 18 Jul 2017 11:28:25 +0200 +Subject: [PATCH] Broken cursor bugfix for 64 bit systems (#49) + +* Proper 32 bit types assigned + +* The size dependent conversions are not necessary if input type is 32 bit in every case + +* Unused variable + +* Another type problem 32/64 fixed + +* Prototype fixed + +* Pointer cast missing + +* * Multiple conversions from (unsigned long*) to proper (uint32_t*). +* Bugfix for XFixesCursorImage type problem. Structure contains (unsigned long*), but protocol says the pixels are just 32 bit. + This is a problem for 64 bit systems where (unsigned long) is 64 bits wide. +--- + src/cursor.c | 79 ++++++++++++++++++++++++------------------------------------ + src/cursor.h | 3 +-- + src/screen.c | 28 ++++++++++----------- + 3 files changed, 45 insertions(+), 65 deletions(-) + +diff --git a/src/cursor.c b/src/cursor.c +index 8c14b6c..6e135be 100644 +--- a/src/cursor.c ++++ b/src/cursor.c +@@ -68,7 +68,7 @@ void set_no_cursor(void); + void set_warrow_cursor(void); + int set_cursor(int x, int y, int which); + int check_x11_pointer(void); +-int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, int xhot, int yhot); ++int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, int xhot, int yhot); + unsigned long get_cursor_serial(int mode); + rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, int xhot, int yhot, int Bpp); + void save_under_cursor_buffer(rfbClientPtr cl); +@@ -1008,14 +1008,13 @@ void initialize_xfixes(void) { + rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, + int xhot, int yhot, int Bpp) { + rfbCursorPtr c; +- static unsigned long black = 0, white = 1; ++ static uint32_t black = 0, white = 1; + static int first = 1; + char *bitmap, *rich, *alpha; + char *pixels_new = NULL; + int n_opaque, n_trans, n_alpha, len, histo[256]; + int send_alpha = 0, alpha_shift = 0, thresh; + int i, x, y; +- + if (first && dpy) { /* raw_fb hack */ + X_LOCK; + black = BlackPixel(dpy, scr); +@@ -1033,7 +1032,6 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, + if (scaling_cursor && (scale_cursor_fac_x != 1.0 || scale_cursor_fac_y != 1.0)) { + int W, H; + char *pixels_use = (char *) pixels; +- unsigned int *pixels32 = NULL; + + W = w; + H = h; +@@ -1043,48 +1041,10 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, + + pixels_new = (char *) malloc(4*w*h); + +- if (sizeof(unsigned long) == 8) { +- int i, j, k = 0; +- /* +- * to avoid 64bpp code in scale_rect() we knock +- * down to unsigned int on 64bit machines: +- */ +- pixels32 = (unsigned int*) malloc(4*W*H); +- for (j=0; j<H; j++) { +- for (i=0; i<W; i++) { +- *(pixels32+k) = 0xffffffff & (*(pixels+k)); +- k++; +- } +- } +- pixels_use = (char *) pixels32; +- } +- + scale_rect(scale_cursor_fac_x, scale_cursor_fac_y, scaling_cursor_blend, + scaling_cursor_interpolate, + 4, pixels_use, 4*W, pixels_new, 4*w, + W, H, w, h, 0, 0, W, H, 0); +- +- if (sizeof(unsigned long) == 8) { +- int i, j, k = 0; +- unsigned long *pixels64; +- unsigned int* source = (unsigned int*) pixels_new; +- /* +- * now knock it back up to unsigned long: +- */ +- pixels64 = (unsigned long*) malloc(8*w*h); +- for (j=0; j<h; j++) { +- for (i=0; i<w; i++) { +- *(pixels64+k) = (unsigned long) (*(source+k)); +- k++; +- } +- } +- free(pixels_new); +- pixels_new = (char *) pixels64; +- if (pixels32) { +- free(pixels32); +- pixels32 = NULL; +- } +- } + + pixels = (uint32_t *) pixels_new; + +@@ -1111,7 +1071,7 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, + i = 0; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { +- unsigned long a; ++ uint32_t a; + + a = 0xff000000 & (*(pixels+i)); + a = a >> 24; /* alpha channel */ +@@ -1154,8 +1114,8 @@ rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, + i = 0; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { +- unsigned long r, g, b, a; +- unsigned int ui; ++ uint32_t r, g, b, a; ++ uint32_t ui; + char *p; + + a = 0xff000000 & (*(pixels+i)); +@@ -1322,6 +1282,7 @@ static int get_exact_cursor(int init) { + } + if (xfixes_present && dpy) { + #if HAVE_LIBXFIXES ++ uint32_t *pixel32 = NULL; + int last_idx = (int) get_cursor_serial(1); + XFixesCursorImage *xfc; + +@@ -1350,15 +1311,37 @@ static int get_exact_cursor(int init) { + + /* retrieve the cursor info + pixels from server: */ + xfc = XFixesGetCursorImage(dpy); ++ { ++ /* 2017-07-09, Stephan Fuhrmann: This fixes an implementation flaw for 64 bit systems. ++ * The XFixesCursorImage structure says xfc->pixels is (unsigned long*) in the structure, but ++ * the protocol spec says it's 32 bit per pixel ++ * (https://www.x.org/releases/X11R7.6/doc/fixesproto/fixesproto.txt). ++ * I'm converting the data anyway to 32 bit to be sure. Only necessary for 64 bit systems, ++ * but doing it anyway for 32 bit. ++ * */ ++ int x,y; ++ pixel32 = malloc(xfc->width * xfc->height * sizeof(uint32_t)); ++ for (y = 0; y < xfc->height; y++) { ++ for (x = 0; x < xfc->width; x++) { ++ uint32_t ofs = x + y*xfc->width; ++ *(pixel32 + ofs) = *(xfc->pixels + ofs); ++ } ++ } ++ } ++ + X_UNLOCK; + if (! xfc) { + /* failure. */ + return which; + } + +- which = store_cursor(xfc->cursor_serial, xfc->pixels, ++ which = store_cursor(xfc->cursor_serial, pixel32, + xfc->width, xfc->height, 32, xfc->xhot, xfc->yhot); + ++ if (pixel32 != NULL) { ++ free(pixel32); ++ } ++ + X_LOCK; + XFree_wr(xfc); + X_UNLOCK; +@@ -1367,7 +1350,7 @@ static int get_exact_cursor(int init) { + return(which); + } + +-int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, ++int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, + int xhot, int yhot) { + int which = CURS_ARROW; + int use, oldest, i; +@@ -1453,7 +1436,7 @@ fprintf(stderr, "sc: %d %d/%d %d - %d %d\n", serial, w, h, cbpp, xhot, yhot); + } + + /* place cursor into our collection */ +- cursors[use]->rfb = pixels2curs((uint32_t*)data, w, h, xhot, yhot, bpp/8); ++ cursors[use]->rfb = pixels2curs(data, w, h, xhot, yhot, bpp/8); + + /* update time and serial index: */ + curs_times[use] = now; +diff --git a/src/cursor.h b/src/cursor.h +index 0cd42d1..e8ed248 100644 +--- a/src/cursor.h ++++ b/src/cursor.h +@@ -47,7 +47,6 @@ extern int alpha_blend; + extern int alt_arrow; + extern int alt_arrow_max; + +- + extern void first_cursor(void); + extern void setup_cursors_and_push(void); + extern void initialize_xfixes(void); +@@ -64,7 +63,7 @@ extern void set_no_cursor(void); + extern void set_warrow_cursor(void); + extern int set_cursor(int x, int y, int which); + extern int check_x11_pointer(void); +-extern int store_cursor(int serial, unsigned long *data, int w, int h, int cbpp, int xhot, int yhot); ++extern int store_cursor(int serial, uint32_t *data, int w, int h, int cbpp, int xhot, int yhot); + extern unsigned long get_cursor_serial(int mode); + extern rfbCursorPtr pixels2curs(uint32_t *pixels, int w, int h, int xhot, int yhot, int Bpp); + void save_under_cursor_buffer(rfbClientPtr cl); +diff --git a/src/screen.c b/src/screen.c +index bda4690..395b503 100644 +--- a/src/screen.c ++++ b/src/screen.c +@@ -1206,10 +1206,10 @@ void vnc_reflect_got_update(rfbClient *cl, int x, int y, int w, int h) { + void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, int height, int bytesPerPixel) { + static int serial = 1; + int i, j; +- char *pixels = NULL; +- unsigned long r, g, b; +- unsigned int ui = 0; +- unsigned long red_mask, green_mask, blue_mask; ++ uint32_t *pixels = NULL; ++ uint32_t r, g, b; ++ uint32_t ui = 0; ++ uint32_t red_mask, green_mask, blue_mask; + + if (cl) {} + if (unixpw_in_progress) { +@@ -1230,21 +1230,20 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i + green_mask = (client->format.greenMax << client->format.greenShift); + blue_mask = (client->format.blueMax << client->format.blueShift); + +- pixels = (char *)malloc(4*width*height); ++ pixels = (uint32_t *)malloc(4*width*height); + for (j=0; j<height; j++) { + for (i=0; i<width; i++) { +- unsigned int* uip; + unsigned char* uic; + int m; + if (bytesPerPixel == 1) { +- unsigned char* p = (unsigned char *) client->rcSource; +- ui = (unsigned long) *(p + j * width + i); ++ uint8_t* p = (uint8_t *) client->rcSource; ++ ui = (uint32_t) *(p + j * width + i); + } else if (bytesPerPixel == 2) { +- unsigned short* p = (unsigned short *) client->rcSource; +- ui = (unsigned long) *(p + j * width + i); ++ uint16_t* p = (uint16_t *) client->rcSource; ++ ui = (uint32_t) *(p + j * width + i); + } else if (bytesPerPixel == 4) { +- unsigned int* p = (unsigned int *) client->rcSource; +- ui = (unsigned long) *(p + j * width + i); ++ uint32_t* p = (uint32_t *) client->rcSource; ++ ui = (uint32_t) *(p + j * width + i); + } + r = (red_mask & ui) >> client->format.redShift; + g = (green_mask & ui) >> client->format.greenShift; +@@ -1261,12 +1260,11 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i + if (m) { + ui |= 0xff000000; + } +- uip = (unsigned int *)pixels; +- *(uip + j * width + i) = ui; ++ *(pixels + j * width + i) = ui; + } + } + +- store_cursor(serial++, (unsigned long*) pixels, width, height, 32, xhot, yhot); ++ store_cursor(serial++, pixels, width, height, 32, xhot, yhot); + free(pixels); + set_cursor(cursor_x, cursor_y, get_which_cursor()); + } Deleted: fix-buffer-overflows.patch =================================================================== --- fix-buffer-overflows.patch 2018-02-15 01:13:13 UTC (rev 317073) +++ fix-buffer-overflows.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,26 +0,0 @@ -diff -Naur x11vnc-0.9.13-ori/src/win_utils.c x11vnc-0.9.13/src/win_utils.c ---- x11vnc-0.9.13-ori/src/win_utils.c 2016-10-07 23:26:03.248600761 +0200 -+++ x11vnc-0.9.13/src/win_utils.c 2016-10-07 23:26:51.919256706 +0200 -@@ -262,8 +262,8 @@ - } - - last_snap = now; -- if (num > stack_list_len + blackouts) { -- int n = 2*num; -+ if (num + blackouts > stack_list_len) { -+ int n = 2 * (num + blackouts); - free(stack_list); - stack_list = (winattr_t *) malloc(n*sizeof(winattr_t)); - stack_list_len = n; -diff -Naur x11vnc-0.9.13-ori/src/xrecord.c x11vnc-0.9.13/src/xrecord.c ---- x11vnc-0.9.13-ori/src/xrecord.c 2016-10-07 23:26:03.248600761 +0200 -+++ x11vnc-0.9.13/src/xrecord.c 2016-10-07 23:27:49.566700470 +0200 -@@ -964,7 +964,7 @@ - data = (char *)req; - data += sz_xConfigureWindowReq; - -- for (i=0; i<req->length; i++) { -+ for (i = 0; i < req->length - sz_xConfigureWindowReq / 4 && i < 4; i++) { - unsigned int v; - /* - * We use unsigned int for the values. There were Copied: x11vnc/repos/extra-x86_64/fix-buffer-overflows.patch (from rev 317073, x11vnc/trunk/fix-buffer-overflows.patch) =================================================================== --- fix-buffer-overflows.patch (rev 0) +++ fix-buffer-overflows.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,26 @@ +diff -Naur x11vnc-0.9.13-ori/src/win_utils.c x11vnc-0.9.13/src/win_utils.c +--- x11vnc-0.9.13-ori/src/win_utils.c 2016-10-07 23:26:03.248600761 +0200 ++++ x11vnc-0.9.13/src/win_utils.c 2016-10-07 23:26:51.919256706 +0200 +@@ -262,8 +262,8 @@ + } + + last_snap = now; +- if (num > stack_list_len + blackouts) { +- int n = 2*num; ++ if (num + blackouts > stack_list_len) { ++ int n = 2 * (num + blackouts); + free(stack_list); + stack_list = (winattr_t *) malloc(n*sizeof(winattr_t)); + stack_list_len = n; +diff -Naur x11vnc-0.9.13-ori/src/xrecord.c x11vnc-0.9.13/src/xrecord.c +--- x11vnc-0.9.13-ori/src/xrecord.c 2016-10-07 23:26:03.248600761 +0200 ++++ x11vnc-0.9.13/src/xrecord.c 2016-10-07 23:27:49.566700470 +0200 +@@ -964,7 +964,7 @@ + data = (char *)req; + data += sz_xConfigureWindowReq; + +- for (i=0; i<req->length; i++) { ++ for (i = 0; i < req->length - sz_xConfigureWindowReq / 4 && i < 4; i++) { + unsigned int v; + /* + * We use unsigned int for the values. There were Deleted: openssl-detect.patch =================================================================== --- openssl-detect.patch 2018-02-15 01:13:13 UTC (rev 317073) +++ openssl-detect.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,34 +0,0 @@ -From 5889645bd3e63cf02c3fcad942d7edef1b4df472 Mon Sep 17 00:00:00 2001 -From: Bert van Hall <bert.vanh...@avionic-design.de> -Date: Wed, 7 Dec 2016 10:56:24 +0100 -Subject: [PATCH 1/2] Fix openssl 1.1.x detection - -The SSL_library_init function has been renamed to OPENSSL_init_ssl from -openssl 1.1.0 on. While the old name still exists as a define for -backwards compatibility, this breaks detection in the library itself. -Update configure.ac to just detect the library instead of specific -functions. - -Signed-off-by: Bert van Hall <bert.vanh...@avionic-design.de> ---- - configure.ac | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - ---- a/configure.ac -+++ b/configure.ac -@@ -351,12 +351,11 @@ fi - AH_TEMPLATE(HAVE_X509_PRINT_EX_FP, [open ssl X509_print_ex_fp available]) - if test "x$with_ssl" != "xno"; then - if test "x$HAVE_LIBCRYPTO" = "xtrue"; then -- AC_CHECK_LIB(ssl, SSL_library_init, -+ PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0.0], - SSL_LIBS="-lssl -lcrypto" -- [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], , -- -lcrypto) -+ [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,) - else -- AC_CHECK_LIB(ssl, SSL_library_init, -+ PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0.0], - SSL_LIBS="-lssl" - [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,) - fi Copied: x11vnc/repos/extra-x86_64/openssl-detect.patch (from rev 317073, x11vnc/trunk/openssl-detect.patch) =================================================================== --- openssl-detect.patch (rev 0) +++ openssl-detect.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,34 @@ +From 5889645bd3e63cf02c3fcad942d7edef1b4df472 Mon Sep 17 00:00:00 2001 +From: Bert van Hall <bert.vanh...@avionic-design.de> +Date: Wed, 7 Dec 2016 10:56:24 +0100 +Subject: [PATCH 1/2] Fix openssl 1.1.x detection + +The SSL_library_init function has been renamed to OPENSSL_init_ssl from +openssl 1.1.0 on. While the old name still exists as a define for +backwards compatibility, this breaks detection in the library itself. +Update configure.ac to just detect the library instead of specific +functions. + +Signed-off-by: Bert van Hall <bert.vanh...@avionic-design.de> +--- + configure.ac | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +--- a/configure.ac ++++ b/configure.ac +@@ -351,12 +351,11 @@ fi + AH_TEMPLATE(HAVE_X509_PRINT_EX_FP, [open ssl X509_print_ex_fp available]) + if test "x$with_ssl" != "xno"; then + if test "x$HAVE_LIBCRYPTO" = "xtrue"; then +- AC_CHECK_LIB(ssl, SSL_library_init, ++ PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0.0], + SSL_LIBS="-lssl -lcrypto" +- [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], , +- -lcrypto) ++ [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,) + else +- AC_CHECK_LIB(ssl, SSL_library_init, ++ PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0.0], + SSL_LIBS="-lssl" + [AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,) + fi Deleted: openssl-support.patch =================================================================== --- openssl-support.patch 2018-02-15 01:13:13 UTC (rev 317073) +++ openssl-support.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,481 +0,0 @@ -From d37dac6963c2fb65cf577a6413657621cbcb406a Mon Sep 17 00:00:00 2001 -From: Bert van Hall <bert.vanh...@avionic-design.de> -Date: Wed, 7 Dec 2016 14:43:57 +0100 -Subject: [PATCH 2/2] Support openssl 1.1.0 - -Compatibility patch for openssl 1.1.0 and later. The 1.0.2 API should -still work. Note that openssl 1.1.0 builds now have SSLv3 disabled per -default, so clients will have to support TLS to connect securely. - -Signed-off-by: Bert van Hall <bert.vanh...@avionic-design.de> ---- - README | 16 +++++++ - src/enc.h | 88 +++++++++++++++++++++++++++++++-------- - src/sslhelper.c | 119 +++++++++++++++++++++++++++++++++++++++++------------ - 3 files changed, 179 insertions(+), 44 deletions(-) - ---- a/README -+++ b/README -@@ -871,6 +871,14 @@ make - place. As of x11vnc 0.9.4 there is also the --with-ssl=DIR configure - option. - -+ Note that from OpenSSL 1.1.0 on SSLv2 support has been dropped and -+ SSLv3 deactivated at build time per default. This means that unless -+ explicitly enabled, OpenSSL builds only support TLS (any version). -+ Since there is a reason for dropping SSLv3 (heard of POODLE?), most -+ distributions do not enable it for their OpenSSL binary. In summary -+ this means compiling x11vnc against OpenSSL 1.1.0 or newer is no -+ problem, but using encryption will require a viewer with TLS support. -+ - On Solaris using static archives libssl.a and libcrypto.a instead of - .so shared libraries (e.g. from www.sunfreeware.com), we found we - needed to also set LDFLAGS as follows to get the configure to work: -@@ -4228,6 +4236,14 @@ connect = 5900 - protocol handshake. x11vnc 0.9.6 supports both simultaneously when - -ssl is active. - -+ Note: With the advent of OpenSSL 1.1.0, SSLv2 is dropped and SSLv3 -+ deactivated per default. A couple broken ciphers have also gone, most -+ importantly though is that clients trying to connect to x11vnc will -+ now have to support TLS if encryption is to be used. You can of -+ course always cook up your own build and run time OpenSSL 1.1.x if -+ SSLv3 is absolutely required, but it isn't wise from a security point -+ of view. -+ - - SSL VNC Viewers:. Viewer-side will need to use SSL as well. See the - next FAQ and here for SSL enabled VNC Viewers, including SSVNC, to ---- a/src/enc.h -+++ b/src/enc.h -@@ -454,8 +454,10 @@ extern void enc_do(char *ciph, char *key - p++; - if (strstr(p, "md5+") == p) { - Digest = EVP_md5(); p += strlen("md5+"); -+#if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined OPENSSL_NO_SHA0 - } else if (strstr(p, "sha+") == p) { - Digest = EVP_sha(); p += strlen("sha+"); -+#endif - } else if (strstr(p, "sha1+") == p) { - Digest = EVP_sha1(); p += strlen("sha1+"); - } else if (strstr(p, "ripe+") == p) { -@@ -696,7 +698,11 @@ static void enc_xfer(int sock_fr, int so - */ - unsigned char E_keystr[EVP_MAX_KEY_LENGTH]; - unsigned char D_keystr[EVP_MAX_KEY_LENGTH]; -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_CIPHER_CTX *E_ctx, *D_ctx; -+#else - EVP_CIPHER_CTX E_ctx, D_ctx; -+#endif - EVP_CIPHER_CTX *ctx = NULL; - - unsigned char buf[BSIZE], out[BSIZE]; -@@ -739,11 +745,16 @@ static void enc_xfer(int sock_fr, int so - encsym = encrypt ? "+" : "-"; - - /* use the encryption/decryption context variables below */ -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ E_ctx = EVP_CIPHER_CTX_new(); -+ D_ctx = EVP_CIPHER_CTX_new(); -+ ctx = encrypt ? E_ctx : D_ctx; -+#else -+ ctx = encrypt ? &E_ctx : &D_ctx; -+#endif - if (encrypt) { -- ctx = &E_ctx; - keystr = E_keystr; - } else { -- ctx = &D_ctx; - keystr = D_keystr; - } - -@@ -877,9 +888,9 @@ static void enc_xfer(int sock_fr, int so - in_salt = salt; - } - -- if (ivec_size < Cipher->iv_len && !securevnc) { -+ if (ivec_size < EVP_CIPHER_iv_length(Cipher) && !securevnc) { - fprintf(stderr, "%s: %s - WARNING: short IV %d < %d\n", -- prog, encstr, ivec_size, Cipher->iv_len); -+ prog, encstr, ivec_size, EVP_CIPHER_iv_length(Cipher)); - } - - /* make the hashed value and place in keystr */ -@@ -1033,6 +1044,11 @@ static void enc_xfer(int sock_fr, int so - fprintf(stderr, "%s: %s - close sock_fr\n", prog, encstr); - close(sock_fr); - -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_CIPHER_CTX_free(E_ctx); -+ EVP_CIPHER_CTX_free(D_ctx); -+#endif -+ - /* kill our partner after 2 secs. */ - sleep(2); - if (child) { -@@ -1101,14 +1117,24 @@ static int securevnc_server_rsa_save_dia - } - - static char *rsa_md5_sum(unsigned char* rsabuf) { -- EVP_MD_CTX md; -+ EVP_MD_CTX *md; - char digest[EVP_MAX_MD_SIZE], tmp[16]; - char md5str[EVP_MAX_MD_SIZE * 8]; - unsigned int i, size = 0; - -- EVP_DigestInit(&md, EVP_md5()); -- EVP_DigestUpdate(&md, rsabuf, SECUREVNC_RSA_PUBKEY_SIZE); -- EVP_DigestFinal(&md, (unsigned char *)digest, &size); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ md = EVP_MD_CTX_new(); -+#else -+ md = EVP_MD_CTX_create(); -+#endif -+ EVP_DigestInit(md, EVP_md5()); -+ EVP_DigestUpdate(md, rsabuf, SECUREVNC_RSA_PUBKEY_SIZE); -+ EVP_DigestFinal(md, (unsigned char *)digest, &size); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_MD_CTX_free(md); -+#else -+ EVP_MD_CTX_destroy(md); -+#endif - - memset(md5str, 0, sizeof(md5str)); - for (i=0; i < size; i++) { -@@ -1225,7 +1251,7 @@ static void sslexit(char *msg) { - - static void securevnc_setup(int conn1, int conn2) { - RSA *rsa = NULL; -- EVP_CIPHER_CTX init_ctx; -+ EVP_CIPHER_CTX *init_ctx; - unsigned char keystr[EVP_MAX_KEY_LENGTH]; - unsigned char *rsabuf, *rsasav; - unsigned char *encrypted_keybuf; -@@ -1364,8 +1390,15 @@ static void securevnc_setup(int conn1, i - /* - * Back to the work involving the tmp obscuring key: - */ -- EVP_CIPHER_CTX_init(&init_ctx); -- rc = EVP_CipherInit_ex(&init_ctx, EVP_rc4(), NULL, initkey, NULL, 1); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ init_ctx = EVP_CIPHER_CTX_new(); -+#else -+ -+ EVP_CIPHER_CTX init_ctx_obj; -+ init_ctx = &init_ctx_obj; -+#endif -+ EVP_CIPHER_CTX_init(init_ctx); -+ rc = EVP_CipherInit_ex(init_ctx, EVP_rc4(), NULL, initkey, NULL, 1); - if (rc == 0) { - sslexit("securevnc_setup: EVP_CipherInit_ex(init_ctx) failed"); - } -@@ -1374,6 +1407,9 @@ static void securevnc_setup(int conn1, i - n = read(server, (char *) buf, BSIZE); - fprintf(stderr, "securevnc_setup: data read: %d\n", n); - if (n < 0) { -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_CIPHER_CTX_free(init_ctx); -+#endif - exit(1); - } - fprintf(stderr, "securevnc_setup: initial data[%d]: ", n); -@@ -1381,13 +1417,19 @@ static void securevnc_setup(int conn1, i - /* decode with the tmp key */ - if (n > 0) { - memset(to_viewer, 0, sizeof(to_viewer)); -- if (EVP_CipherUpdate(&init_ctx, to_viewer, &len, buf, n) == 0) { -+ if (EVP_CipherUpdate(init_ctx, to_viewer, &len, buf, n) == 0) { - sslexit("securevnc_setup: EVP_CipherUpdate(init_ctx) failed"); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_CIPHER_CTX_free(init_ctx); -+#endif - exit(1); - } - to_viewer_len = len; - } -- EVP_CIPHER_CTX_cleanup(&init_ctx); -+ EVP_CIPHER_CTX_cleanup(init_ctx); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_CIPHER_CTX_free(init_ctx); -+#endif - free(initkey); - - /* print what we would send to the viewer (sent below): */ -@@ -1448,7 +1490,7 @@ static void securevnc_setup(int conn1, i - - if (client_auth_req && client_auth) { - RSA *client_rsa = load_client_auth(client_auth); -- EVP_MD_CTX dctx; -+ EVP_MD_CTX *dctx; - unsigned char digest[EVP_MAX_MD_SIZE], *signature; - unsigned int ndig = 0, nsig = 0; - -@@ -1462,8 +1504,13 @@ static void securevnc_setup(int conn1, i - exit(1); - } - -- EVP_DigestInit(&dctx, EVP_sha1()); -- EVP_DigestUpdate(&dctx, keystr, SECUREVNC_KEY_SIZE); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ dctx = EVP_MD_CTX_new(); -+#else -+ dctx = EVP_MD_CTX_create(); -+#endif -+ EVP_DigestInit(dctx, EVP_sha1()); -+ EVP_DigestUpdate(dctx, keystr, SECUREVNC_KEY_SIZE); - /* - * Without something like the following MITM is still possible. - * This is because the MITM knows keystr and can use it with -@@ -1474,7 +1521,7 @@ static void securevnc_setup(int conn1, i - * he doesn't have Viewer_ClientAuth.pkey. - */ - if (0) { -- EVP_DigestUpdate(&dctx, rsasav, SECUREVNC_RSA_PUBKEY_SIZE); -+ EVP_DigestUpdate(dctx, rsasav, SECUREVNC_RSA_PUBKEY_SIZE); - if (!keystore_verified) { - fprintf(stderr, "securevnc_setup:\n"); - fprintf(stderr, "securevnc_setup: Warning: even *WITH* Client Authentication in SecureVNC,\n"); -@@ -1497,7 +1544,12 @@ static void securevnc_setup(int conn1, i - fprintf(stderr, "securevnc_setup:\n"); - } - } -- EVP_DigestFinal(&dctx, (unsigned char *)digest, &ndig); -+ EVP_DigestFinal(dctx, (unsigned char *)digest, &ndig); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ EVP_MD_CTX_free(dctx); -+#else -+ EVP_MD_CTX_destroy(dctx); -+#endif - - signature = (unsigned char *) calloc(RSA_size(client_rsa), 1); - RSA_sign(NID_sha1, digest, ndig, signature, &nsig, client_rsa); ---- a/src/sslhelper.c -+++ b/src/sslhelper.c -@@ -799,8 +799,13 @@ static int pem_passwd_callback(char *buf - - /* based on mod_ssl */ - static int crl_callback(X509_STORE_CTX *callback_ctx) { -- X509_STORE_CTX store_ctx; -+ const ASN1_INTEGER *revoked_serial; -+ X509_STORE_CTX *store_ctx; -+#if OPENSSL_VERSION_NUMBER > 0x10100000L -+ X509_OBJECT *obj; -+#else - X509_OBJECT obj; -+#endif - X509_NAME *subject; - X509_NAME *issuer; - X509 *xs; -@@ -820,11 +825,19 @@ static int crl_callback(X509_STORE_CTX * - - /* Try to retrieve a CRL corresponding to the _subject_ of - * the current certificate in order to verify it's integrity. */ -+ store_ctx = X509_STORE_CTX_new(); -+ X509_STORE_CTX_init(store_ctx, revocation_store, NULL, NULL); -+#if OPENSSL_VERSION_NUMBER > 0x10100000L -+ obj = X509_OBJECT_new(); -+ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, obj); -+ crl = X509_OBJECT_get0_X509_CRL(obj); -+#else - memset((char *)&obj, 0, sizeof(obj)); -- X509_STORE_CTX_init(&store_ctx, revocation_store, NULL, NULL); -- rc=X509_STORE_get_by_subject(&store_ctx, X509_LU_CRL, subject, &obj); -- X509_STORE_CTX_cleanup(&store_ctx); -+ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, &obj); - crl=obj.data.crl; -+#endif -+ X509_STORE_CTX_cleanup(store_ctx); -+ X509_STORE_CTX_free(store_ctx); - - if(rc>0 && crl) { - /* Log information about CRL -@@ -850,7 +863,11 @@ static int crl_callback(X509_STORE_CTX * - rfbLog("Invalid signature on CRL\n"); - X509_STORE_CTX_set_error(callback_ctx, - X509_V_ERR_CRL_SIGNATURE_FAILURE); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else - X509_OBJECT_free_contents(&obj); -+#endif - if(pubkey) - EVP_PKEY_free(pubkey); - return 0; /* Reject connection */ -@@ -864,45 +881,78 @@ static int crl_callback(X509_STORE_CTX * - rfbLog("Found CRL has invalid nextUpdate field\n"); - X509_STORE_CTX_set_error(callback_ctx, - X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else - X509_OBJECT_free_contents(&obj); -+#endif - return 0; /* Reject connection */ - } - if(X509_cmp_current_time(t)<0) { - rfbLog("Found CRL is expired - " - "revoking all certificates until you get updated CRL\n"); - X509_STORE_CTX_set_error(callback_ctx, X509_V_ERR_CRL_HAS_EXPIRED); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else - X509_OBJECT_free_contents(&obj); -+#endif - return 0; /* Reject connection */ - } -- X509_OBJECT_free_contents(&obj); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else -+ X509_OBJECT_free_contents(&obj); -+#endif - } - - /* Try to retrieve a CRL corresponding to the _issuer_ of - * the current certificate in order to check for revocation. */ -+ store_ctx = X509_STORE_CTX_new(); -+ X509_STORE_CTX_init(store_ctx, revocation_store, NULL, NULL); -+#if OPENSSL_VERSION_NUMBER > 0x10100000L -+ obj = X509_OBJECT_new(); -+ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, issuer, obj); -+ crl = X509_OBJECT_get0_X509_CRL(obj); -+#else - memset((char *)&obj, 0, sizeof(obj)); -- X509_STORE_CTX_init(&store_ctx, revocation_store, NULL, NULL); -- rc=X509_STORE_get_by_subject(&store_ctx, X509_LU_CRL, issuer, &obj); -- X509_STORE_CTX_cleanup(&store_ctx); -+ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, issuer, &obj); - crl=obj.data.crl; -+#endif -+ X509_STORE_CTX_cleanup(store_ctx); -+ X509_STORE_CTX_free(store_ctx); - - if(rc>0 && crl) { - /* Check if the current certificate is revoked by this CRL */ - n=sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl)); - for(i=0; i<n; i++) { - revoked=sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i); -- if(ASN1_INTEGER_cmp(revoked->serialNumber, -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ revoked_serial = X509_REVOKED_get0_serialNumber(revoked); -+#else -+ revoked_serial = revoked->serialNumber; -+#endif -+ if(ASN1_INTEGER_cmp(revoked_serial, - X509_get_serialNumber(xs)) == 0) { -- serial=ASN1_INTEGER_get(revoked->serialNumber); -+ serial=ASN1_INTEGER_get(revoked_serial); - cp=X509_NAME_oneline(issuer, NULL, 0); - rfbLog("Certificate with serial %ld (0x%lX) " - "revoked per CRL from issuer %s\n", serial, serial, cp); - OPENSSL_free(cp); - X509_STORE_CTX_set_error(callback_ctx, X509_V_ERR_CERT_REVOKED); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else - X509_OBJECT_free_contents(&obj); -+#endif - return 0; /* Reject connection */ - } - } -- X509_OBJECT_free_contents(&obj); -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ X509_OBJECT_free(obj); -+#else -+ X509_OBJECT_free_contents(&obj); -+#endif - } - - return 1; /* Accept connection */ -@@ -951,6 +1001,8 @@ static int switch_to_anon_dh(void); - - void openssl_init(int isclient) { - int db = 0, tmp_pem = 0, do_dh; -+ const SSL_METHOD *method; -+ char *method_name; - FILE *in; - double ds; - long mode; -@@ -992,13 +1044,17 @@ void openssl_init(int isclient) { - ssl_client_mode = 0; - } - -- if (ssl_client_mode) { -- if (db) fprintf(stderr, "SSLv23_client_method()\n"); -- ctx = SSL_CTX_new( SSLv23_client_method() ); -- } else { -- if (db) fprintf(stderr, "SSLv23_server_method()\n"); -- ctx = SSL_CTX_new( SSLv23_server_method() ); -- } -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ method = ssl_client_mode ? TLS_client_method() : TLS_server_method(); -+ if (db) -+ method_name = ssl_client_mode ? "TLS_client_method()" : "TLS_server_method()"; -+#else -+ method = ssl_client_mode ? SSLv23_client_method() : SSLv23_server_method(); -+ if (db) -+ method_name = ssl_client_mode ? "SSLv23_client_method()" : "SSLv23_server_method()"; -+#endif -+ if (db) fprintf(stderr, "%s\n", method_name); -+ ctx = SSL_CTX_new(method); - - if (ctx == NULL) { - rfbLog("openssl_init: SSL_CTX_new failed.\n"); -@@ -1520,16 +1576,18 @@ static int add_anon_dh(void) { - } - - static int switch_to_anon_dh(void) { -+ const SSL_METHOD *method; - long mode; - - rfbLog("Using Anonymous Diffie-Hellman mode.\n"); - rfbLog("WARNING: Anonymous Diffie-Hellman uses encryption but is\n"); - rfbLog("WARNING: susceptible to a Man-In-The-Middle attack.\n"); -- if (ssl_client_mode) { -- ctx = SSL_CTX_new( SSLv23_client_method() ); -- } else { -- ctx = SSL_CTX_new( SSLv23_server_method() ); -- } -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ method = ssl_client_mode ? TLS_client_method() : TLS_server_method(); -+#else -+ method = ssl_client_mode ? SSLv23_client_method() : SSLv23_server_method(); -+#endif -+ ctx = SSL_CTX_new(method); - if (ctx == NULL) { - return 0; - } -@@ -1896,6 +1954,7 @@ static void pr_ssl_info(int verb) { - SSL_CIPHER *c; - SSL_SESSION *s; - char *proto = "unknown"; -+ int ssl_version; - - if (verb) {} - -@@ -1905,13 +1964,21 @@ static void pr_ssl_info(int verb) { - c = SSL_get_current_cipher(ssl); - s = SSL_get_session(ssl); - -+ if (s) { -+#if OPENSSL_VERSION_NUMBER >= 0x10100000L -+ ssl_version = SSL_SESSION_get_protocol_version(s); -+#else -+ ssl_version = s->ssl_version; -+#endif -+ } -+ - if (s == NULL) { - proto = "nosession"; -- } else if (s->ssl_version == SSL2_VERSION) { -+ } else if (ssl_version == SSL2_VERSION) { - proto = "SSLv2"; -- } else if (s->ssl_version == SSL3_VERSION) { -+ } else if (ssl_version == SSL3_VERSION) { - proto = "SSLv3"; -- } else if (s->ssl_version == TLS1_VERSION) { -+ } else if (ssl_version == TLS1_VERSION) { - proto = "TLSv1"; - } - if (c != NULL) { Copied: x11vnc/repos/extra-x86_64/openssl-support.patch (from rev 317073, x11vnc/trunk/openssl-support.patch) =================================================================== --- openssl-support.patch (rev 0) +++ openssl-support.patch 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,481 @@ +From d37dac6963c2fb65cf577a6413657621cbcb406a Mon Sep 17 00:00:00 2001 +From: Bert van Hall <bert.vanh...@avionic-design.de> +Date: Wed, 7 Dec 2016 14:43:57 +0100 +Subject: [PATCH 2/2] Support openssl 1.1.0 + +Compatibility patch for openssl 1.1.0 and later. The 1.0.2 API should +still work. Note that openssl 1.1.0 builds now have SSLv3 disabled per +default, so clients will have to support TLS to connect securely. + +Signed-off-by: Bert van Hall <bert.vanh...@avionic-design.de> +--- + README | 16 +++++++ + src/enc.h | 88 +++++++++++++++++++++++++++++++-------- + src/sslhelper.c | 119 +++++++++++++++++++++++++++++++++++++++++------------ + 3 files changed, 179 insertions(+), 44 deletions(-) + +--- a/README ++++ b/README +@@ -871,6 +871,14 @@ make + place. As of x11vnc 0.9.4 there is also the --with-ssl=DIR configure + option. + ++ Note that from OpenSSL 1.1.0 on SSLv2 support has been dropped and ++ SSLv3 deactivated at build time per default. This means that unless ++ explicitly enabled, OpenSSL builds only support TLS (any version). ++ Since there is a reason for dropping SSLv3 (heard of POODLE?), most ++ distributions do not enable it for their OpenSSL binary. In summary ++ this means compiling x11vnc against OpenSSL 1.1.0 or newer is no ++ problem, but using encryption will require a viewer with TLS support. ++ + On Solaris using static archives libssl.a and libcrypto.a instead of + .so shared libraries (e.g. from www.sunfreeware.com), we found we + needed to also set LDFLAGS as follows to get the configure to work: +@@ -4228,6 +4236,14 @@ connect = 5900 + protocol handshake. x11vnc 0.9.6 supports both simultaneously when + -ssl is active. + ++ Note: With the advent of OpenSSL 1.1.0, SSLv2 is dropped and SSLv3 ++ deactivated per default. A couple broken ciphers have also gone, most ++ importantly though is that clients trying to connect to x11vnc will ++ now have to support TLS if encryption is to be used. You can of ++ course always cook up your own build and run time OpenSSL 1.1.x if ++ SSLv3 is absolutely required, but it isn't wise from a security point ++ of view. ++ + + SSL VNC Viewers:. Viewer-side will need to use SSL as well. See the + next FAQ and here for SSL enabled VNC Viewers, including SSVNC, to +--- a/src/enc.h ++++ b/src/enc.h +@@ -454,8 +454,10 @@ extern void enc_do(char *ciph, char *key + p++; + if (strstr(p, "md5+") == p) { + Digest = EVP_md5(); p += strlen("md5+"); ++#if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined OPENSSL_NO_SHA0 + } else if (strstr(p, "sha+") == p) { + Digest = EVP_sha(); p += strlen("sha+"); ++#endif + } else if (strstr(p, "sha1+") == p) { + Digest = EVP_sha1(); p += strlen("sha1+"); + } else if (strstr(p, "ripe+") == p) { +@@ -696,7 +698,11 @@ static void enc_xfer(int sock_fr, int so + */ + unsigned char E_keystr[EVP_MAX_KEY_LENGTH]; + unsigned char D_keystr[EVP_MAX_KEY_LENGTH]; ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX *E_ctx, *D_ctx; ++#else + EVP_CIPHER_CTX E_ctx, D_ctx; ++#endif + EVP_CIPHER_CTX *ctx = NULL; + + unsigned char buf[BSIZE], out[BSIZE]; +@@ -739,11 +745,16 @@ static void enc_xfer(int sock_fr, int so + encsym = encrypt ? "+" : "-"; + + /* use the encryption/decryption context variables below */ ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ E_ctx = EVP_CIPHER_CTX_new(); ++ D_ctx = EVP_CIPHER_CTX_new(); ++ ctx = encrypt ? E_ctx : D_ctx; ++#else ++ ctx = encrypt ? &E_ctx : &D_ctx; ++#endif + if (encrypt) { +- ctx = &E_ctx; + keystr = E_keystr; + } else { +- ctx = &D_ctx; + keystr = D_keystr; + } + +@@ -877,9 +888,9 @@ static void enc_xfer(int sock_fr, int so + in_salt = salt; + } + +- if (ivec_size < Cipher->iv_len && !securevnc) { ++ if (ivec_size < EVP_CIPHER_iv_length(Cipher) && !securevnc) { + fprintf(stderr, "%s: %s - WARNING: short IV %d < %d\n", +- prog, encstr, ivec_size, Cipher->iv_len); ++ prog, encstr, ivec_size, EVP_CIPHER_iv_length(Cipher)); + } + + /* make the hashed value and place in keystr */ +@@ -1033,6 +1044,11 @@ static void enc_xfer(int sock_fr, int so + fprintf(stderr, "%s: %s - close sock_fr\n", prog, encstr); + close(sock_fr); + ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(E_ctx); ++ EVP_CIPHER_CTX_free(D_ctx); ++#endif ++ + /* kill our partner after 2 secs. */ + sleep(2); + if (child) { +@@ -1101,14 +1117,24 @@ static int securevnc_server_rsa_save_dia + } + + static char *rsa_md5_sum(unsigned char* rsabuf) { +- EVP_MD_CTX md; ++ EVP_MD_CTX *md; + char digest[EVP_MAX_MD_SIZE], tmp[16]; + char md5str[EVP_MAX_MD_SIZE * 8]; + unsigned int i, size = 0; + +- EVP_DigestInit(&md, EVP_md5()); +- EVP_DigestUpdate(&md, rsabuf, SECUREVNC_RSA_PUBKEY_SIZE); +- EVP_DigestFinal(&md, (unsigned char *)digest, &size); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ md = EVP_MD_CTX_new(); ++#else ++ md = EVP_MD_CTX_create(); ++#endif ++ EVP_DigestInit(md, EVP_md5()); ++ EVP_DigestUpdate(md, rsabuf, SECUREVNC_RSA_PUBKEY_SIZE); ++ EVP_DigestFinal(md, (unsigned char *)digest, &size); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_MD_CTX_free(md); ++#else ++ EVP_MD_CTX_destroy(md); ++#endif + + memset(md5str, 0, sizeof(md5str)); + for (i=0; i < size; i++) { +@@ -1225,7 +1251,7 @@ static void sslexit(char *msg) { + + static void securevnc_setup(int conn1, int conn2) { + RSA *rsa = NULL; +- EVP_CIPHER_CTX init_ctx; ++ EVP_CIPHER_CTX *init_ctx; + unsigned char keystr[EVP_MAX_KEY_LENGTH]; + unsigned char *rsabuf, *rsasav; + unsigned char *encrypted_keybuf; +@@ -1364,8 +1390,15 @@ static void securevnc_setup(int conn1, i + /* + * Back to the work involving the tmp obscuring key: + */ +- EVP_CIPHER_CTX_init(&init_ctx); +- rc = EVP_CipherInit_ex(&init_ctx, EVP_rc4(), NULL, initkey, NULL, 1); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ init_ctx = EVP_CIPHER_CTX_new(); ++#else ++ ++ EVP_CIPHER_CTX init_ctx_obj; ++ init_ctx = &init_ctx_obj; ++#endif ++ EVP_CIPHER_CTX_init(init_ctx); ++ rc = EVP_CipherInit_ex(init_ctx, EVP_rc4(), NULL, initkey, NULL, 1); + if (rc == 0) { + sslexit("securevnc_setup: EVP_CipherInit_ex(init_ctx) failed"); + } +@@ -1374,6 +1407,9 @@ static void securevnc_setup(int conn1, i + n = read(server, (char *) buf, BSIZE); + fprintf(stderr, "securevnc_setup: data read: %d\n", n); + if (n < 0) { ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(init_ctx); ++#endif + exit(1); + } + fprintf(stderr, "securevnc_setup: initial data[%d]: ", n); +@@ -1381,13 +1417,19 @@ static void securevnc_setup(int conn1, i + /* decode with the tmp key */ + if (n > 0) { + memset(to_viewer, 0, sizeof(to_viewer)); +- if (EVP_CipherUpdate(&init_ctx, to_viewer, &len, buf, n) == 0) { ++ if (EVP_CipherUpdate(init_ctx, to_viewer, &len, buf, n) == 0) { + sslexit("securevnc_setup: EVP_CipherUpdate(init_ctx) failed"); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(init_ctx); ++#endif + exit(1); + } + to_viewer_len = len; + } +- EVP_CIPHER_CTX_cleanup(&init_ctx); ++ EVP_CIPHER_CTX_cleanup(init_ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(init_ctx); ++#endif + free(initkey); + + /* print what we would send to the viewer (sent below): */ +@@ -1448,7 +1490,7 @@ static void securevnc_setup(int conn1, i + + if (client_auth_req && client_auth) { + RSA *client_rsa = load_client_auth(client_auth); +- EVP_MD_CTX dctx; ++ EVP_MD_CTX *dctx; + unsigned char digest[EVP_MAX_MD_SIZE], *signature; + unsigned int ndig = 0, nsig = 0; + +@@ -1462,8 +1504,13 @@ static void securevnc_setup(int conn1, i + exit(1); + } + +- EVP_DigestInit(&dctx, EVP_sha1()); +- EVP_DigestUpdate(&dctx, keystr, SECUREVNC_KEY_SIZE); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ dctx = EVP_MD_CTX_new(); ++#else ++ dctx = EVP_MD_CTX_create(); ++#endif ++ EVP_DigestInit(dctx, EVP_sha1()); ++ EVP_DigestUpdate(dctx, keystr, SECUREVNC_KEY_SIZE); + /* + * Without something like the following MITM is still possible. + * This is because the MITM knows keystr and can use it with +@@ -1474,7 +1521,7 @@ static void securevnc_setup(int conn1, i + * he doesn't have Viewer_ClientAuth.pkey. + */ + if (0) { +- EVP_DigestUpdate(&dctx, rsasav, SECUREVNC_RSA_PUBKEY_SIZE); ++ EVP_DigestUpdate(dctx, rsasav, SECUREVNC_RSA_PUBKEY_SIZE); + if (!keystore_verified) { + fprintf(stderr, "securevnc_setup:\n"); + fprintf(stderr, "securevnc_setup: Warning: even *WITH* Client Authentication in SecureVNC,\n"); +@@ -1497,7 +1544,12 @@ static void securevnc_setup(int conn1, i + fprintf(stderr, "securevnc_setup:\n"); + } + } +- EVP_DigestFinal(&dctx, (unsigned char *)digest, &ndig); ++ EVP_DigestFinal(dctx, (unsigned char *)digest, &ndig); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_MD_CTX_free(dctx); ++#else ++ EVP_MD_CTX_destroy(dctx); ++#endif + + signature = (unsigned char *) calloc(RSA_size(client_rsa), 1); + RSA_sign(NID_sha1, digest, ndig, signature, &nsig, client_rsa); +--- a/src/sslhelper.c ++++ b/src/sslhelper.c +@@ -799,8 +799,13 @@ static int pem_passwd_callback(char *buf + + /* based on mod_ssl */ + static int crl_callback(X509_STORE_CTX *callback_ctx) { +- X509_STORE_CTX store_ctx; ++ const ASN1_INTEGER *revoked_serial; ++ X509_STORE_CTX *store_ctx; ++#if OPENSSL_VERSION_NUMBER > 0x10100000L ++ X509_OBJECT *obj; ++#else + X509_OBJECT obj; ++#endif + X509_NAME *subject; + X509_NAME *issuer; + X509 *xs; +@@ -820,11 +825,19 @@ static int crl_callback(X509_STORE_CTX * + + /* Try to retrieve a CRL corresponding to the _subject_ of + * the current certificate in order to verify it's integrity. */ ++ store_ctx = X509_STORE_CTX_new(); ++ X509_STORE_CTX_init(store_ctx, revocation_store, NULL, NULL); ++#if OPENSSL_VERSION_NUMBER > 0x10100000L ++ obj = X509_OBJECT_new(); ++ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, obj); ++ crl = X509_OBJECT_get0_X509_CRL(obj); ++#else + memset((char *)&obj, 0, sizeof(obj)); +- X509_STORE_CTX_init(&store_ctx, revocation_store, NULL, NULL); +- rc=X509_STORE_get_by_subject(&store_ctx, X509_LU_CRL, subject, &obj); +- X509_STORE_CTX_cleanup(&store_ctx); ++ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, &obj); + crl=obj.data.crl; ++#endif ++ X509_STORE_CTX_cleanup(store_ctx); ++ X509_STORE_CTX_free(store_ctx); + + if(rc>0 && crl) { + /* Log information about CRL +@@ -850,7 +863,11 @@ static int crl_callback(X509_STORE_CTX * + rfbLog("Invalid signature on CRL\n"); + X509_STORE_CTX_set_error(callback_ctx, + X509_V_ERR_CRL_SIGNATURE_FAILURE); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else + X509_OBJECT_free_contents(&obj); ++#endif + if(pubkey) + EVP_PKEY_free(pubkey); + return 0; /* Reject connection */ +@@ -864,45 +881,78 @@ static int crl_callback(X509_STORE_CTX * + rfbLog("Found CRL has invalid nextUpdate field\n"); + X509_STORE_CTX_set_error(callback_ctx, + X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else + X509_OBJECT_free_contents(&obj); ++#endif + return 0; /* Reject connection */ + } + if(X509_cmp_current_time(t)<0) { + rfbLog("Found CRL is expired - " + "revoking all certificates until you get updated CRL\n"); + X509_STORE_CTX_set_error(callback_ctx, X509_V_ERR_CRL_HAS_EXPIRED); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else + X509_OBJECT_free_contents(&obj); ++#endif + return 0; /* Reject connection */ + } +- X509_OBJECT_free_contents(&obj); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else ++ X509_OBJECT_free_contents(&obj); ++#endif + } + + /* Try to retrieve a CRL corresponding to the _issuer_ of + * the current certificate in order to check for revocation. */ ++ store_ctx = X509_STORE_CTX_new(); ++ X509_STORE_CTX_init(store_ctx, revocation_store, NULL, NULL); ++#if OPENSSL_VERSION_NUMBER > 0x10100000L ++ obj = X509_OBJECT_new(); ++ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, issuer, obj); ++ crl = X509_OBJECT_get0_X509_CRL(obj); ++#else + memset((char *)&obj, 0, sizeof(obj)); +- X509_STORE_CTX_init(&store_ctx, revocation_store, NULL, NULL); +- rc=X509_STORE_get_by_subject(&store_ctx, X509_LU_CRL, issuer, &obj); +- X509_STORE_CTX_cleanup(&store_ctx); ++ rc=X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, issuer, &obj); + crl=obj.data.crl; ++#endif ++ X509_STORE_CTX_cleanup(store_ctx); ++ X509_STORE_CTX_free(store_ctx); + + if(rc>0 && crl) { + /* Check if the current certificate is revoked by this CRL */ + n=sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl)); + for(i=0; i<n; i++) { + revoked=sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i); +- if(ASN1_INTEGER_cmp(revoked->serialNumber, ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ revoked_serial = X509_REVOKED_get0_serialNumber(revoked); ++#else ++ revoked_serial = revoked->serialNumber; ++#endif ++ if(ASN1_INTEGER_cmp(revoked_serial, + X509_get_serialNumber(xs)) == 0) { +- serial=ASN1_INTEGER_get(revoked->serialNumber); ++ serial=ASN1_INTEGER_get(revoked_serial); + cp=X509_NAME_oneline(issuer, NULL, 0); + rfbLog("Certificate with serial %ld (0x%lX) " + "revoked per CRL from issuer %s\n", serial, serial, cp); + OPENSSL_free(cp); + X509_STORE_CTX_set_error(callback_ctx, X509_V_ERR_CERT_REVOKED); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else + X509_OBJECT_free_contents(&obj); ++#endif + return 0; /* Reject connection */ + } + } +- X509_OBJECT_free_contents(&obj); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ X509_OBJECT_free(obj); ++#else ++ X509_OBJECT_free_contents(&obj); ++#endif + } + + return 1; /* Accept connection */ +@@ -951,6 +1001,8 @@ static int switch_to_anon_dh(void); + + void openssl_init(int isclient) { + int db = 0, tmp_pem = 0, do_dh; ++ const SSL_METHOD *method; ++ char *method_name; + FILE *in; + double ds; + long mode; +@@ -992,13 +1044,17 @@ void openssl_init(int isclient) { + ssl_client_mode = 0; + } + +- if (ssl_client_mode) { +- if (db) fprintf(stderr, "SSLv23_client_method()\n"); +- ctx = SSL_CTX_new( SSLv23_client_method() ); +- } else { +- if (db) fprintf(stderr, "SSLv23_server_method()\n"); +- ctx = SSL_CTX_new( SSLv23_server_method() ); +- } ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ method = ssl_client_mode ? TLS_client_method() : TLS_server_method(); ++ if (db) ++ method_name = ssl_client_mode ? "TLS_client_method()" : "TLS_server_method()"; ++#else ++ method = ssl_client_mode ? SSLv23_client_method() : SSLv23_server_method(); ++ if (db) ++ method_name = ssl_client_mode ? "SSLv23_client_method()" : "SSLv23_server_method()"; ++#endif ++ if (db) fprintf(stderr, "%s\n", method_name); ++ ctx = SSL_CTX_new(method); + + if (ctx == NULL) { + rfbLog("openssl_init: SSL_CTX_new failed.\n"); +@@ -1520,16 +1576,18 @@ static int add_anon_dh(void) { + } + + static int switch_to_anon_dh(void) { ++ const SSL_METHOD *method; + long mode; + + rfbLog("Using Anonymous Diffie-Hellman mode.\n"); + rfbLog("WARNING: Anonymous Diffie-Hellman uses encryption but is\n"); + rfbLog("WARNING: susceptible to a Man-In-The-Middle attack.\n"); +- if (ssl_client_mode) { +- ctx = SSL_CTX_new( SSLv23_client_method() ); +- } else { +- ctx = SSL_CTX_new( SSLv23_server_method() ); +- } ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ method = ssl_client_mode ? TLS_client_method() : TLS_server_method(); ++#else ++ method = ssl_client_mode ? SSLv23_client_method() : SSLv23_server_method(); ++#endif ++ ctx = SSL_CTX_new(method); + if (ctx == NULL) { + return 0; + } +@@ -1896,6 +1954,7 @@ static void pr_ssl_info(int verb) { + SSL_CIPHER *c; + SSL_SESSION *s; + char *proto = "unknown"; ++ int ssl_version; + + if (verb) {} + +@@ -1905,13 +1964,21 @@ static void pr_ssl_info(int verb) { + c = SSL_get_current_cipher(ssl); + s = SSL_get_session(ssl); + ++ if (s) { ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ ssl_version = SSL_SESSION_get_protocol_version(s); ++#else ++ ssl_version = s->ssl_version; ++#endif ++ } ++ + if (s == NULL) { + proto = "nosession"; +- } else if (s->ssl_version == SSL2_VERSION) { ++ } else if (ssl_version == SSL2_VERSION) { + proto = "SSLv2"; +- } else if (s->ssl_version == SSL3_VERSION) { ++ } else if (ssl_version == SSL3_VERSION) { + proto = "SSLv3"; +- } else if (s->ssl_version == TLS1_VERSION) { ++ } else if (ssl_version == TLS1_VERSION) { + proto = "TLSv1"; + } + if (c != NULL) { Deleted: service =================================================================== --- service 2018-02-15 01:13:13 UTC (rev 317073) +++ service 2018-02-15 01:14:13 UTC (rev 317074) @@ -1,7 +0,0 @@ -[Unit] -Description=VNC Server for X11 -Requires=graphical.target -After=graphical.target - -[Service] -ExecStart=/usr/bin/x11vnc Copied: x11vnc/repos/extra-x86_64/service (from rev 317073, x11vnc/trunk/service) =================================================================== --- service (rev 0) +++ service 2018-02-15 01:14:13 UTC (rev 317074) @@ -0,0 +1,7 @@ +[Unit] +Description=VNC Server for X11 +Requires=graphical.target +After=graphical.target + +[Service] +ExecStart=/usr/bin/x11vnc