kiss-mfavila-large/community-mod/stable/x11vnc/patches/bugfixes.patch

481 lines
16 KiB
Diff

--- x11vnc-0.9.16/src/cleanup.c
+++ x11vnc/src/cleanup.c
@@ -492,7 +492,7 @@
}
if (*str == 'q' && *(str+1) == '\0') {
- fprintf(stderr, "quiting.\n");
+ fprintf(stderr, "quitting.\n");
return;
} else if (*str == 'h' && *(str+1) == '\0') {
crash_shell_help();
--- x11vnc-0.9.16/src/cursor.c
+++ x11vnc/src/cursor.c
@@ -1311,7 +1311,7 @@
/* retrieve the cursor info + pixels from server: */
xfc = XFixesGetCursorImage(dpy);
- {
+ if (xfc) {
/* 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
--- x11vnc-0.9.16/src/help.c
+++ x11vnc/src/help.c
@@ -3614,7 +3614,7 @@
"-ncache_no_dtchange In -ncache mode, do not try to guess when the desktop\n"
" (viewport) changes to another one (i.e. another\n"
" workarea). The default is to try to guess and when\n"
-" detected try to make the transistion more smoothly.\n"
+" detected try to make the transition more smoothly.\n"
"\n"
"-ncache_no_rootpixmap In -ncache mode, do not try to snapshot the desktop\n"
" background to use in guessing or reconstructing window\n"
@@ -3716,7 +3716,7 @@
" \"mode\" can be \"never\" (same as -nowirecopyrect)\n"
" to never try the copyrect, \"top\" means only do it if\n"
" the window was not covered by any other windows, and\n"
-" \"always\" means to translate the orginally unobscured\n"
+" \"always\" means to translate the originally unobscured\n"
" region (this may look odd as the remaining pieces come\n"
" in, but helps on a slow link). Default: \"%s\"\n"
"\n"
@@ -3990,7 +3990,7 @@
" to \"eat\" much of that pointer input before re-polling\n"
" the screen and sending out framebuffer updates. The\n"
" mode number \"n\" can be 0 to %d and selects one of\n"
-" the schemes desribed below.\n"
+" the schemes described below.\n"
"\n"
" Note that the -wireframe and -scrollcopyrect modes\n"
" complement -pointer_mode by detecting (and improving)\n"
@@ -4060,7 +4060,7 @@
" read rate may be much faster. \"x11perf -getimage500\"\n"
" can be used to get a lower bound (remember to factor\n"
" in the bytes per pixel). It is up to you to estimate\n"
-" the network bandwith and latency to clients. For the\n"
+" the network bandwidth and latency to clients. For the\n"
" latency the ping(1) command can be used.\n"
"\n"
" For convenience there are some aliases provided,\n"
@@ -5776,7 +5776,7 @@
" you can still specify these parameters on the command\n"
" line, they just cannot be invoked via remote-control.\n"
"-safer Equivalent to: -novncconnect -noremote and prohibiting\n"
-" -gui and the -connect file. Shuts off communcation\n"
+" -gui and the -connect file. Shuts off communication\n"
" channels.\n"
"-privremote Perform some sanity checks and disable remote-control\n"
" commands if it appears that the X DISPLAY and/or\n"
@@ -6032,7 +6032,7 @@
"#@ @#\n"
"#@ Or using the x11vnc SSL options: -ssl and -stunnel @#\n"
"#@ @#\n"
-"#@ Please Read the documention for more info about @#\n"
+"#@ Please Read the documentation for more info about @#\n"
"#@ passwords, security, and encryption. @#\n"
"#@ @#\n"
"#@ http://www.karlrunge.com/x11vnc/faq.html#faq-passwd @#\n"
--- x11vnc-0.9.16/src/inet.c
+++ x11vnc/src/inet.c
@@ -670,6 +670,10 @@
return -1;
}
saun.sun_family = AF_UNIX;
+ if(strlen(file) + 1 > sizeof(saun.sun_path)) {
+ rfbLogPerror("listen_unix: socket name too long");
+ return -1;
+ }
strcpy(saun.sun_path, file);
unlink(file);
--- x11vnc-0.9.16/src/linuxfb.c
+++ x11vnc/src/linuxfb.c
@@ -53,9 +53,31 @@
char *console_guess(char *str, int *fd);
void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client);
void console_pointer_command(int mask, int x, int y, rfbClientPtr client);
+void linux_dev_fb_msg(char *);
+/* Returns offset into fb memory based on yoffset. */
+int rawfb_get_offset(int *fd)
+{
+#if HAVE_LINUX_FB_H
+ int offset;
+ struct fb_var_screeninfo var_info;
+ if (ioctl(*fd, FBIOGET_VSCREENINFO, &var_info)) {
+ perror("ioctl");
+ return 0;
+ }
-void linux_dev_fb_msg(char *);
+ /* todo: How should x offset be handled? */
+ if (var_info.xoffset != 0) {
+ rfbLog("rawfb xoffset handling not implemented");
+ }
+
+ if (var_info.yoffset != 0) {
+ offset = main_bytes_per_line * var_info.yoffset;
+ return offset;
+ }
+#endif
+ return 0;
+}
char *console_guess(char *str, int *fd) {
char *q, *in = strdup(str);
--- x11vnc-0.9.16/src/linuxfb.h
+++ x11vnc/src/linuxfb.h
@@ -37,6 +37,7 @@
extern char *console_guess(char *str, int *fd);
extern void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client);
extern void console_pointer_command(int mask, int x, int y, rfbClientPtr client);
+extern int rawfb_get_offset(int *fd);
#endif /* _X11VNC_LINUXFB_H */
--- x11vnc-0.9.16/src/params.h
+++ x11vnc/src/params.h
@@ -75,7 +75,7 @@
#define PIPEINPUT_MACOSX 0x4
#define PIPEINPUT_VNC 0x5
-#define MAX_BUTTONS 5
+#define MAX_BUTTONS 7
#define ROTATE_NONE 0
#define ROTATE_X 1
--- x11vnc-0.9.16/src/screen.c
+++ x11vnc/src/screen.c
@@ -109,6 +109,7 @@
int rawfb_reset = -1;
int rawfb_dev_video = 0;
int rawfb_vnc_reflect = 0;
+int rawfb_double_buffer = 0;
/*
* X11 and rfb display/screen related routines
@@ -1942,14 +1943,25 @@
/* +O offset */
+ char *end = NULL;
if ((q = strrchr(str, '+')) != NULL) {
- if (sscanf(q, "+%d", &raw_fb_offset) == 1) {
- *q = '\0';
- } else {
+ end = q;
+ if (sscanf(q, "+%d", &raw_fb_offset) != 1) {
raw_fb_offset = 0;
}
}
- /* :R/G/B masks */
+
+ /* #VWxVH virtual dimensions */
+ if ((q = strrchr(str, '#')) != NULL) {
+ if (q < end) end = q;
+ if (sscanf(q, "#%dx%d", &raw_fb_virt_x, &raw_fb_virt_y) != 2) {
+ raw_fb_virt_x = 0;
+ raw_fb_virt_y = 0;
+ }
+ }
+
+ if (end != NULL) *end = '\0';
+
if ((q = strrchr(str, ':')) != NULL) {
if (sscanf(q, ":%lx/%lx/%lx", &rm, &gm, &bm) == 3) {
*q = '\0';
@@ -2138,7 +2150,7 @@
} else if (strstr(str, "map:") == str || strstr(str, "mmap:") == str
|| strstr(str, "file:") == str) {
/* map:/path/... or file:/path */
- int fd, do_mmap = 1, size;
+ int fd, do_mmap = 1, size, vsize = 0;
struct stat sbuf;
if (*str == 'f') {
@@ -2178,9 +2190,15 @@
size = w*h*raw_fb_native_bpp/8 + raw_fb_offset;
} else if (xform24to32) {
size = w*h*24/8 + raw_fb_offset;
+ } else if (raw_fb_virt_x != 0 && raw_fb_virt_y != 0) {
+ size = w*h*b/8;
+ vsize = raw_fb_virt_x*raw_fb_virt_y*b/8;
+ rawfb_double_buffer = 1;
+ rfbLog("virtual size: %d", vsize);
} else {
size = w*h*b/8 + raw_fb_offset;
}
+
if (fstat(fd, &sbuf) == 0) {
if (S_ISREG(sbuf.st_mode)) {
if (0) size = sbuf.st_size;
@@ -2205,8 +2223,11 @@
} else if (do_mmap) {
#if LIBVNCSERVER_HAVE_MMAP
- raw_fb_addr = mmap(0, size, PROT_READ, MAP_SHARED,
- fd, 0);
+ if (vsize != 0) {
+ raw_fb_addr = mmap(0, vsize, PROT_READ, MAP_SHARED, fd, 0);
+ } else {
+ raw_fb_addr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
+ }
if (raw_fb_addr == MAP_FAILED || raw_fb_addr == NULL) {
rfbLogEnable(1);
@@ -2223,8 +2244,13 @@
raw_fb_mmap = size;
rfbLog("rawfb: mmap file: %s\n", q);
- rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h,
- b, raw_fb_addr, size);
+ if (vsize != 0) {
+ rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h,
+ b, raw_fb_addr, vsize);
+ } else {
+ rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h,
+ b, raw_fb_addr, size);
+ }
last_mode = RAWFB_MMAP;
}
#else
@@ -4652,6 +4678,12 @@
/* Now, for scanning and drawing soft cursors (i.e. writing to the framebuffer),
make sure we're not sending any updates to clients (i.e. reading the framebuffer).
Otherwise we get flicker! */
+
+ /* Update offset in case local framebuffer is double buffered */
+ if (rawfb_double_buffer) {
+ raw_fb_offset = rawfb_get_offset(&raw_fb_fd);
+ }
+
if(use_threads){
rfbClientPtr cl;
rfbClientIteratorPtr iter = rfbGetClientIterator(screen);
--- x11vnc-0.9.16/src/sslhelper.c
+++ x11vnc/src/sslhelper.c
@@ -1596,7 +1596,11 @@
if (ssl_client_mode) {
return 1;
}
- if (!SSL_CTX_set_cipher_list(ctx, "ADH:@STRENGTH")) {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ /* Security level must be set to 0 for unauthenticated suites. */
+ SSL_CTX_set_security_level(ctx, 0);
+#endif
+ if (!SSL_CTX_set_cipher_list(ctx, "ADH:@SECLEVEL=0")) {
return 0;
}
if (!add_anon_dh()) {
--- x11vnc-0.9.16/src/ssltools.h
+++ x11vnc/src/ssltools.h
@@ -103,7 +103,7 @@
"private_key = $dir/private/cakey.pem # The private key\n"
"RANDFILE = $dir/private/.rand # private random number file\n"
"\n"
-"x509_extensions = usr_cert # The extentions to add to the cert\n"
+"x509_extensions = usr_cert # The extensions to add to the cert\n"
"\n"
"name_opt = ca_default # Subject Name options\n"
"cert_opt = ca_default # Certificate field options\n"
@@ -139,7 +139,7 @@
"default_keyfile = privkey.pem\n"
"distinguished_name = req_distinguished_name\n"
"attributes = req_attributes\n"
-"x509_extensions = v3_ca # The extentions to add to the self signed cert\n"
+"x509_extensions = v3_ca # The extensions to add to the self signed cert\n"
"\n"
"string_mask = nombstr\n"
"\n"
--- x11vnc-0.9.16/src/tkx11vnc.h
+++ x11vnc/src/tkx11vnc.h
@@ -506,7 +506,7 @@
"display (VNC_CONNECT rootwin property) being polled by the x11vnc server.\n"
"To change or set the X display to use do \\\"Displays -> display\\\".\n"
"\n"
-"Sometimes the \\\"-connect /path/to/filename\\\" is used as the communcation\n"
+"Sometimes the \\\"-connect /path/to/filename\\\" is used as the communication\n"
"channel. The running x11vnc has to know that \\\"/path/to/filename\\\"\n"
"is the communication channel (i.e. it is using the same -connect option).\n"
"\"\n"
@@ -1227,7 +1227,7 @@
"provides an interface to each of the many x11vnc command line options and\n"
"remote control commands. See \\\"Help -> all\\\" for much info about x11vnc.\n"
"\n"
-"For a simplier gui, run x11vnc in \\\"tray\\\" or \\\"icon\\\" mode such as\n"
+"For a simpler gui, run x11vnc in \\\"tray\\\" or \\\"icon\\\" mode such as\n"
"\\\"-gui tray\\\", \\\"-gui icon\\\", or \\\"-gui tray=setpass\\\". In that\n"
"mode the full gui is only available under \\\"Advanced ...\\\".\n"
"\n"
@@ -3366,7 +3366,7 @@
"proc menu_help {item} {\n"
" if ![help_win $item] {\n"
" textwin \"nohelp\" \"No help available\" \\\n"
-" \"Sorry, no help avaiable for \\\"$item\\\"\"\n"
+" \"Sorry, no help available for \\\"$item\\\"\"\n"
" }\n"
"}\n"
"\n"
--- x11vnc-0.9.16/src/uinput.c
+++ x11vnc/src/uinput.c
@@ -54,6 +54,11 @@
#include <linux/input.h>
#include <linux/uinput.h>
+#ifndef input_event_sec
+#define input_event_sec time.tv_sec
+#define input_event_usec time.tv_usec
+#endif
+
#if !defined(EV_SYN) || !defined(SYN_REPORT)
#undef UINPUT_OK
#endif
@@ -710,6 +715,7 @@
static void ptr_move(int dx, int dy) {
#ifdef UINPUT_OK
struct input_event ev;
+ struct timeval tval;
int d = direct_rel_fd < 0 ? fd : direct_rel_fd;
if (injectable && strchr(injectable, 'M') == NULL) {
@@ -720,7 +726,9 @@
if (db) fprintf(stderr, "ptr_move(%d, %d) fd=%d\n", dx, dy, d);
- gettimeofday(&ev.time, NULL);
+ gettimeofday(&tval, NULL);
+ ev.input_event_sec = tval.tv_sec;
+ ev.input_event_usec = tval.tv_usec;
ev.type = EV_REL;
ev.code = REL_Y;
ev.value = dy;
@@ -755,6 +763,7 @@
static void ptr_abs(int x, int y, int p) {
#ifdef UINPUT_OK
struct input_event ev;
+ struct timeval tval;
int x0, y0;
int d = direct_abs_fd < 0 ? fd : direct_abs_fd;
@@ -773,7 +782,9 @@
if (db) fprintf(stderr, "ptr_abs(%d, %d => %d %d, p=%d) fd=%d\n", x0, y0, x, y, p, d);
- gettimeofday(&ev.time, NULL);
+ gettimeofday(&tval, NULL);
+ ev.input_event_sec = tval.tv_sec;
+ ev.input_event_usec = tval.tv_usec;
ev.type = EV_ABS;
ev.code = ABS_Y;
ev.value = y;
@@ -950,6 +961,7 @@
static void button_click(int down, int btn) {
#ifdef UINPUT_OK
struct input_event ev;
+ struct timeval tval;
int d = direct_btn_fd < 0 ? fd : direct_btn_fd;
if (injectable && strchr(injectable, 'B') == NULL) {
@@ -959,7 +971,9 @@
if (db) fprintf(stderr, "button_click: btn %d %s fd=%d\n", btn, down ? "down" : "up", d);
memset(&ev, 0, sizeof(ev));
- gettimeofday(&ev.time, NULL);
+ gettimeofday(&tval, NULL);
+ ev.input_event_sec = tval.tv_sec;
+ ev.input_event_usec = tval.tv_usec;
ev.type = EV_KEY;
ev.value = down;
@@ -1230,6 +1244,7 @@
void uinput_key_command(int down, int keysym, rfbClientPtr client) {
#ifdef UINPUT_OK
struct input_event ev;
+ struct timeval tval;
int scancode;
allowed_input_t input;
int d = direct_key_fd < 0 ? fd : direct_key_fd;
@@ -1253,7 +1268,9 @@
if (db) fprintf(stderr, "uinput_key_command: %d -> %d %s fd=%d\n", keysym, scancode, down ? "down" : "up", d);
memset(&ev, 0, sizeof(ev));
- gettimeofday(&ev.time, NULL);
+ gettimeofday(&tval, NULL);
+ ev.input_event_sec = tval.tv_sec;
+ ev.input_event_usec = tval.tv_usec;
ev.type = EV_KEY;
ev.code = (unsigned char) scancode;
ev.value = down;
--- x11vnc-0.9.16/src/unixpw.c
+++ x11vnc/src/unixpw.c
@@ -757,7 +757,7 @@
}
int crypt_verify(char *user, char *pass) {
-#ifndef UNIXPW_CRYPT
+#if !defined UNIXPW_CRYPT || !defined HAVE_LIBCRYPT
return 0;
#else
struct passwd *pwd;
--- x11vnc-0.9.16/src/util.c
+++ x11vnc/src/util.c
@@ -47,6 +47,9 @@
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
MUTEX(x11Mutex);
MUTEX(scrollMutex);
+MUTEX(clientMutex);
+MUTEX(inputMutex);
+MUTEX(pointerMutex);
#endif
int nfix(int i, int n);
--- x11vnc-0.9.16/src/util.h
+++ x11vnc/src/util.h
@@ -102,9 +102,9 @@
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
extern MUTEX(x11Mutex);
extern MUTEX(scrollMutex);
-MUTEX(clientMutex);
-MUTEX(inputMutex);
-MUTEX(pointerMutex);
+extern MUTEX(clientMutex);
+extern MUTEX(inputMutex);
+extern MUTEX(pointerMutex);
#endif
#define X_INIT INIT_MUTEX(x11Mutex)
--- x11vnc-0.9.16/src/v4l.c
+++ x11vnc/src/v4l.c
@@ -1339,7 +1339,7 @@
}
if (stat(s, &sbuf) != 0) {
rfbLogPerror("stat");
- rfbLog("You will need to specify the video device more explicity.\n");
+ rfbLog("You will need to specify the video device more explicitly.\n");
}
*dev = s;
--- x11vnc-0.9.16/src/x11vnc.h
+++ x11vnc/src/x11vnc.h
@@ -541,6 +541,8 @@
extern char *raw_fb;
extern char *raw_fb_addr;
extern int raw_fb_offset;
+extern int raw_fb_virt_x;
+extern int raw_fb_virt_y;
extern int raw_fb_shm;
extern int raw_fb_mmap;
extern int raw_fb_seek;
--- x11vnc-0.9.16/src/x11vnc_defs.c
+++ x11vnc/src/x11vnc_defs.c
@@ -105,6 +105,8 @@
char *raw_fb = NULL; /* when used should be main_fb */
char *raw_fb_addr = NULL;
int raw_fb_offset = 0;
+int raw_fb_virt_x = 0;
+int raw_fb_virt_y = 0;
int raw_fb_shm = 0;
int raw_fb_mmap = 0;
int raw_fb_seek = 0;