xref: /openbmc/qemu/ui/vnc.c (revision c0a9c92b)
1 /*
2  * QEMU VNC display driver
3  *
4  * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5  * Copyright (C) 2006 Fabrice Bellard
6  * Copyright (C) 2009 Red Hat, Inc
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  */
26 
27 #include "qemu/osdep.h"
28 #include "vnc.h"
29 #include "vnc-jobs.h"
30 #include "trace.h"
31 #include "hw/qdev-core.h"
32 #include "sysemu/sysemu.h"
33 #include "sysemu/runstate.h"
34 #include "qemu/error-report.h"
35 #include "qemu/main-loop.h"
36 #include "qemu/module.h"
37 #include "qemu/option.h"
38 #include "qemu/sockets.h"
39 #include "qemu/timer.h"
40 #include "authz/list.h"
41 #include "qemu/config-file.h"
42 #include "qapi/qapi-emit-events.h"
43 #include "qapi/qapi-events-ui.h"
44 #include "qapi/error.h"
45 #include "qapi/qapi-commands-ui.h"
46 #include "ui/input.h"
47 #include "crypto/hash.h"
48 #include "crypto/tlscreds.h"
49 #include "crypto/tlscredsanon.h"
50 #include "crypto/tlscredsx509.h"
51 #include "crypto/random.h"
52 #include "crypto/secret_common.h"
53 #include "qom/object_interfaces.h"
54 #include "qemu/cutils.h"
55 #include "qemu/help_option.h"
56 #include "io/dns-resolver.h"
57 #include "monitor/monitor.h"
58 
59 #define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
60 #define VNC_REFRESH_INTERVAL_INC  50
61 #define VNC_REFRESH_INTERVAL_MAX  GUI_REFRESH_INTERVAL_IDLE
62 static const struct timeval VNC_REFRESH_STATS = { 0, 500000 };
63 static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
64 
65 #include "vnc_keysym.h"
66 #include "crypto/cipher.h"
67 
68 static QTAILQ_HEAD(, VncDisplay) vnc_displays =
69     QTAILQ_HEAD_INITIALIZER(vnc_displays);
70 
71 static int vnc_cursor_define(VncState *vs);
72 static void vnc_update_throttle_offset(VncState *vs);
73 
vnc_set_share_mode(VncState * vs,VncShareMode mode)74 static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
75 {
76 #ifdef _VNC_DEBUG
77     static const char *mn[] = {
78         [0]                           = "undefined",
79         [VNC_SHARE_MODE_CONNECTING]   = "connecting",
80         [VNC_SHARE_MODE_SHARED]       = "shared",
81         [VNC_SHARE_MODE_EXCLUSIVE]    = "exclusive",
82         [VNC_SHARE_MODE_DISCONNECTED] = "disconnected",
83     };
84     fprintf(stderr, "%s/%p: %s -> %s\n", __func__,
85             vs->ioc, mn[vs->share_mode], mn[mode]);
86 #endif
87 
88     switch (vs->share_mode) {
89     case VNC_SHARE_MODE_CONNECTING:
90         vs->vd->num_connecting--;
91         break;
92     case VNC_SHARE_MODE_SHARED:
93         vs->vd->num_shared--;
94         break;
95     case VNC_SHARE_MODE_EXCLUSIVE:
96         vs->vd->num_exclusive--;
97         break;
98     default:
99         break;
100     }
101 
102     vs->share_mode = mode;
103 
104     switch (vs->share_mode) {
105     case VNC_SHARE_MODE_CONNECTING:
106         vs->vd->num_connecting++;
107         break;
108     case VNC_SHARE_MODE_SHARED:
109         vs->vd->num_shared++;
110         break;
111     case VNC_SHARE_MODE_EXCLUSIVE:
112         vs->vd->num_exclusive++;
113         break;
114     default:
115         break;
116     }
117 }
118 
119 
vnc_init_basic_info(SocketAddress * addr,VncBasicInfo * info,Error ** errp)120 static void vnc_init_basic_info(SocketAddress *addr,
121                                 VncBasicInfo *info,
122                                 Error **errp)
123 {
124     switch (addr->type) {
125     case SOCKET_ADDRESS_TYPE_INET:
126         info->host = g_strdup(addr->u.inet.host);
127         info->service = g_strdup(addr->u.inet.port);
128         if (addr->u.inet.ipv6) {
129             info->family = NETWORK_ADDRESS_FAMILY_IPV6;
130         } else {
131             info->family = NETWORK_ADDRESS_FAMILY_IPV4;
132         }
133         break;
134 
135     case SOCKET_ADDRESS_TYPE_UNIX:
136         info->host = g_strdup("");
137         info->service = g_strdup(addr->u.q_unix.path);
138         info->family = NETWORK_ADDRESS_FAMILY_UNIX;
139         break;
140 
141     case SOCKET_ADDRESS_TYPE_VSOCK:
142     case SOCKET_ADDRESS_TYPE_FD:
143         error_setg(errp, "Unsupported socket address type %s",
144                    SocketAddressType_str(addr->type));
145         break;
146     default:
147         abort();
148     }
149 
150     return;
151 }
152 
vnc_init_basic_info_from_server_addr(QIOChannelSocket * ioc,VncBasicInfo * info,Error ** errp)153 static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
154                                                  VncBasicInfo *info,
155                                                  Error **errp)
156 {
157     SocketAddress *addr = NULL;
158 
159     if (!ioc) {
160         error_setg(errp, "No listener socket available");
161         return;
162     }
163 
164     addr = qio_channel_socket_get_local_address(ioc, errp);
165     if (!addr) {
166         return;
167     }
168 
169     vnc_init_basic_info(addr, info, errp);
170     qapi_free_SocketAddress(addr);
171 }
172 
vnc_init_basic_info_from_remote_addr(QIOChannelSocket * ioc,VncBasicInfo * info,Error ** errp)173 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
174                                                  VncBasicInfo *info,
175                                                  Error **errp)
176 {
177     SocketAddress *addr = NULL;
178 
179     addr = qio_channel_socket_get_remote_address(ioc, errp);
180     if (!addr) {
181         return;
182     }
183 
184     vnc_init_basic_info(addr, info, errp);
185     qapi_free_SocketAddress(addr);
186 }
187 
vnc_auth_name(VncDisplay * vd)188 static const char *vnc_auth_name(VncDisplay *vd) {
189     switch (vd->auth) {
190     case VNC_AUTH_INVALID:
191         return "invalid";
192     case VNC_AUTH_NONE:
193         return "none";
194     case VNC_AUTH_VNC:
195         return "vnc";
196     case VNC_AUTH_RA2:
197         return "ra2";
198     case VNC_AUTH_RA2NE:
199         return "ra2ne";
200     case VNC_AUTH_TIGHT:
201         return "tight";
202     case VNC_AUTH_ULTRA:
203         return "ultra";
204     case VNC_AUTH_TLS:
205         return "tls";
206     case VNC_AUTH_VENCRYPT:
207         switch (vd->subauth) {
208         case VNC_AUTH_VENCRYPT_PLAIN:
209             return "vencrypt+plain";
210         case VNC_AUTH_VENCRYPT_TLSNONE:
211             return "vencrypt+tls+none";
212         case VNC_AUTH_VENCRYPT_TLSVNC:
213             return "vencrypt+tls+vnc";
214         case VNC_AUTH_VENCRYPT_TLSPLAIN:
215             return "vencrypt+tls+plain";
216         case VNC_AUTH_VENCRYPT_X509NONE:
217             return "vencrypt+x509+none";
218         case VNC_AUTH_VENCRYPT_X509VNC:
219             return "vencrypt+x509+vnc";
220         case VNC_AUTH_VENCRYPT_X509PLAIN:
221             return "vencrypt+x509+plain";
222         case VNC_AUTH_VENCRYPT_TLSSASL:
223             return "vencrypt+tls+sasl";
224         case VNC_AUTH_VENCRYPT_X509SASL:
225             return "vencrypt+x509+sasl";
226         default:
227             return "vencrypt";
228         }
229     case VNC_AUTH_SASL:
230         return "sasl";
231     }
232     return "unknown";
233 }
234 
vnc_server_info_get(VncDisplay * vd)235 static VncServerInfo *vnc_server_info_get(VncDisplay *vd)
236 {
237     VncServerInfo *info;
238     Error *err = NULL;
239 
240     if (!vd->listener || !vd->listener->nsioc) {
241         return NULL;
242     }
243 
244     info = g_malloc0(sizeof(*info));
245     vnc_init_basic_info_from_server_addr(vd->listener->sioc[0],
246                                          qapi_VncServerInfo_base(info), &err);
247     info->auth = g_strdup(vnc_auth_name(vd));
248     if (err) {
249         qapi_free_VncServerInfo(info);
250         info = NULL;
251         error_free(err);
252     }
253     return info;
254 }
255 
vnc_client_cache_auth(VncState * client)256 static void vnc_client_cache_auth(VncState *client)
257 {
258     if (!client->info) {
259         return;
260     }
261 
262     if (client->tls) {
263         client->info->x509_dname =
264             qcrypto_tls_session_get_peer_name(client->tls);
265     }
266 #ifdef CONFIG_VNC_SASL
267     if (client->sasl.conn &&
268         client->sasl.username) {
269         client->info->sasl_username = g_strdup(client->sasl.username);
270     }
271 #endif
272 }
273 
vnc_client_cache_addr(VncState * client)274 static void vnc_client_cache_addr(VncState *client)
275 {
276     Error *err = NULL;
277 
278     client->info = g_malloc0(sizeof(*client->info));
279     vnc_init_basic_info_from_remote_addr(client->sioc,
280                                          qapi_VncClientInfo_base(client->info),
281                                          &err);
282     client->info->websocket = client->websocket;
283     if (err) {
284         qapi_free_VncClientInfo(client->info);
285         client->info = NULL;
286         error_free(err);
287     }
288 }
289 
vnc_qmp_event(VncState * vs,QAPIEvent event)290 static void vnc_qmp_event(VncState *vs, QAPIEvent event)
291 {
292     VncServerInfo *si;
293 
294     if (!vs->info) {
295         return;
296     }
297 
298     si = vnc_server_info_get(vs->vd);
299     if (!si) {
300         return;
301     }
302 
303     switch (event) {
304     case QAPI_EVENT_VNC_CONNECTED:
305         qapi_event_send_vnc_connected(si, qapi_VncClientInfo_base(vs->info));
306         break;
307     case QAPI_EVENT_VNC_INITIALIZED:
308         qapi_event_send_vnc_initialized(si, vs->info);
309         break;
310     case QAPI_EVENT_VNC_DISCONNECTED:
311         qapi_event_send_vnc_disconnected(si, vs->info);
312         break;
313     default:
314         break;
315     }
316 
317     qapi_free_VncServerInfo(si);
318 }
319 
qmp_query_vnc_client(const VncState * client)320 static VncClientInfo *qmp_query_vnc_client(const VncState *client)
321 {
322     VncClientInfo *info;
323     Error *err = NULL;
324 
325     info = g_malloc0(sizeof(*info));
326 
327     vnc_init_basic_info_from_remote_addr(client->sioc,
328                                          qapi_VncClientInfo_base(info),
329                                          &err);
330     if (err) {
331         error_free(err);
332         qapi_free_VncClientInfo(info);
333         return NULL;
334     }
335 
336     info->websocket = client->websocket;
337 
338     if (client->tls) {
339         info->x509_dname = qcrypto_tls_session_get_peer_name(client->tls);
340     }
341 #ifdef CONFIG_VNC_SASL
342     if (client->sasl.conn && client->sasl.username) {
343         info->sasl_username = g_strdup(client->sasl.username);
344     }
345 #endif
346 
347     return info;
348 }
349 
vnc_display_find(const char * id)350 static VncDisplay *vnc_display_find(const char *id)
351 {
352     VncDisplay *vd;
353 
354     if (id == NULL) {
355         return QTAILQ_FIRST(&vnc_displays);
356     }
357     QTAILQ_FOREACH(vd, &vnc_displays, next) {
358         if (strcmp(id, vd->id) == 0) {
359             return vd;
360         }
361     }
362     return NULL;
363 }
364 
qmp_query_client_list(VncDisplay * vd)365 static VncClientInfoList *qmp_query_client_list(VncDisplay *vd)
366 {
367     VncClientInfoList *prev = NULL;
368     VncState *client;
369 
370     QTAILQ_FOREACH(client, &vd->clients, next) {
371         QAPI_LIST_PREPEND(prev, qmp_query_vnc_client(client));
372     }
373     return prev;
374 }
375 
qmp_query_vnc(Error ** errp)376 VncInfo *qmp_query_vnc(Error **errp)
377 {
378     VncInfo *info = g_malloc0(sizeof(*info));
379     VncDisplay *vd = vnc_display_find(NULL);
380     SocketAddress *addr = NULL;
381 
382     if (vd == NULL || !vd->listener || !vd->listener->nsioc) {
383         info->enabled = false;
384     } else {
385         info->enabled = true;
386 
387         /* for compatibility with the original command */
388         info->has_clients = true;
389         info->clients = qmp_query_client_list(vd);
390 
391         addr = qio_channel_socket_get_local_address(vd->listener->sioc[0],
392                                                     errp);
393         if (!addr) {
394             goto out_error;
395         }
396 
397         switch (addr->type) {
398         case SOCKET_ADDRESS_TYPE_INET:
399             info->host = g_strdup(addr->u.inet.host);
400             info->service = g_strdup(addr->u.inet.port);
401             if (addr->u.inet.ipv6) {
402                 info->family = NETWORK_ADDRESS_FAMILY_IPV6;
403             } else {
404                 info->family = NETWORK_ADDRESS_FAMILY_IPV4;
405             }
406             break;
407 
408         case SOCKET_ADDRESS_TYPE_UNIX:
409             info->host = g_strdup("");
410             info->service = g_strdup(addr->u.q_unix.path);
411             info->family = NETWORK_ADDRESS_FAMILY_UNIX;
412             break;
413 
414         case SOCKET_ADDRESS_TYPE_VSOCK:
415         case SOCKET_ADDRESS_TYPE_FD:
416             error_setg(errp, "Unsupported socket address type %s",
417                        SocketAddressType_str(addr->type));
418             goto out_error;
419         default:
420             abort();
421         }
422 
423         info->has_family = true;
424 
425         info->auth = g_strdup(vnc_auth_name(vd));
426     }
427 
428     qapi_free_SocketAddress(addr);
429     return info;
430 
431 out_error:
432     qapi_free_SocketAddress(addr);
433     qapi_free_VncInfo(info);
434     return NULL;
435 }
436 
437 
438 static void qmp_query_auth(int auth, int subauth,
439                            VncPrimaryAuth *qmp_auth,
440                            VncVencryptSubAuth *qmp_vencrypt,
441                            bool *qmp_has_vencrypt);
442 
qmp_query_server_entry(QIOChannelSocket * ioc,bool websocket,int auth,int subauth,VncServerInfo2List * prev)443 static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
444                                                   bool websocket,
445                                                   int auth,
446                                                   int subauth,
447                                                   VncServerInfo2List *prev)
448 {
449     VncServerInfo2 *info;
450     Error *err = NULL;
451     SocketAddress *addr;
452 
453     addr = qio_channel_socket_get_local_address(ioc, NULL);
454     if (!addr) {
455         return prev;
456     }
457 
458     info = g_new0(VncServerInfo2, 1);
459     vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
460     qapi_free_SocketAddress(addr);
461     if (err) {
462         qapi_free_VncServerInfo2(info);
463         error_free(err);
464         return prev;
465     }
466     info->websocket = websocket;
467 
468     qmp_query_auth(auth, subauth, &info->auth,
469                    &info->vencrypt, &info->has_vencrypt);
470 
471     QAPI_LIST_PREPEND(prev, info);
472     return prev;
473 }
474 
qmp_query_auth(int auth,int subauth,VncPrimaryAuth * qmp_auth,VncVencryptSubAuth * qmp_vencrypt,bool * qmp_has_vencrypt)475 static void qmp_query_auth(int auth, int subauth,
476                            VncPrimaryAuth *qmp_auth,
477                            VncVencryptSubAuth *qmp_vencrypt,
478                            bool *qmp_has_vencrypt)
479 {
480     switch (auth) {
481     case VNC_AUTH_VNC:
482         *qmp_auth = VNC_PRIMARY_AUTH_VNC;
483         break;
484     case VNC_AUTH_RA2:
485         *qmp_auth = VNC_PRIMARY_AUTH_RA2;
486         break;
487     case VNC_AUTH_RA2NE:
488         *qmp_auth = VNC_PRIMARY_AUTH_RA2NE;
489         break;
490     case VNC_AUTH_TIGHT:
491         *qmp_auth = VNC_PRIMARY_AUTH_TIGHT;
492         break;
493     case VNC_AUTH_ULTRA:
494         *qmp_auth = VNC_PRIMARY_AUTH_ULTRA;
495         break;
496     case VNC_AUTH_TLS:
497         *qmp_auth = VNC_PRIMARY_AUTH_TLS;
498         break;
499     case VNC_AUTH_VENCRYPT:
500         *qmp_auth = VNC_PRIMARY_AUTH_VENCRYPT;
501         *qmp_has_vencrypt = true;
502         switch (subauth) {
503         case VNC_AUTH_VENCRYPT_PLAIN:
504             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_PLAIN;
505             break;
506         case VNC_AUTH_VENCRYPT_TLSNONE:
507             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_NONE;
508             break;
509         case VNC_AUTH_VENCRYPT_TLSVNC:
510             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_VNC;
511             break;
512         case VNC_AUTH_VENCRYPT_TLSPLAIN:
513             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_PLAIN;
514             break;
515         case VNC_AUTH_VENCRYPT_X509NONE:
516             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_NONE;
517             break;
518         case VNC_AUTH_VENCRYPT_X509VNC:
519             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_VNC;
520             break;
521         case VNC_AUTH_VENCRYPT_X509PLAIN:
522             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_PLAIN;
523             break;
524         case VNC_AUTH_VENCRYPT_TLSSASL:
525             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_SASL;
526             break;
527         case VNC_AUTH_VENCRYPT_X509SASL:
528             *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_SASL;
529             break;
530         default:
531             *qmp_has_vencrypt = false;
532             break;
533         }
534         break;
535     case VNC_AUTH_SASL:
536         *qmp_auth = VNC_PRIMARY_AUTH_SASL;
537         break;
538     case VNC_AUTH_NONE:
539     default:
540         *qmp_auth = VNC_PRIMARY_AUTH_NONE;
541         break;
542     }
543 }
544 
qmp_query_vnc_servers(Error ** errp)545 VncInfo2List *qmp_query_vnc_servers(Error **errp)
546 {
547     VncInfo2List *prev = NULL;
548     VncInfo2 *info;
549     VncDisplay *vd;
550     DeviceState *dev;
551     size_t i;
552 
553     QTAILQ_FOREACH(vd, &vnc_displays, next) {
554         info = g_new0(VncInfo2, 1);
555         info->id = g_strdup(vd->id);
556         info->clients = qmp_query_client_list(vd);
557         qmp_query_auth(vd->auth, vd->subauth, &info->auth,
558                        &info->vencrypt, &info->has_vencrypt);
559         if (vd->dcl.con) {
560             dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
561                                                   "device", &error_abort));
562             info->display = g_strdup(dev->id);
563         }
564         for (i = 0; vd->listener != NULL && i < vd->listener->nsioc; i++) {
565             info->server = qmp_query_server_entry(
566                 vd->listener->sioc[i], false, vd->auth, vd->subauth,
567                 info->server);
568         }
569         for (i = 0; vd->wslistener != NULL && i < vd->wslistener->nsioc; i++) {
570             info->server = qmp_query_server_entry(
571                 vd->wslistener->sioc[i], true, vd->ws_auth,
572                 vd->ws_subauth, info->server);
573         }
574 
575         QAPI_LIST_PREPEND(prev, info);
576     }
577     return prev;
578 }
579 
vnc_display_reload_certs(const char * id,Error ** errp)580 bool vnc_display_reload_certs(const char *id, Error **errp)
581 {
582     VncDisplay *vd = vnc_display_find(id);
583     QCryptoTLSCredsClass *creds = NULL;
584 
585     if (!vd) {
586         error_setg(errp, "Can not find vnc display");
587         return false;
588     }
589 
590     if (!vd->tlscreds) {
591         error_setg(errp, "vnc tls is not enabled");
592         return false;
593     }
594 
595     creds = QCRYPTO_TLS_CREDS_GET_CLASS(OBJECT(vd->tlscreds));
596     if (creds->reload == NULL) {
597         error_setg(errp, "%s doesn't support to reload TLS credential",
598                    object_get_typename(OBJECT(vd->tlscreds)));
599         return false;
600     }
601     if (!creds->reload(vd->tlscreds, errp)) {
602         return false;
603     }
604 
605     return true;
606 }
607 
608 /* TODO
609    1) Get the queue working for IO.
610    2) there is some weirdness when using the -S option (the screen is grey
611       and not totally invalidated
612    3) resolutions > 1024
613 */
614 
615 static int vnc_update_client(VncState *vs, int has_dirty);
616 static void vnc_disconnect_start(VncState *vs);
617 
618 static void vnc_colordepth(VncState *vs);
619 static void framebuffer_update_request(VncState *vs, int incremental,
620                                        int x_position, int y_position,
621                                        int w, int h);
622 static void vnc_refresh(DisplayChangeListener *dcl);
623 static int vnc_refresh_server_surface(VncDisplay *vd);
624 
vnc_width(VncDisplay * vd)625 static int vnc_width(VncDisplay *vd)
626 {
627     return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds),
628                                        VNC_DIRTY_PIXELS_PER_BIT));
629 }
630 
vnc_true_width(VncDisplay * vd)631 static int vnc_true_width(VncDisplay *vd)
632 {
633     return MIN(VNC_MAX_WIDTH, surface_width(vd->ds));
634 }
635 
vnc_height(VncDisplay * vd)636 static int vnc_height(VncDisplay *vd)
637 {
638     return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds));
639 }
640 
641 static void vnc_set_area_dirty(DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
642                                VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT),
643                                VncDisplay *vd,
644                                int x, int y, int w, int h)
645 {
646     int width = vnc_width(vd);
647     int height = vnc_height(vd);
648 
649     /* this is needed this to ensure we updated all affected
650      * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
651     w += (x % VNC_DIRTY_PIXELS_PER_BIT);
652     x -= (x % VNC_DIRTY_PIXELS_PER_BIT);
653 
654     x = MIN(x, width);
655     y = MIN(y, height);
656     w = MIN(x + w, width) - x;
657     h = MIN(y + h, height);
658 
659     for (; y < h; y++) {
660         bitmap_set(dirty[y], x / VNC_DIRTY_PIXELS_PER_BIT,
661                    DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));
662     }
663 }
664 
vnc_dpy_update(DisplayChangeListener * dcl,int x,int y,int w,int h)665 static void vnc_dpy_update(DisplayChangeListener *dcl,
666                            int x, int y, int w, int h)
667 {
668     VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
669     struct VncSurface *s = &vd->guest;
670 
671     vnc_set_area_dirty(s->dirty, vd, x, y, w, h);
672 }
673 
vnc_framebuffer_update(VncState * vs,int x,int y,int w,int h,int32_t encoding)674 void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
675                             int32_t encoding)
676 {
677     vnc_write_u16(vs, x);
678     vnc_write_u16(vs, y);
679     vnc_write_u16(vs, w);
680     vnc_write_u16(vs, h);
681 
682     vnc_write_s32(vs, encoding);
683 }
684 
vnc_desktop_resize_ext(VncState * vs,int reject_reason)685 static void vnc_desktop_resize_ext(VncState *vs, int reject_reason)
686 {
687     trace_vnc_msg_server_ext_desktop_resize(
688         vs, vs->ioc, vs->client_width, vs->client_height, reject_reason);
689 
690     vnc_lock_output(vs);
691     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
692     vnc_write_u8(vs, 0);
693     vnc_write_u16(vs, 1); /* number of rects */
694     vnc_framebuffer_update(vs,
695                            reject_reason ? 1 : 0,
696                            reject_reason,
697                            vs->client_width, vs->client_height,
698                            VNC_ENCODING_DESKTOP_RESIZE_EXT);
699     vnc_write_u8(vs, 1);  /* number of screens */
700     vnc_write_u8(vs, 0);  /* padding */
701     vnc_write_u8(vs, 0);  /* padding */
702     vnc_write_u8(vs, 0);  /* padding */
703     vnc_write_u32(vs, 0); /* screen id */
704     vnc_write_u16(vs, 0); /* screen x-pos */
705     vnc_write_u16(vs, 0); /* screen y-pos */
706     vnc_write_u16(vs, vs->client_width);
707     vnc_write_u16(vs, vs->client_height);
708     vnc_write_u32(vs, 0); /* screen flags */
709     vnc_unlock_output(vs);
710     vnc_flush(vs);
711 }
712 
vnc_desktop_resize(VncState * vs)713 static void vnc_desktop_resize(VncState *vs)
714 {
715     if (vs->ioc == NULL || (!vnc_has_feature(vs, VNC_FEATURE_RESIZE) &&
716                             !vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT))) {
717         return;
718     }
719     if (vs->client_width == vs->vd->true_width &&
720         vs->client_height == pixman_image_get_height(vs->vd->server)) {
721         return;
722     }
723 
724     assert(vs->vd->true_width < 65536 &&
725            vs->vd->true_width >= 0);
726     assert(pixman_image_get_height(vs->vd->server) < 65536 &&
727            pixman_image_get_height(vs->vd->server) >= 0);
728     vs->client_width = vs->vd->true_width;
729     vs->client_height = pixman_image_get_height(vs->vd->server);
730 
731     if (vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)) {
732         vnc_desktop_resize_ext(vs, 0);
733         return;
734     }
735 
736     trace_vnc_msg_server_desktop_resize(
737         vs, vs->ioc, vs->client_width, vs->client_height);
738 
739     vnc_lock_output(vs);
740     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
741     vnc_write_u8(vs, 0);
742     vnc_write_u16(vs, 1); /* number of rects */
743     vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
744                            VNC_ENCODING_DESKTOPRESIZE);
745     vnc_unlock_output(vs);
746     vnc_flush(vs);
747 }
748 
vnc_abort_display_jobs(VncDisplay * vd)749 static void vnc_abort_display_jobs(VncDisplay *vd)
750 {
751     VncState *vs;
752 
753     QTAILQ_FOREACH(vs, &vd->clients, next) {
754         vnc_lock_output(vs);
755         vs->abort = true;
756         vnc_unlock_output(vs);
757     }
758     QTAILQ_FOREACH(vs, &vd->clients, next) {
759         vnc_jobs_join(vs);
760     }
761     QTAILQ_FOREACH(vs, &vd->clients, next) {
762         vnc_lock_output(vs);
763         if (vs->update == VNC_STATE_UPDATE_NONE &&
764             vs->job_update != VNC_STATE_UPDATE_NONE) {
765             /* job aborted before completion */
766             vs->update = vs->job_update;
767             vs->job_update = VNC_STATE_UPDATE_NONE;
768         }
769         vs->abort = false;
770         vnc_unlock_output(vs);
771     }
772 }
773 
vnc_server_fb_stride(VncDisplay * vd)774 int vnc_server_fb_stride(VncDisplay *vd)
775 {
776     return pixman_image_get_stride(vd->server);
777 }
778 
vnc_server_fb_ptr(VncDisplay * vd,int x,int y)779 void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y)
780 {
781     uint8_t *ptr;
782 
783     ptr  = (uint8_t *)pixman_image_get_data(vd->server);
784     ptr += y * vnc_server_fb_stride(vd);
785     ptr += x * VNC_SERVER_FB_BYTES;
786     return ptr;
787 }
788 
vnc_update_server_surface(VncDisplay * vd)789 static void vnc_update_server_surface(VncDisplay *vd)
790 {
791     int width, height;
792 
793     qemu_pixman_image_unref(vd->server);
794     vd->server = NULL;
795 
796     if (QTAILQ_EMPTY(&vd->clients)) {
797         return;
798     }
799 
800     width = vnc_width(vd);
801     height = vnc_height(vd);
802     vd->true_width = vnc_true_width(vd);
803     vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT,
804                                           width, height,
805                                           NULL, 0);
806 
807     memset(vd->guest.dirty, 0x00, sizeof(vd->guest.dirty));
808     vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
809                        width, height);
810 }
811 
vnc_check_pageflip(DisplaySurface * s1,DisplaySurface * s2)812 static bool vnc_check_pageflip(DisplaySurface *s1,
813                                DisplaySurface *s2)
814 {
815     return (s1 != NULL &&
816             s2 != NULL &&
817             surface_width(s1) == surface_width(s2) &&
818             surface_height(s1) == surface_height(s2) &&
819             surface_format(s1) == surface_format(s2));
820 
821 }
822 
vnc_dpy_switch(DisplayChangeListener * dcl,DisplaySurface * surface)823 static void vnc_dpy_switch(DisplayChangeListener *dcl,
824                            DisplaySurface *surface)
825 {
826     VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
827     bool pageflip = vnc_check_pageflip(vd->ds, surface);
828     VncState *vs;
829 
830     vnc_abort_display_jobs(vd);
831     vd->ds = surface;
832 
833     /* guest surface */
834     qemu_pixman_image_unref(vd->guest.fb);
835     vd->guest.fb = pixman_image_ref(surface->image);
836     vd->guest.format = surface_format(surface);
837 
838 
839     if (pageflip) {
840         trace_vnc_server_dpy_pageflip(vd,
841                                       surface_width(surface),
842                                       surface_height(surface),
843                                       surface_format(surface));
844         vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
845                            surface_width(surface),
846                            surface_height(surface));
847         return;
848     }
849 
850     trace_vnc_server_dpy_recreate(vd,
851                                   surface_width(surface),
852                                   surface_height(surface),
853                                   surface_format(surface));
854     /* server surface */
855     vnc_update_server_surface(vd);
856 
857     QTAILQ_FOREACH(vs, &vd->clients, next) {
858         vnc_colordepth(vs);
859         vnc_desktop_resize(vs);
860         vnc_cursor_define(vs);
861         memset(vs->dirty, 0x00, sizeof(vs->dirty));
862         vnc_set_area_dirty(vs->dirty, vd, 0, 0,
863                            vnc_width(vd),
864                            vnc_height(vd));
865         vnc_update_throttle_offset(vs);
866     }
867 }
868 
869 /* fastest code */
vnc_write_pixels_copy(VncState * vs,void * pixels,int size)870 static void vnc_write_pixels_copy(VncState *vs,
871                                   void *pixels, int size)
872 {
873     vnc_write(vs, pixels, size);
874 }
875 
876 /* slowest but generic code. */
vnc_convert_pixel(VncState * vs,uint8_t * buf,uint32_t v)877 void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
878 {
879     uint8_t r, g, b;
880 
881 #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
882     r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8;
883     g = (((v & 0x0000ff00) >>  8) << vs->client_pf.gbits) >> 8;
884     b = (((v & 0x000000ff) >>  0) << vs->client_pf.bbits) >> 8;
885 #else
886 # error need some bits here if you change VNC_SERVER_FB_FORMAT
887 #endif
888     v = (r << vs->client_pf.rshift) |
889         (g << vs->client_pf.gshift) |
890         (b << vs->client_pf.bshift);
891     switch (vs->client_pf.bytes_per_pixel) {
892     case 1:
893         buf[0] = v;
894         break;
895     case 2:
896         if (vs->client_be) {
897             buf[0] = v >> 8;
898             buf[1] = v;
899         } else {
900             buf[1] = v >> 8;
901             buf[0] = v;
902         }
903         break;
904     default:
905     case 4:
906         if (vs->client_be) {
907             buf[0] = v >> 24;
908             buf[1] = v >> 16;
909             buf[2] = v >> 8;
910             buf[3] = v;
911         } else {
912             buf[3] = v >> 24;
913             buf[2] = v >> 16;
914             buf[1] = v >> 8;
915             buf[0] = v;
916         }
917         break;
918     }
919 }
920 
vnc_write_pixels_generic(VncState * vs,void * pixels1,int size)921 static void vnc_write_pixels_generic(VncState *vs,
922                                      void *pixels1, int size)
923 {
924     uint8_t buf[4];
925 
926     if (VNC_SERVER_FB_BYTES == 4) {
927         uint32_t *pixels = pixels1;
928         int n, i;
929         n = size >> 2;
930         for (i = 0; i < n; i++) {
931             vnc_convert_pixel(vs, buf, pixels[i]);
932             vnc_write(vs, buf, vs->client_pf.bytes_per_pixel);
933         }
934     }
935 }
936 
vnc_raw_send_framebuffer_update(VncState * vs,int x,int y,int w,int h)937 int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
938 {
939     int i;
940     uint8_t *row;
941     VncDisplay *vd = vs->vd;
942 
943     row = vnc_server_fb_ptr(vd, x, y);
944     for (i = 0; i < h; i++) {
945         vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES);
946         row += vnc_server_fb_stride(vd);
947     }
948     return 1;
949 }
950 
vnc_send_framebuffer_update(VncState * vs,int x,int y,int w,int h)951 int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
952 {
953     int n = 0;
954 
955     switch(vs->vnc_encoding) {
956         case VNC_ENCODING_ZLIB:
957             n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
958             break;
959         case VNC_ENCODING_HEXTILE:
960             vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
961             n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
962             break;
963         case VNC_ENCODING_TIGHT:
964             n = vnc_tight_send_framebuffer_update(vs, x, y, w, h);
965             break;
966         case VNC_ENCODING_TIGHT_PNG:
967             n = vnc_tight_png_send_framebuffer_update(vs, x, y, w, h);
968             break;
969         case VNC_ENCODING_ZRLE:
970             n = vnc_zrle_send_framebuffer_update(vs, x, y, w, h);
971             break;
972         case VNC_ENCODING_ZYWRLE:
973             n = vnc_zywrle_send_framebuffer_update(vs, x, y, w, h);
974             break;
975         default:
976             vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
977             n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
978             break;
979     }
980     return n;
981 }
982 
vnc_mouse_set(DisplayChangeListener * dcl,int x,int y,bool visible)983 static void vnc_mouse_set(DisplayChangeListener *dcl,
984                           int x, int y, bool visible)
985 {
986     /* can we ask the client(s) to move the pointer ??? */
987 }
988 
vnc_cursor_define(VncState * vs)989 static int vnc_cursor_define(VncState *vs)
990 {
991     QEMUCursor *c = qemu_console_get_cursor(vs->vd->dcl.con);
992     int isize;
993 
994     if (!c) {
995         return -1;
996     }
997 
998     if (vnc_has_feature(vs, VNC_FEATURE_ALPHA_CURSOR)) {
999         vnc_lock_output(vs);
1000         vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1001         vnc_write_u8(vs,  0);  /*  padding     */
1002         vnc_write_u16(vs, 1);  /*  # of rects  */
1003         vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
1004                                VNC_ENCODING_ALPHA_CURSOR);
1005         vnc_write_s32(vs, VNC_ENCODING_RAW);
1006         vnc_write(vs, c->data, c->width * c->height * 4);
1007         vnc_unlock_output(vs);
1008         return 0;
1009     }
1010     if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
1011         vnc_lock_output(vs);
1012         vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1013         vnc_write_u8(vs,  0);  /*  padding     */
1014         vnc_write_u16(vs, 1);  /*  # of rects  */
1015         vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
1016                                VNC_ENCODING_RICH_CURSOR);
1017         isize = c->width * c->height * vs->client_pf.bytes_per_pixel;
1018         vnc_write_pixels_generic(vs, c->data, isize);
1019         vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
1020         vnc_unlock_output(vs);
1021         return 0;
1022     }
1023     return -1;
1024 }
1025 
vnc_dpy_cursor_define(DisplayChangeListener * dcl,QEMUCursor * c)1026 static void vnc_dpy_cursor_define(DisplayChangeListener *dcl,
1027                                   QEMUCursor *c)
1028 {
1029     VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
1030     VncState *vs;
1031 
1032     g_free(vd->cursor_mask);
1033     vd->cursor_msize = cursor_get_mono_bpl(c) * c->height;
1034     vd->cursor_mask = g_malloc0(vd->cursor_msize);
1035     cursor_get_mono_mask(c, 0, vd->cursor_mask);
1036 
1037     QTAILQ_FOREACH(vs, &vd->clients, next) {
1038         vnc_cursor_define(vs);
1039     }
1040 }
1041 
find_and_clear_dirty_height(VncState * vs,int y,int last_x,int x,int height)1042 static int find_and_clear_dirty_height(VncState *vs,
1043                                        int y, int last_x, int x, int height)
1044 {
1045     int h;
1046 
1047     for (h = 1; h < (height - y); h++) {
1048         if (!test_bit(last_x, vs->dirty[y + h])) {
1049             break;
1050         }
1051         bitmap_clear(vs->dirty[y + h], last_x, x - last_x);
1052     }
1053 
1054     return h;
1055 }
1056 
1057 /*
1058  * Figure out how much pending data we should allow in the output
1059  * buffer before we throttle incremental display updates, and/or
1060  * drop audio samples.
1061  *
1062  * We allow for equiv of 1 full display's worth of FB updates,
1063  * and 1 second of audio samples. If audio backlog was larger
1064  * than that the client would already suffering awful audio
1065  * glitches, so dropping samples is no worse really).
1066  */
vnc_update_throttle_offset(VncState * vs)1067 static void vnc_update_throttle_offset(VncState *vs)
1068 {
1069     size_t offset =
1070         vs->client_width * vs->client_height * vs->client_pf.bytes_per_pixel;
1071 
1072     if (vs->audio_cap) {
1073         int bps;
1074         switch (vs->as.fmt) {
1075         default:
1076         case  AUDIO_FORMAT_U8:
1077         case  AUDIO_FORMAT_S8:
1078             bps = 1;
1079             break;
1080         case  AUDIO_FORMAT_U16:
1081         case  AUDIO_FORMAT_S16:
1082             bps = 2;
1083             break;
1084         case  AUDIO_FORMAT_U32:
1085         case  AUDIO_FORMAT_S32:
1086             bps = 4;
1087             break;
1088         }
1089         offset += vs->as.freq * bps * vs->as.nchannels;
1090     }
1091 
1092     /* Put a floor of 1MB on offset, so that if we have a large pending
1093      * buffer and the display is resized to a small size & back again
1094      * we don't suddenly apply a tiny send limit
1095      */
1096     offset = MAX(offset, 1024 * 1024);
1097 
1098     if (vs->throttle_output_offset != offset) {
1099         trace_vnc_client_throttle_threshold(
1100             vs, vs->ioc, vs->throttle_output_offset, offset, vs->client_width,
1101             vs->client_height, vs->client_pf.bytes_per_pixel, vs->audio_cap);
1102     }
1103 
1104     vs->throttle_output_offset = offset;
1105 }
1106 
vnc_should_update(VncState * vs)1107 static bool vnc_should_update(VncState *vs)
1108 {
1109     switch (vs->update) {
1110     case VNC_STATE_UPDATE_NONE:
1111         break;
1112     case VNC_STATE_UPDATE_INCREMENTAL:
1113         /* Only allow incremental updates if the pending send queue
1114          * is less than the permitted threshold, and the job worker
1115          * is completely idle.
1116          */
1117         if (vs->output.offset < vs->throttle_output_offset &&
1118             vs->job_update == VNC_STATE_UPDATE_NONE) {
1119             return true;
1120         }
1121         trace_vnc_client_throttle_incremental(
1122             vs, vs->ioc, vs->job_update, vs->output.offset);
1123         break;
1124     case VNC_STATE_UPDATE_FORCE:
1125         /* Only allow forced updates if the pending send queue
1126          * does not contain a previous forced update, and the
1127          * job worker is completely idle.
1128          *
1129          * Note this means we'll queue a forced update, even if
1130          * the output buffer size is otherwise over the throttle
1131          * output limit.
1132          */
1133         if (vs->force_update_offset == 0 &&
1134             vs->job_update == VNC_STATE_UPDATE_NONE) {
1135             return true;
1136         }
1137         trace_vnc_client_throttle_forced(
1138             vs, vs->ioc, vs->job_update, vs->force_update_offset);
1139         break;
1140     }
1141     return false;
1142 }
1143 
vnc_update_client(VncState * vs,int has_dirty)1144 static int vnc_update_client(VncState *vs, int has_dirty)
1145 {
1146     VncDisplay *vd = vs->vd;
1147     VncJob *job;
1148     int y;
1149     int height, width;
1150     int n = 0;
1151 
1152     if (vs->disconnecting) {
1153         vnc_disconnect_finish(vs);
1154         return 0;
1155     }
1156 
1157     vs->has_dirty += has_dirty;
1158     if (!vnc_should_update(vs)) {
1159         return 0;
1160     }
1161 
1162     if (!vs->has_dirty && vs->update != VNC_STATE_UPDATE_FORCE) {
1163         return 0;
1164     }
1165 
1166     /*
1167      * Send screen updates to the vnc client using the server
1168      * surface and server dirty map.  guest surface updates
1169      * happening in parallel don't disturb us, the next pass will
1170      * send them to the client.
1171      */
1172     job = vnc_job_new(vs);
1173 
1174     height = pixman_image_get_height(vd->server);
1175     width = pixman_image_get_width(vd->server);
1176 
1177     y = 0;
1178     for (;;) {
1179         int x, h;
1180         unsigned long x2;
1181         unsigned long offset = find_next_bit((unsigned long *) &vs->dirty,
1182                                              height * VNC_DIRTY_BPL(vs),
1183                                              y * VNC_DIRTY_BPL(vs));
1184         if (offset == height * VNC_DIRTY_BPL(vs)) {
1185             /* no more dirty bits */
1186             break;
1187         }
1188         y = offset / VNC_DIRTY_BPL(vs);
1189         x = offset % VNC_DIRTY_BPL(vs);
1190         x2 = find_next_zero_bit((unsigned long *) &vs->dirty[y],
1191                                 VNC_DIRTY_BPL(vs), x);
1192         bitmap_clear(vs->dirty[y], x, x2 - x);
1193         h = find_and_clear_dirty_height(vs, y, x, x2, height);
1194         x2 = MIN(x2, width / VNC_DIRTY_PIXELS_PER_BIT);
1195         if (x2 > x) {
1196             n += vnc_job_add_rect(job, x * VNC_DIRTY_PIXELS_PER_BIT, y,
1197                                   (x2 - x) * VNC_DIRTY_PIXELS_PER_BIT, h);
1198         }
1199         if (!x && x2 == width / VNC_DIRTY_PIXELS_PER_BIT) {
1200             y += h;
1201             if (y == height) {
1202                 break;
1203             }
1204         }
1205     }
1206 
1207     vs->job_update = vs->update;
1208     vs->update = VNC_STATE_UPDATE_NONE;
1209     vnc_job_push(job);
1210     vs->has_dirty = 0;
1211     return n;
1212 }
1213 
1214 /* audio */
audio_capture_notify(void * opaque,audcnotification_e cmd)1215 static void audio_capture_notify(void *opaque, audcnotification_e cmd)
1216 {
1217     VncState *vs = opaque;
1218 
1219     assert(vs->magic == VNC_MAGIC);
1220     switch (cmd) {
1221     case AUD_CNOTIFY_DISABLE:
1222         trace_vnc_msg_server_audio_end(vs, vs->ioc);
1223         vnc_lock_output(vs);
1224         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1225         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1226         vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_END);
1227         vnc_unlock_output(vs);
1228         vnc_flush(vs);
1229         break;
1230 
1231     case AUD_CNOTIFY_ENABLE:
1232         trace_vnc_msg_server_audio_begin(vs, vs->ioc);
1233         vnc_lock_output(vs);
1234         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1235         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1236         vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN);
1237         vnc_unlock_output(vs);
1238         vnc_flush(vs);
1239         break;
1240     }
1241 }
1242 
audio_capture_destroy(void * opaque)1243 static void audio_capture_destroy(void *opaque)
1244 {
1245 }
1246 
audio_capture(void * opaque,const void * buf,int size)1247 static void audio_capture(void *opaque, const void *buf, int size)
1248 {
1249     VncState *vs = opaque;
1250 
1251     assert(vs->magic == VNC_MAGIC);
1252     trace_vnc_msg_server_audio_data(vs, vs->ioc, buf, size);
1253     vnc_lock_output(vs);
1254     if (vs->output.offset < vs->throttle_output_offset) {
1255         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1256         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1257         vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_DATA);
1258         vnc_write_u32(vs, size);
1259         vnc_write(vs, buf, size);
1260     } else {
1261         trace_vnc_client_throttle_audio(vs, vs->ioc, vs->output.offset);
1262     }
1263     vnc_unlock_output(vs);
1264     vnc_flush(vs);
1265 }
1266 
audio_add(VncState * vs)1267 static void audio_add(VncState *vs)
1268 {
1269     struct audio_capture_ops ops;
1270 
1271     if (vs->audio_cap) {
1272         error_report("audio already running");
1273         return;
1274     }
1275 
1276     ops.notify = audio_capture_notify;
1277     ops.destroy = audio_capture_destroy;
1278     ops.capture = audio_capture;
1279 
1280     vs->audio_cap = AUD_add_capture(vs->vd->audio_state, &vs->as, &ops, vs);
1281     if (!vs->audio_cap) {
1282         error_report("Failed to add audio capture");
1283     }
1284 }
1285 
audio_del(VncState * vs)1286 static void audio_del(VncState *vs)
1287 {
1288     if (vs->audio_cap) {
1289         AUD_del_capture(vs->audio_cap, vs);
1290         vs->audio_cap = NULL;
1291     }
1292 }
1293 
vnc_disconnect_start(VncState * vs)1294 static void vnc_disconnect_start(VncState *vs)
1295 {
1296     if (vs->disconnecting) {
1297         return;
1298     }
1299     trace_vnc_client_disconnect_start(vs, vs->ioc);
1300     vnc_set_share_mode(vs, VNC_SHARE_MODE_DISCONNECTED);
1301     if (vs->ioc_tag) {
1302         g_source_remove(vs->ioc_tag);
1303         vs->ioc_tag = 0;
1304     }
1305     qio_channel_close(vs->ioc, NULL);
1306     vs->disconnecting = TRUE;
1307 }
1308 
vnc_disconnect_finish(VncState * vs)1309 void vnc_disconnect_finish(VncState *vs)
1310 {
1311     int i;
1312 
1313     trace_vnc_client_disconnect_finish(vs, vs->ioc);
1314 
1315     vnc_jobs_join(vs); /* Wait encoding jobs */
1316 
1317     vnc_lock_output(vs);
1318     vnc_qmp_event(vs, QAPI_EVENT_VNC_DISCONNECTED);
1319 
1320     buffer_free(&vs->input);
1321     buffer_free(&vs->output);
1322 
1323     qapi_free_VncClientInfo(vs->info);
1324 
1325     vnc_zlib_clear(vs);
1326     vnc_tight_clear(vs);
1327     vnc_zrle_clear(vs);
1328 
1329 #ifdef CONFIG_VNC_SASL
1330     vnc_sasl_client_cleanup(vs);
1331 #endif /* CONFIG_VNC_SASL */
1332     audio_del(vs);
1333     qkbd_state_lift_all_keys(vs->vd->kbd);
1334 
1335     if (vs->mouse_mode_notifier.notify != NULL) {
1336         qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
1337     }
1338     QTAILQ_REMOVE(&vs->vd->clients, vs, next);
1339     if (QTAILQ_EMPTY(&vs->vd->clients)) {
1340         /* last client gone */
1341         vnc_update_server_surface(vs->vd);
1342     }
1343     vnc_unlock_output(vs);
1344 
1345     if (vs->cbpeer.notifier.notify) {
1346         qemu_clipboard_peer_unregister(&vs->cbpeer);
1347     }
1348 
1349     qemu_mutex_destroy(&vs->output_mutex);
1350     if (vs->bh != NULL) {
1351         qemu_bh_delete(vs->bh);
1352     }
1353     buffer_free(&vs->jobs_buffer);
1354 
1355     for (i = 0; i < VNC_STAT_ROWS; ++i) {
1356         g_free(vs->lossy_rect[i]);
1357     }
1358     g_free(vs->lossy_rect);
1359 
1360     object_unref(OBJECT(vs->ioc));
1361     vs->ioc = NULL;
1362     object_unref(OBJECT(vs->sioc));
1363     vs->sioc = NULL;
1364     vs->magic = 0;
1365     g_free(vs->zrle);
1366     g_free(vs->tight);
1367     g_free(vs);
1368 }
1369 
vnc_client_io_error(VncState * vs,ssize_t ret,Error * err)1370 size_t vnc_client_io_error(VncState *vs, ssize_t ret, Error *err)
1371 {
1372     if (ret <= 0) {
1373         if (ret == 0) {
1374             trace_vnc_client_eof(vs, vs->ioc);
1375             vnc_disconnect_start(vs);
1376         } else if (ret != QIO_CHANNEL_ERR_BLOCK) {
1377             trace_vnc_client_io_error(vs, vs->ioc,
1378                                       err ? error_get_pretty(err) : "Unknown");
1379             vnc_disconnect_start(vs);
1380         }
1381 
1382         error_free(err);
1383         return 0;
1384     }
1385     return ret;
1386 }
1387 
1388 
vnc_client_error(VncState * vs)1389 void vnc_client_error(VncState *vs)
1390 {
1391     VNC_DEBUG("Closing down client sock: protocol error\n");
1392     vnc_disconnect_start(vs);
1393 }
1394 
1395 
1396 /*
1397  * Called to write a chunk of data to the client socket. The data may
1398  * be the raw data, or may have already been encoded by SASL.
1399  * The data will be written either straight onto the socket, or
1400  * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1401  *
1402  * NB, it is theoretically possible to have 2 layers of encryption,
1403  * both SASL, and this TLS layer. It is highly unlikely in practice
1404  * though, since SASL encryption will typically be a no-op if TLS
1405  * is active
1406  *
1407  * Returns the number of bytes written, which may be less than
1408  * the requested 'datalen' if the socket would block. Returns
1409  * 0 on I/O error, and disconnects the client socket.
1410  */
vnc_client_write_buf(VncState * vs,const uint8_t * data,size_t datalen)1411 size_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen)
1412 {
1413     Error *err = NULL;
1414     ssize_t ret;
1415     ret = qio_channel_write(vs->ioc, (const char *)data, datalen, &err);
1416     VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret);
1417     return vnc_client_io_error(vs, ret, err);
1418 }
1419 
1420 
1421 /*
1422  * Called to write buffered data to the client socket, when not
1423  * using any SASL SSF encryption layers. Will write as much data
1424  * as possible without blocking. If all buffered data is written,
1425  * will switch the FD poll() handler back to read monitoring.
1426  *
1427  * Returns the number of bytes written, which may be less than
1428  * the buffered output data if the socket would block.  Returns
1429  * 0 on I/O error, and disconnects the client socket.
1430  */
vnc_client_write_plain(VncState * vs)1431 static size_t vnc_client_write_plain(VncState *vs)
1432 {
1433     size_t offset;
1434     size_t ret;
1435 
1436 #ifdef CONFIG_VNC_SASL
1437     VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1438               vs->output.buffer, vs->output.capacity, vs->output.offset,
1439               vs->sasl.waitWriteSSF);
1440 
1441     if (vs->sasl.conn &&
1442         vs->sasl.runSSF &&
1443         vs->sasl.waitWriteSSF) {
1444         ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF);
1445         if (ret)
1446             vs->sasl.waitWriteSSF -= ret;
1447     } else
1448 #endif /* CONFIG_VNC_SASL */
1449         ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset);
1450     if (!ret)
1451         return 0;
1452 
1453     if (ret >= vs->force_update_offset) {
1454         if (vs->force_update_offset != 0) {
1455             trace_vnc_client_unthrottle_forced(vs, vs->ioc);
1456         }
1457         vs->force_update_offset = 0;
1458     } else {
1459         vs->force_update_offset -= ret;
1460     }
1461     offset = vs->output.offset;
1462     buffer_advance(&vs->output, ret);
1463     if (offset >= vs->throttle_output_offset &&
1464         vs->output.offset < vs->throttle_output_offset) {
1465         trace_vnc_client_unthrottle_incremental(vs, vs->ioc, vs->output.offset);
1466     }
1467 
1468     if (vs->output.offset == 0) {
1469         if (vs->ioc_tag) {
1470             g_source_remove(vs->ioc_tag);
1471         }
1472         vs->ioc_tag = qio_channel_add_watch(
1473             vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
1474             vnc_client_io, vs, NULL);
1475     }
1476 
1477     return ret;
1478 }
1479 
1480 
1481 /*
1482  * First function called whenever there is data to be written to
1483  * the client socket. Will delegate actual work according to whether
1484  * SASL SSF layers are enabled (thus requiring encryption calls)
1485  */
vnc_client_write_locked(VncState * vs)1486 static void vnc_client_write_locked(VncState *vs)
1487 {
1488 #ifdef CONFIG_VNC_SASL
1489     if (vs->sasl.conn &&
1490         vs->sasl.runSSF &&
1491         !vs->sasl.waitWriteSSF) {
1492         vnc_client_write_sasl(vs);
1493     } else
1494 #endif /* CONFIG_VNC_SASL */
1495     {
1496         vnc_client_write_plain(vs);
1497     }
1498 }
1499 
vnc_client_write(VncState * vs)1500 static void vnc_client_write(VncState *vs)
1501 {
1502     assert(vs->magic == VNC_MAGIC);
1503     vnc_lock_output(vs);
1504     if (vs->output.offset) {
1505         vnc_client_write_locked(vs);
1506     } else if (vs->ioc != NULL) {
1507         if (vs->ioc_tag) {
1508             g_source_remove(vs->ioc_tag);
1509         }
1510         vs->ioc_tag = qio_channel_add_watch(
1511             vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
1512             vnc_client_io, vs, NULL);
1513     }
1514     vnc_unlock_output(vs);
1515 }
1516 
vnc_read_when(VncState * vs,VncReadEvent * func,size_t expecting)1517 void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
1518 {
1519     vs->read_handler = func;
1520     vs->read_handler_expect = expecting;
1521 }
1522 
1523 
1524 /*
1525  * Called to read a chunk of data from the client socket. The data may
1526  * be the raw data, or may need to be further decoded by SASL.
1527  * The data will be read either straight from to the socket, or
1528  * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1529  *
1530  * NB, it is theoretically possible to have 2 layers of encryption,
1531  * both SASL, and this TLS layer. It is highly unlikely in practice
1532  * though, since SASL encryption will typically be a no-op if TLS
1533  * is active
1534  *
1535  * Returns the number of bytes read, which may be less than
1536  * the requested 'datalen' if the socket would block. Returns
1537  * 0 on I/O error or EOF, and disconnects the client socket.
1538  */
vnc_client_read_buf(VncState * vs,uint8_t * data,size_t datalen)1539 size_t vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen)
1540 {
1541     ssize_t ret;
1542     Error *err = NULL;
1543     ret = qio_channel_read(vs->ioc, (char *)data, datalen, &err);
1544     VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret);
1545     return vnc_client_io_error(vs, ret, err);
1546 }
1547 
1548 
1549 /*
1550  * Called to read data from the client socket to the input buffer,
1551  * when not using any SASL SSF encryption layers. Will read as much
1552  * data as possible without blocking.
1553  *
1554  * Returns the number of bytes read, which may be less than
1555  * the requested 'datalen' if the socket would block. Returns
1556  * 0 on I/O error or EOF, and disconnects the client socket.
1557  */
vnc_client_read_plain(VncState * vs)1558 static size_t vnc_client_read_plain(VncState *vs)
1559 {
1560     size_t ret;
1561     VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1562               vs->input.buffer, vs->input.capacity, vs->input.offset);
1563     buffer_reserve(&vs->input, 4096);
1564     ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096);
1565     if (!ret)
1566         return 0;
1567     vs->input.offset += ret;
1568     return ret;
1569 }
1570 
vnc_jobs_bh(void * opaque)1571 static void vnc_jobs_bh(void *opaque)
1572 {
1573     VncState *vs = opaque;
1574 
1575     assert(vs->magic == VNC_MAGIC);
1576     vnc_jobs_consume_buffer(vs);
1577 }
1578 
1579 /*
1580  * First function called whenever there is more data to be read from
1581  * the client socket. Will delegate actual work according to whether
1582  * SASL SSF layers are enabled (thus requiring decryption calls)
1583  * Returns 0 on success, -1 if client disconnected
1584  */
vnc_client_read(VncState * vs)1585 static int vnc_client_read(VncState *vs)
1586 {
1587     size_t sz;
1588 
1589 #ifdef CONFIG_VNC_SASL
1590     if (vs->sasl.conn && vs->sasl.runSSF)
1591         sz = vnc_client_read_sasl(vs);
1592     else
1593 #endif /* CONFIG_VNC_SASL */
1594         sz = vnc_client_read_plain(vs);
1595     if (!sz) {
1596         if (vs->disconnecting) {
1597             vnc_disconnect_finish(vs);
1598             return -1;
1599         }
1600         return 0;
1601     }
1602 
1603     while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
1604         size_t len = vs->read_handler_expect;
1605         int ret;
1606 
1607         ret = vs->read_handler(vs, vs->input.buffer, len);
1608         if (vs->disconnecting) {
1609             vnc_disconnect_finish(vs);
1610             return -1;
1611         }
1612 
1613         if (!ret) {
1614             buffer_advance(&vs->input, len);
1615         } else {
1616             vs->read_handler_expect = ret;
1617         }
1618     }
1619     return 0;
1620 }
1621 
vnc_client_io(QIOChannel * ioc G_GNUC_UNUSED,GIOCondition condition,void * opaque)1622 gboolean vnc_client_io(QIOChannel *ioc G_GNUC_UNUSED,
1623                        GIOCondition condition, void *opaque)
1624 {
1625     VncState *vs = opaque;
1626 
1627     assert(vs->magic == VNC_MAGIC);
1628 
1629     if (condition & (G_IO_HUP | G_IO_ERR)) {
1630         vnc_disconnect_start(vs);
1631         return TRUE;
1632     }
1633 
1634     if (condition & G_IO_IN) {
1635         if (vnc_client_read(vs) < 0) {
1636             /* vs is free()ed here */
1637             return TRUE;
1638         }
1639     }
1640     if (condition & G_IO_OUT) {
1641         vnc_client_write(vs);
1642     }
1643 
1644     if (vs->disconnecting) {
1645         if (vs->ioc_tag != 0) {
1646             g_source_remove(vs->ioc_tag);
1647         }
1648         vs->ioc_tag = 0;
1649     }
1650     return TRUE;
1651 }
1652 
1653 
1654 /*
1655  * Scale factor to apply to vs->throttle_output_offset when checking for
1656  * hard limit. Worst case normal usage could be x2, if we have a complete
1657  * incremental update and complete forced update in the output buffer.
1658  * So x3 should be good enough, but we pick x5 to be conservative and thus
1659  * (hopefully) never trigger incorrectly.
1660  */
1661 #define VNC_THROTTLE_OUTPUT_LIMIT_SCALE 5
1662 
vnc_write(VncState * vs,const void * data,size_t len)1663 void vnc_write(VncState *vs, const void *data, size_t len)
1664 {
1665     assert(vs->magic == VNC_MAGIC);
1666     if (vs->disconnecting) {
1667         return;
1668     }
1669     /* Protection against malicious client/guest to prevent our output
1670      * buffer growing without bound if client stops reading data. This
1671      * should rarely trigger, because we have earlier throttling code
1672      * which stops issuing framebuffer updates and drops audio data
1673      * if the throttle_output_offset value is exceeded. So we only reach
1674      * this higher level if a huge number of pseudo-encodings get
1675      * triggered while data can't be sent on the socket.
1676      *
1677      * NB throttle_output_offset can be zero during early protocol
1678      * handshake, or from the job thread's VncState clone
1679      */
1680     if (vs->throttle_output_offset != 0 &&
1681         (vs->output.offset / VNC_THROTTLE_OUTPUT_LIMIT_SCALE) >
1682         vs->throttle_output_offset) {
1683         trace_vnc_client_output_limit(vs, vs->ioc, vs->output.offset,
1684                                       vs->throttle_output_offset);
1685         vnc_disconnect_start(vs);
1686         return;
1687     }
1688     buffer_reserve(&vs->output, len);
1689 
1690     if (vs->ioc != NULL && buffer_empty(&vs->output)) {
1691         if (vs->ioc_tag) {
1692             g_source_remove(vs->ioc_tag);
1693         }
1694         vs->ioc_tag = qio_channel_add_watch(
1695             vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_OUT,
1696             vnc_client_io, vs, NULL);
1697     }
1698 
1699     buffer_append(&vs->output, data, len);
1700 }
1701 
vnc_write_s32(VncState * vs,int32_t value)1702 void vnc_write_s32(VncState *vs, int32_t value)
1703 {
1704     vnc_write_u32(vs, *(uint32_t *)&value);
1705 }
1706 
vnc_write_u32(VncState * vs,uint32_t value)1707 void vnc_write_u32(VncState *vs, uint32_t value)
1708 {
1709     uint8_t buf[4];
1710 
1711     buf[0] = (value >> 24) & 0xFF;
1712     buf[1] = (value >> 16) & 0xFF;
1713     buf[2] = (value >>  8) & 0xFF;
1714     buf[3] = value & 0xFF;
1715 
1716     vnc_write(vs, buf, 4);
1717 }
1718 
vnc_write_u16(VncState * vs,uint16_t value)1719 void vnc_write_u16(VncState *vs, uint16_t value)
1720 {
1721     uint8_t buf[2];
1722 
1723     buf[0] = (value >> 8) & 0xFF;
1724     buf[1] = value & 0xFF;
1725 
1726     vnc_write(vs, buf, 2);
1727 }
1728 
vnc_write_u8(VncState * vs,uint8_t value)1729 void vnc_write_u8(VncState *vs, uint8_t value)
1730 {
1731     vnc_write(vs, (char *)&value, 1);
1732 }
1733 
vnc_flush(VncState * vs)1734 void vnc_flush(VncState *vs)
1735 {
1736     vnc_lock_output(vs);
1737     if (vs->ioc != NULL && vs->output.offset) {
1738         vnc_client_write_locked(vs);
1739     }
1740     if (vs->disconnecting) {
1741         if (vs->ioc_tag != 0) {
1742             g_source_remove(vs->ioc_tag);
1743         }
1744         vs->ioc_tag = 0;
1745     }
1746     vnc_unlock_output(vs);
1747 }
1748 
read_u8(uint8_t * data,size_t offset)1749 static uint8_t read_u8(uint8_t *data, size_t offset)
1750 {
1751     return data[offset];
1752 }
1753 
read_u16(uint8_t * data,size_t offset)1754 static uint16_t read_u16(uint8_t *data, size_t offset)
1755 {
1756     return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
1757 }
1758 
read_s32(uint8_t * data,size_t offset)1759 static int32_t read_s32(uint8_t *data, size_t offset)
1760 {
1761     return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
1762                      (data[offset + 2] << 8) | data[offset + 3]);
1763 }
1764 
read_u32(uint8_t * data,size_t offset)1765 uint32_t read_u32(uint8_t *data, size_t offset)
1766 {
1767     return ((data[offset] << 24) | (data[offset + 1] << 16) |
1768             (data[offset + 2] << 8) | data[offset + 3]);
1769 }
1770 
check_pointer_type_change(Notifier * notifier,void * data)1771 static void check_pointer_type_change(Notifier *notifier, void *data)
1772 {
1773     VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1774     int absolute = qemu_input_is_absolute(vs->vd->dcl.con);
1775 
1776     if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1777         vnc_lock_output(vs);
1778         vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1779         vnc_write_u8(vs, 0);
1780         vnc_write_u16(vs, 1);
1781         vnc_framebuffer_update(vs, absolute, 0,
1782                                pixman_image_get_width(vs->vd->server),
1783                                pixman_image_get_height(vs->vd->server),
1784                                VNC_ENCODING_POINTER_TYPE_CHANGE);
1785         vnc_unlock_output(vs);
1786         vnc_flush(vs);
1787     }
1788     vs->absolute = absolute;
1789 }
1790 
pointer_event(VncState * vs,int button_mask,int x,int y)1791 static void pointer_event(VncState *vs, int button_mask, int x, int y)
1792 {
1793     static uint32_t bmap[INPUT_BUTTON__MAX] = {
1794         [INPUT_BUTTON_LEFT]       = 0x01,
1795         [INPUT_BUTTON_MIDDLE]     = 0x02,
1796         [INPUT_BUTTON_RIGHT]      = 0x04,
1797         [INPUT_BUTTON_WHEEL_UP]   = 0x08,
1798         [INPUT_BUTTON_WHEEL_DOWN] = 0x10,
1799     };
1800     QemuConsole *con = vs->vd->dcl.con;
1801     int width = pixman_image_get_width(vs->vd->server);
1802     int height = pixman_image_get_height(vs->vd->server);
1803 
1804     if (vs->last_bmask != button_mask) {
1805         qemu_input_update_buttons(con, bmap, vs->last_bmask, button_mask);
1806         vs->last_bmask = button_mask;
1807     }
1808 
1809     if (vs->absolute) {
1810         qemu_input_queue_abs(con, INPUT_AXIS_X, x, 0, width);
1811         qemu_input_queue_abs(con, INPUT_AXIS_Y, y, 0, height);
1812     } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
1813         qemu_input_queue_rel(con, INPUT_AXIS_X, x - 0x7FFF);
1814         qemu_input_queue_rel(con, INPUT_AXIS_Y, y - 0x7FFF);
1815     } else {
1816         if (vs->last_x != -1) {
1817             qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x);
1818             qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y);
1819         }
1820         vs->last_x = x;
1821         vs->last_y = y;
1822     }
1823     qemu_input_event_sync();
1824 }
1825 
press_key(VncState * vs,QKeyCode qcode)1826 static void press_key(VncState *vs, QKeyCode qcode)
1827 {
1828     qkbd_state_key_event(vs->vd->kbd, qcode, true);
1829     qkbd_state_key_event(vs->vd->kbd, qcode, false);
1830 }
1831 
vnc_led_state_change(VncState * vs)1832 static void vnc_led_state_change(VncState *vs)
1833 {
1834     if (!vnc_has_feature(vs, VNC_FEATURE_LED_STATE)) {
1835         return;
1836     }
1837 
1838     vnc_lock_output(vs);
1839     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1840     vnc_write_u8(vs, 0);
1841     vnc_write_u16(vs, 1);
1842     vnc_framebuffer_update(vs, 0, 0, 1, 1, VNC_ENCODING_LED_STATE);
1843     vnc_write_u8(vs, vs->vd->ledstate);
1844     vnc_unlock_output(vs);
1845     vnc_flush(vs);
1846 }
1847 
kbd_leds(void * opaque,int ledstate)1848 static void kbd_leds(void *opaque, int ledstate)
1849 {
1850     VncDisplay *vd = opaque;
1851     VncState *client;
1852 
1853     trace_vnc_key_guest_leds((ledstate & QEMU_CAPS_LOCK_LED),
1854                              (ledstate & QEMU_NUM_LOCK_LED),
1855                              (ledstate & QEMU_SCROLL_LOCK_LED));
1856 
1857     if (ledstate == vd->ledstate) {
1858         return;
1859     }
1860 
1861     vd->ledstate = ledstate;
1862 
1863     QTAILQ_FOREACH(client, &vd->clients, next) {
1864         vnc_led_state_change(client);
1865     }
1866 }
1867 
do_key_event(VncState * vs,int down,int keycode,int sym)1868 static void do_key_event(VncState *vs, int down, int keycode, int sym)
1869 {
1870     QKeyCode qcode = qemu_input_key_number_to_qcode(keycode);
1871 
1872     /* QEMU console switch */
1873     switch (qcode) {
1874     case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */
1875         if (down &&
1876             qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) &&
1877             qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {
1878             QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1);
1879             if (con) {
1880                 unregister_displaychangelistener(&vs->vd->dcl);
1881                 qkbd_state_switch_console(vs->vd->kbd, con);
1882                 vs->vd->dcl.con = con;
1883                 register_displaychangelistener(&vs->vd->dcl);
1884             }
1885             return;
1886         }
1887     default:
1888         break;
1889     }
1890 
1891     /* Turn off the lock state sync logic if the client support the led
1892        state extension.
1893     */
1894     if (down && vs->vd->lock_key_sync &&
1895         !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1896         keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
1897         /* If the numlock state needs to change then simulate an additional
1898            keypress before sending this one.  This will happen if the user
1899            toggles numlock away from the VNC window.
1900         */
1901         if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
1902             if (!qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
1903                 trace_vnc_key_sync_numlock(true);
1904                 press_key(vs, Q_KEY_CODE_NUM_LOCK);
1905             }
1906         } else {
1907             if (qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
1908                 trace_vnc_key_sync_numlock(false);
1909                 press_key(vs, Q_KEY_CODE_NUM_LOCK);
1910             }
1911         }
1912     }
1913 
1914     if (down && vs->vd->lock_key_sync &&
1915         !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1916         ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z'))) {
1917         /* If the capslock state needs to change then simulate an additional
1918            keypress before sending this one.  This will happen if the user
1919            toggles capslock away from the VNC window.
1920         */
1921         int uppercase = !!(sym >= 'A' && sym <= 'Z');
1922         bool shift = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_SHIFT);
1923         bool capslock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CAPSLOCK);
1924         if (capslock) {
1925             if (uppercase == shift) {
1926                 trace_vnc_key_sync_capslock(false);
1927                 press_key(vs, Q_KEY_CODE_CAPS_LOCK);
1928             }
1929         } else {
1930             if (uppercase != shift) {
1931                 trace_vnc_key_sync_capslock(true);
1932                 press_key(vs, Q_KEY_CODE_CAPS_LOCK);
1933             }
1934         }
1935     }
1936 
1937     qkbd_state_key_event(vs->vd->kbd, qcode, down);
1938     if (QEMU_IS_TEXT_CONSOLE(vs->vd->dcl.con)) {
1939         QemuTextConsole *con = QEMU_TEXT_CONSOLE(vs->vd->dcl.con);
1940         bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK);
1941         bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL);
1942         /* QEMU console emulation */
1943         if (down) {
1944             switch (keycode) {
1945             case 0x2a:                          /* Left Shift */
1946             case 0x36:                          /* Right Shift */
1947             case 0x1d:                          /* Left CTRL */
1948             case 0x9d:                          /* Right CTRL */
1949             case 0x38:                          /* Left ALT */
1950             case 0xb8:                          /* Right ALT */
1951                 break;
1952             case 0xc8:
1953                 qemu_text_console_put_keysym(con, QEMU_KEY_UP);
1954                 break;
1955             case 0xd0:
1956                 qemu_text_console_put_keysym(con, QEMU_KEY_DOWN);
1957                 break;
1958             case 0xcb:
1959                 qemu_text_console_put_keysym(con, QEMU_KEY_LEFT);
1960                 break;
1961             case 0xcd:
1962                 qemu_text_console_put_keysym(con, QEMU_KEY_RIGHT);
1963                 break;
1964             case 0xd3:
1965                 qemu_text_console_put_keysym(con, QEMU_KEY_DELETE);
1966                 break;
1967             case 0xc7:
1968                 qemu_text_console_put_keysym(con, QEMU_KEY_HOME);
1969                 break;
1970             case 0xcf:
1971                 qemu_text_console_put_keysym(con, QEMU_KEY_END);
1972                 break;
1973             case 0xc9:
1974                 qemu_text_console_put_keysym(con, QEMU_KEY_PAGEUP);
1975                 break;
1976             case 0xd1:
1977                 qemu_text_console_put_keysym(con, QEMU_KEY_PAGEDOWN);
1978                 break;
1979 
1980             case 0x47:
1981                 qemu_text_console_put_keysym(con, numlock ? '7' : QEMU_KEY_HOME);
1982                 break;
1983             case 0x48:
1984                 qemu_text_console_put_keysym(con, numlock ? '8' : QEMU_KEY_UP);
1985                 break;
1986             case 0x49:
1987                 qemu_text_console_put_keysym(con, numlock ? '9' : QEMU_KEY_PAGEUP);
1988                 break;
1989             case 0x4b:
1990                 qemu_text_console_put_keysym(con, numlock ? '4' : QEMU_KEY_LEFT);
1991                 break;
1992             case 0x4c:
1993                 qemu_text_console_put_keysym(con, '5');
1994                 break;
1995             case 0x4d:
1996                 qemu_text_console_put_keysym(con, numlock ? '6' : QEMU_KEY_RIGHT);
1997                 break;
1998             case 0x4f:
1999                 qemu_text_console_put_keysym(con, numlock ? '1' : QEMU_KEY_END);
2000                 break;
2001             case 0x50:
2002                 qemu_text_console_put_keysym(con, numlock ? '2' : QEMU_KEY_DOWN);
2003                 break;
2004             case 0x51:
2005                 qemu_text_console_put_keysym(con, numlock ? '3' : QEMU_KEY_PAGEDOWN);
2006                 break;
2007             case 0x52:
2008                 qemu_text_console_put_keysym(con, '0');
2009                 break;
2010             case 0x53:
2011                 qemu_text_console_put_keysym(con, numlock ? '.' : QEMU_KEY_DELETE);
2012                 break;
2013 
2014             case 0xb5:
2015                 qemu_text_console_put_keysym(con, '/');
2016                 break;
2017             case 0x37:
2018                 qemu_text_console_put_keysym(con, '*');
2019                 break;
2020             case 0x4a:
2021                 qemu_text_console_put_keysym(con, '-');
2022                 break;
2023             case 0x4e:
2024                 qemu_text_console_put_keysym(con, '+');
2025                 break;
2026             case 0x9c:
2027                 qemu_text_console_put_keysym(con, '\n');
2028                 break;
2029 
2030             default:
2031                 if (control) {
2032                     qemu_text_console_put_keysym(con, sym & 0x1f);
2033                 } else {
2034                     qemu_text_console_put_keysym(con, sym);
2035                 }
2036                 break;
2037             }
2038         }
2039     }
2040 }
2041 
code2name(int keycode)2042 static const char *code2name(int keycode)
2043 {
2044     return QKeyCode_str(qemu_input_key_number_to_qcode(keycode));
2045 }
2046 
key_event(VncState * vs,int down,uint32_t sym)2047 static void key_event(VncState *vs, int down, uint32_t sym)
2048 {
2049     int keycode;
2050     int lsym = sym;
2051 
2052     if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(vs->vd->dcl.con)) {
2053         lsym = lsym - 'A' + 'a';
2054     }
2055 
2056     keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF,
2057                               vs->vd->kbd, down) & SCANCODE_KEYMASK;
2058     trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
2059     do_key_event(vs, down, keycode, sym);
2060 }
2061 
ext_key_event(VncState * vs,int down,uint32_t sym,uint16_t keycode)2062 static void ext_key_event(VncState *vs, int down,
2063                           uint32_t sym, uint16_t keycode)
2064 {
2065     /* if the user specifies a keyboard layout, always use it */
2066     if (keyboard_layout) {
2067         key_event(vs, down, sym);
2068     } else {
2069         trace_vnc_key_event_ext(down, sym, keycode, code2name(keycode));
2070         do_key_event(vs, down, keycode, sym);
2071     }
2072 }
2073 
framebuffer_update_request(VncState * vs,int incremental,int x,int y,int w,int h)2074 static void framebuffer_update_request(VncState *vs, int incremental,
2075                                        int x, int y, int w, int h)
2076 {
2077     if (incremental) {
2078         if (vs->update != VNC_STATE_UPDATE_FORCE) {
2079             vs->update = VNC_STATE_UPDATE_INCREMENTAL;
2080         }
2081     } else {
2082         vs->update = VNC_STATE_UPDATE_FORCE;
2083         vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h);
2084         if (vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)) {
2085             vnc_desktop_resize_ext(vs, 0);
2086         }
2087     }
2088 }
2089 
send_ext_key_event_ack(VncState * vs)2090 static void send_ext_key_event_ack(VncState *vs)
2091 {
2092     vnc_lock_output(vs);
2093     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2094     vnc_write_u8(vs, 0);
2095     vnc_write_u16(vs, 1);
2096     vnc_framebuffer_update(vs, 0, 0,
2097                            pixman_image_get_width(vs->vd->server),
2098                            pixman_image_get_height(vs->vd->server),
2099                            VNC_ENCODING_EXT_KEY_EVENT);
2100     vnc_unlock_output(vs);
2101     vnc_flush(vs);
2102 }
2103 
send_ext_audio_ack(VncState * vs)2104 static void send_ext_audio_ack(VncState *vs)
2105 {
2106     vnc_lock_output(vs);
2107     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2108     vnc_write_u8(vs, 0);
2109     vnc_write_u16(vs, 1);
2110     vnc_framebuffer_update(vs, 0, 0,
2111                            pixman_image_get_width(vs->vd->server),
2112                            pixman_image_get_height(vs->vd->server),
2113                            VNC_ENCODING_AUDIO);
2114     vnc_unlock_output(vs);
2115     vnc_flush(vs);
2116 }
2117 
send_xvp_message(VncState * vs,int code)2118 static void send_xvp_message(VncState *vs, int code)
2119 {
2120     vnc_lock_output(vs);
2121     vnc_write_u8(vs, VNC_MSG_SERVER_XVP);
2122     vnc_write_u8(vs, 0); /* pad */
2123     vnc_write_u8(vs, 1); /* version */
2124     vnc_write_u8(vs, code);
2125     vnc_unlock_output(vs);
2126     vnc_flush(vs);
2127 }
2128 
set_encodings(VncState * vs,int32_t * encodings,size_t n_encodings)2129 static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
2130 {
2131     int i;
2132     unsigned int enc = 0;
2133 
2134     vs->features = 0;
2135     vs->vnc_encoding = 0;
2136     vs->tight->compression = 9;
2137     vs->tight->quality = -1; /* Lossless by default */
2138     vs->absolute = -1;
2139 
2140     /*
2141      * Start from the end because the encodings are sent in order of preference.
2142      * This way the preferred encoding (first encoding defined in the array)
2143      * will be set at the end of the loop.
2144      */
2145     for (i = n_encodings - 1; i >= 0; i--) {
2146         enc = encodings[i];
2147         switch (enc) {
2148         case VNC_ENCODING_RAW:
2149             vs->vnc_encoding = enc;
2150             break;
2151         case VNC_ENCODING_HEXTILE:
2152             vnc_set_feature(vs, VNC_FEATURE_HEXTILE);
2153             vs->vnc_encoding = enc;
2154             break;
2155         case VNC_ENCODING_TIGHT:
2156             vnc_set_feature(vs, VNC_FEATURE_TIGHT);
2157             vs->vnc_encoding = enc;
2158             break;
2159 #ifdef CONFIG_PNG
2160         case VNC_ENCODING_TIGHT_PNG:
2161             vnc_set_feature(vs, VNC_FEATURE_TIGHT_PNG);
2162             vs->vnc_encoding = enc;
2163             break;
2164 #endif
2165         case VNC_ENCODING_ZLIB:
2166             /*
2167              * VNC_ENCODING_ZRLE compresses better than VNC_ENCODING_ZLIB.
2168              * So prioritize ZRLE, even if the client hints that it prefers
2169              * ZLIB.
2170              */
2171             if (!vnc_has_feature(vs, VNC_FEATURE_ZRLE)) {
2172                 vnc_set_feature(vs, VNC_FEATURE_ZLIB);
2173                 vs->vnc_encoding = enc;
2174             }
2175             break;
2176         case VNC_ENCODING_ZRLE:
2177             vnc_set_feature(vs, VNC_FEATURE_ZRLE);
2178             vs->vnc_encoding = enc;
2179             break;
2180         case VNC_ENCODING_ZYWRLE:
2181             vnc_set_feature(vs, VNC_FEATURE_ZYWRLE);
2182             vs->vnc_encoding = enc;
2183             break;
2184         case VNC_ENCODING_DESKTOPRESIZE:
2185             vnc_set_feature(vs, VNC_FEATURE_RESIZE);
2186             break;
2187         case VNC_ENCODING_DESKTOP_RESIZE_EXT:
2188             vnc_set_feature(vs, VNC_FEATURE_RESIZE_EXT);
2189             break;
2190         case VNC_ENCODING_POINTER_TYPE_CHANGE:
2191             vnc_set_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE);
2192             break;
2193         case VNC_ENCODING_RICH_CURSOR:
2194             vnc_set_feature(vs, VNC_FEATURE_RICH_CURSOR);
2195             break;
2196         case VNC_ENCODING_ALPHA_CURSOR:
2197             vnc_set_feature(vs, VNC_FEATURE_ALPHA_CURSOR);
2198             break;
2199         case VNC_ENCODING_EXT_KEY_EVENT:
2200             send_ext_key_event_ack(vs);
2201             break;
2202         case VNC_ENCODING_AUDIO:
2203             if (vs->vd->audio_state) {
2204                 vnc_set_feature(vs, VNC_FEATURE_AUDIO);
2205                 send_ext_audio_ack(vs);
2206             }
2207             break;
2208         case VNC_ENCODING_WMVi:
2209             vnc_set_feature(vs, VNC_FEATURE_WMVI);
2210             break;
2211         case VNC_ENCODING_LED_STATE:
2212             vnc_set_feature(vs, VNC_FEATURE_LED_STATE);
2213             break;
2214         case VNC_ENCODING_XVP:
2215             if (vs->vd->power_control) {
2216                 vnc_set_feature(vs, VNC_FEATURE_XVP);
2217                 send_xvp_message(vs, VNC_XVP_CODE_INIT);
2218             }
2219             break;
2220         case VNC_ENCODING_CLIPBOARD_EXT:
2221             vnc_set_feature(vs, VNC_FEATURE_CLIPBOARD_EXT);
2222             vnc_server_cut_text_caps(vs);
2223             break;
2224         case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:
2225             vs->tight->compression = (enc & 0x0F);
2226             break;
2227         case VNC_ENCODING_QUALITYLEVEL0 ... VNC_ENCODING_QUALITYLEVEL0 + 9:
2228             if (vs->vd->lossy) {
2229                 vs->tight->quality = (enc & 0x0F);
2230             }
2231             break;
2232         default:
2233             VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc);
2234             break;
2235         }
2236     }
2237     vnc_desktop_resize(vs);
2238     check_pointer_type_change(&vs->mouse_mode_notifier, NULL);
2239     vnc_led_state_change(vs);
2240     vnc_cursor_define(vs);
2241 }
2242 
set_pixel_conversion(VncState * vs)2243 static void set_pixel_conversion(VncState *vs)
2244 {
2245     pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf);
2246 
2247     if (fmt == VNC_SERVER_FB_FORMAT) {
2248         vs->write_pixels = vnc_write_pixels_copy;
2249         vnc_hextile_set_pixel_conversion(vs, 0);
2250     } else {
2251         vs->write_pixels = vnc_write_pixels_generic;
2252         vnc_hextile_set_pixel_conversion(vs, 1);
2253     }
2254 }
2255 
send_color_map(VncState * vs)2256 static void send_color_map(VncState *vs)
2257 {
2258     int i;
2259 
2260     vnc_lock_output(vs);
2261     vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES);
2262     vnc_write_u8(vs,  0);    /* padding     */
2263     vnc_write_u16(vs, 0);    /* first color */
2264     vnc_write_u16(vs, 256);  /* # of colors */
2265 
2266     for (i = 0; i < 256; i++) {
2267         PixelFormat *pf = &vs->client_pf;
2268 
2269         vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits)));
2270         vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits)));
2271         vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits)));
2272     }
2273     vnc_unlock_output(vs);
2274 }
2275 
set_pixel_format(VncState * vs,int bits_per_pixel,int big_endian_flag,int true_color_flag,int red_max,int green_max,int blue_max,int red_shift,int green_shift,int blue_shift)2276 static void set_pixel_format(VncState *vs, int bits_per_pixel,
2277                              int big_endian_flag, int true_color_flag,
2278                              int red_max, int green_max, int blue_max,
2279                              int red_shift, int green_shift, int blue_shift)
2280 {
2281     if (!true_color_flag) {
2282         /* Expose a reasonable default 256 color map */
2283         bits_per_pixel = 8;
2284         red_max = 7;
2285         green_max = 7;
2286         blue_max = 3;
2287         red_shift = 0;
2288         green_shift = 3;
2289         blue_shift = 6;
2290     }
2291 
2292     switch (bits_per_pixel) {
2293     case 8:
2294     case 16:
2295     case 32:
2296         break;
2297     default:
2298         vnc_client_error(vs);
2299         return;
2300     }
2301 
2302     vs->client_pf.rmax = red_max ? red_max : 0xFF;
2303     vs->client_pf.rbits = ctpopl(red_max);
2304     vs->client_pf.rshift = red_shift;
2305     vs->client_pf.rmask = red_max << red_shift;
2306     vs->client_pf.gmax = green_max ? green_max : 0xFF;
2307     vs->client_pf.gbits = ctpopl(green_max);
2308     vs->client_pf.gshift = green_shift;
2309     vs->client_pf.gmask = green_max << green_shift;
2310     vs->client_pf.bmax = blue_max ? blue_max : 0xFF;
2311     vs->client_pf.bbits = ctpopl(blue_max);
2312     vs->client_pf.bshift = blue_shift;
2313     vs->client_pf.bmask = blue_max << blue_shift;
2314     vs->client_pf.bits_per_pixel = bits_per_pixel;
2315     vs->client_pf.bytes_per_pixel = bits_per_pixel / 8;
2316     vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
2317     vs->client_be = big_endian_flag;
2318 
2319     if (!true_color_flag) {
2320         send_color_map(vs);
2321     }
2322 
2323     set_pixel_conversion(vs);
2324 
2325     graphic_hw_invalidate(vs->vd->dcl.con);
2326     graphic_hw_update(vs->vd->dcl.con);
2327 }
2328 
pixel_format_message(VncState * vs)2329 static void pixel_format_message (VncState *vs) {
2330     char pad[3] = { 0, 0, 0 };
2331 
2332     vs->client_pf = qemu_default_pixelformat(32);
2333 
2334     vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */
2335     vnc_write_u8(vs, vs->client_pf.depth); /* depth */
2336 
2337 #if HOST_BIG_ENDIAN
2338     vnc_write_u8(vs, 1);             /* big-endian-flag */
2339 #else
2340     vnc_write_u8(vs, 0);             /* big-endian-flag */
2341 #endif
2342     vnc_write_u8(vs, 1);             /* true-color-flag */
2343     vnc_write_u16(vs, vs->client_pf.rmax);     /* red-max */
2344     vnc_write_u16(vs, vs->client_pf.gmax);     /* green-max */
2345     vnc_write_u16(vs, vs->client_pf.bmax);     /* blue-max */
2346     vnc_write_u8(vs, vs->client_pf.rshift);    /* red-shift */
2347     vnc_write_u8(vs, vs->client_pf.gshift);    /* green-shift */
2348     vnc_write_u8(vs, vs->client_pf.bshift);    /* blue-shift */
2349     vnc_write(vs, pad, 3);           /* padding */
2350 
2351     vnc_hextile_set_pixel_conversion(vs, 0);
2352     vs->write_pixels = vnc_write_pixels_copy;
2353 }
2354 
vnc_colordepth(VncState * vs)2355 static void vnc_colordepth(VncState *vs)
2356 {
2357     if (vnc_has_feature(vs, VNC_FEATURE_WMVI)) {
2358         /* Sending a WMVi message to notify the client*/
2359         vnc_lock_output(vs);
2360         vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2361         vnc_write_u8(vs, 0);
2362         vnc_write_u16(vs, 1); /* number of rects */
2363         vnc_framebuffer_update(vs, 0, 0,
2364                                vs->client_width,
2365                                vs->client_height,
2366                                VNC_ENCODING_WMVi);
2367         pixel_format_message(vs);
2368         vnc_unlock_output(vs);
2369         vnc_flush(vs);
2370     } else {
2371         set_pixel_conversion(vs);
2372     }
2373 }
2374 
protocol_client_msg(VncState * vs,uint8_t * data,size_t len)2375 static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
2376 {
2377     int i;
2378     uint16_t limit;
2379     uint32_t freq;
2380     VncDisplay *vd = vs->vd;
2381 
2382     if (data[0] > 3) {
2383         update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2384     }
2385 
2386     switch (data[0]) {
2387     case VNC_MSG_CLIENT_SET_PIXEL_FORMAT:
2388         if (len == 1)
2389             return 20;
2390 
2391         set_pixel_format(vs, read_u8(data, 4),
2392                          read_u8(data, 6), read_u8(data, 7),
2393                          read_u16(data, 8), read_u16(data, 10),
2394                          read_u16(data, 12), read_u8(data, 14),
2395                          read_u8(data, 15), read_u8(data, 16));
2396         break;
2397     case VNC_MSG_CLIENT_SET_ENCODINGS:
2398         if (len == 1)
2399             return 4;
2400 
2401         if (len == 4) {
2402             limit = read_u16(data, 2);
2403             if (limit > 0)
2404                 return 4 + (limit * 4);
2405         } else
2406             limit = read_u16(data, 2);
2407 
2408         for (i = 0; i < limit; i++) {
2409             int32_t val = read_s32(data, 4 + (i * 4));
2410             memcpy(data + 4 + (i * 4), &val, sizeof(val));
2411         }
2412 
2413         set_encodings(vs, (int32_t *)(data + 4), limit);
2414         break;
2415     case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST:
2416         if (len == 1)
2417             return 10;
2418 
2419         framebuffer_update_request(vs,
2420                                    read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
2421                                    read_u16(data, 6), read_u16(data, 8));
2422         break;
2423     case VNC_MSG_CLIENT_KEY_EVENT:
2424         if (len == 1)
2425             return 8;
2426 
2427         key_event(vs, read_u8(data, 1), read_u32(data, 4));
2428         break;
2429     case VNC_MSG_CLIENT_POINTER_EVENT:
2430         if (len == 1)
2431             return 6;
2432 
2433         pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
2434         break;
2435     case VNC_MSG_CLIENT_CUT_TEXT:
2436         if (len == 1) {
2437             return 8;
2438         }
2439         uint32_t dlen = abs(read_s32(data, 4));
2440         if (len == 8) {
2441             if (dlen > (1 << 20)) {
2442                 error_report("vnc: client_cut_text msg payload has %u bytes"
2443                              " which exceeds our limit of 1MB.", dlen);
2444                 vnc_client_error(vs);
2445                 break;
2446             }
2447             if (dlen > 0) {
2448                 return 8 + dlen;
2449             }
2450         }
2451 
2452         if (read_s32(data, 4) < 0) {
2453             if (!vnc_has_feature(vs, VNC_FEATURE_CLIPBOARD_EXT)) {
2454                 error_report("vnc: extended clipboard message while disabled");
2455                 vnc_client_error(vs);
2456                 break;
2457             }
2458             if (dlen < 4) {
2459                 error_report("vnc: malformed payload (header less than 4 bytes)"
2460                              " in extended clipboard pseudo-encoding.");
2461                 vnc_client_error(vs);
2462                 break;
2463             }
2464             vnc_client_cut_text_ext(vs, dlen, read_u32(data, 8), data + 12);
2465             break;
2466         }
2467         vnc_client_cut_text(vs, read_u32(data, 4), data + 8);
2468         break;
2469     case VNC_MSG_CLIENT_XVP:
2470         if (!vnc_has_feature(vs, VNC_FEATURE_XVP)) {
2471             error_report("vnc: xvp client message while disabled");
2472             vnc_client_error(vs);
2473             break;
2474         }
2475         if (len == 1) {
2476             return 4;
2477         }
2478         if (len == 4) {
2479             uint8_t version = read_u8(data, 2);
2480             uint8_t action = read_u8(data, 3);
2481 
2482             if (version != 1) {
2483                 error_report("vnc: xvp client message version %d != 1",
2484                              version);
2485                 vnc_client_error(vs);
2486                 break;
2487             }
2488 
2489             switch (action) {
2490             case VNC_XVP_ACTION_SHUTDOWN:
2491                 qemu_system_powerdown_request();
2492                 break;
2493             case VNC_XVP_ACTION_REBOOT:
2494                 send_xvp_message(vs, VNC_XVP_CODE_FAIL);
2495                 break;
2496             case VNC_XVP_ACTION_RESET:
2497                 qemu_system_reset_request(SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET);
2498                 break;
2499             default:
2500                 send_xvp_message(vs, VNC_XVP_CODE_FAIL);
2501                 break;
2502             }
2503         }
2504         break;
2505     case VNC_MSG_CLIENT_QEMU:
2506         if (len == 1)
2507             return 2;
2508 
2509         switch (read_u8(data, 1)) {
2510         case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2511             if (len == 2)
2512                 return 12;
2513 
2514             ext_key_event(vs, read_u16(data, 2),
2515                           read_u32(data, 4), read_u32(data, 8));
2516             break;
2517         case VNC_MSG_CLIENT_QEMU_AUDIO:
2518             if (!vnc_has_feature(vs, VNC_FEATURE_AUDIO)) {
2519                 error_report("Audio message %d with audio disabled", read_u8(data, 2));
2520                 vnc_client_error(vs);
2521                 break;
2522             }
2523 
2524             if (len == 2)
2525                 return 4;
2526 
2527             switch (read_u16 (data, 2)) {
2528             case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2529                 trace_vnc_msg_client_audio_enable(vs, vs->ioc);
2530                 audio_add(vs);
2531                 break;
2532             case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE:
2533                 trace_vnc_msg_client_audio_disable(vs, vs->ioc);
2534                 audio_del(vs);
2535                 break;
2536             case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT:
2537                 if (len == 4)
2538                     return 10;
2539                 switch (read_u8(data, 4)) {
2540                 case 0: vs->as.fmt = AUDIO_FORMAT_U8; break;
2541                 case 1: vs->as.fmt = AUDIO_FORMAT_S8; break;
2542                 case 2: vs->as.fmt = AUDIO_FORMAT_U16; break;
2543                 case 3: vs->as.fmt = AUDIO_FORMAT_S16; break;
2544                 case 4: vs->as.fmt = AUDIO_FORMAT_U32; break;
2545                 case 5: vs->as.fmt = AUDIO_FORMAT_S32; break;
2546                 default:
2547                     VNC_DEBUG("Invalid audio format %d\n", read_u8(data, 4));
2548                     vnc_client_error(vs);
2549                     break;
2550                 }
2551                 vs->as.nchannels = read_u8(data, 5);
2552                 if (vs->as.nchannels != 1 && vs->as.nchannels != 2) {
2553                     VNC_DEBUG("Invalid audio channel count %d\n",
2554                               read_u8(data, 5));
2555                     vnc_client_error(vs);
2556                     break;
2557                 }
2558                 freq = read_u32(data, 6);
2559                 /* No official limit for protocol, but 48khz is a sensible
2560                  * upper bound for trustworthy clients, and this limit
2561                  * protects calculations involving 'vs->as.freq' later.
2562                  */
2563                 if (freq > 48000) {
2564                     VNC_DEBUG("Invalid audio frequency %u > 48000", freq);
2565                     vnc_client_error(vs);
2566                     break;
2567                 }
2568                 vs->as.freq = freq;
2569                 trace_vnc_msg_client_audio_format(
2570                     vs, vs->ioc, vs->as.fmt, vs->as.nchannels, vs->as.freq);
2571                 break;
2572             default:
2573                 VNC_DEBUG("Invalid audio message %d\n", read_u8(data, 2));
2574                 vnc_client_error(vs);
2575                 break;
2576             }
2577             break;
2578 
2579         default:
2580             VNC_DEBUG("Msg: %d\n", read_u16(data, 0));
2581             vnc_client_error(vs);
2582             break;
2583         }
2584         break;
2585     case VNC_MSG_CLIENT_SET_DESKTOP_SIZE:
2586     {
2587         size_t size;
2588         uint8_t screens;
2589         int w, h;
2590 
2591         if (len < 8) {
2592             return 8;
2593         }
2594 
2595         screens = read_u8(data, 6);
2596         size    = 8 + screens * 16;
2597         if (len < size) {
2598             return size;
2599         }
2600         w = read_u16(data, 2);
2601         h = read_u16(data, 4);
2602 
2603         trace_vnc_msg_client_set_desktop_size(vs, vs->ioc, w, h, screens);
2604         if (dpy_ui_info_supported(vs->vd->dcl.con)) {
2605             QemuUIInfo info;
2606             memset(&info, 0, sizeof(info));
2607             info.width = w;
2608             info.height = h;
2609             dpy_set_ui_info(vs->vd->dcl.con, &info, false);
2610             vnc_desktop_resize_ext(vs, 4 /* Request forwarded */);
2611         } else {
2612             vnc_desktop_resize_ext(vs, 3 /* Invalid screen layout */);
2613         }
2614 
2615         break;
2616     }
2617     default:
2618         VNC_DEBUG("Msg: %d\n", data[0]);
2619         vnc_client_error(vs);
2620         break;
2621     }
2622 
2623     vnc_update_throttle_offset(vs);
2624     vnc_read_when(vs, protocol_client_msg, 1);
2625     return 0;
2626 }
2627 
protocol_client_init(VncState * vs,uint8_t * data,size_t len)2628 static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
2629 {
2630     char buf[1024];
2631     VncShareMode mode;
2632     int size;
2633 
2634     mode = data[0] ? VNC_SHARE_MODE_SHARED : VNC_SHARE_MODE_EXCLUSIVE;
2635     switch (vs->vd->share_policy) {
2636     case VNC_SHARE_POLICY_IGNORE:
2637         /*
2638          * Ignore the shared flag.  Nothing to do here.
2639          *
2640          * Doesn't conform to the rfb spec but is traditional qemu
2641          * behavior, thus left here as option for compatibility
2642          * reasons.
2643          */
2644         break;
2645     case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE:
2646         /*
2647          * Policy: Allow clients ask for exclusive access.
2648          *
2649          * Implementation: When a client asks for exclusive access,
2650          * disconnect all others. Shared connects are allowed as long
2651          * as no exclusive connection exists.
2652          *
2653          * This is how the rfb spec suggests to handle the shared flag.
2654          */
2655         if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2656             VncState *client;
2657             QTAILQ_FOREACH(client, &vs->vd->clients, next) {
2658                 if (vs == client) {
2659                     continue;
2660                 }
2661                 if (client->share_mode != VNC_SHARE_MODE_EXCLUSIVE &&
2662                     client->share_mode != VNC_SHARE_MODE_SHARED) {
2663                     continue;
2664                 }
2665                 vnc_disconnect_start(client);
2666             }
2667         }
2668         if (mode == VNC_SHARE_MODE_SHARED) {
2669             if (vs->vd->num_exclusive > 0) {
2670                 vnc_disconnect_start(vs);
2671                 return 0;
2672             }
2673         }
2674         break;
2675     case VNC_SHARE_POLICY_FORCE_SHARED:
2676         /*
2677          * Policy: Shared connects only.
2678          * Implementation: Disallow clients asking for exclusive access.
2679          *
2680          * Useful for shared desktop sessions where you don't want
2681          * someone forgetting to say -shared when running the vnc
2682          * client disconnect everybody else.
2683          */
2684         if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2685             vnc_disconnect_start(vs);
2686             return 0;
2687         }
2688         break;
2689     }
2690     vnc_set_share_mode(vs, mode);
2691 
2692     if (vs->vd->num_shared > vs->vd->connections_limit) {
2693         vnc_disconnect_start(vs);
2694         return 0;
2695     }
2696 
2697     assert(pixman_image_get_width(vs->vd->server) < 65536 &&
2698            pixman_image_get_width(vs->vd->server) >= 0);
2699     assert(pixman_image_get_height(vs->vd->server) < 65536 &&
2700            pixman_image_get_height(vs->vd->server) >= 0);
2701     vs->client_width = pixman_image_get_width(vs->vd->server);
2702     vs->client_height = pixman_image_get_height(vs->vd->server);
2703     vnc_write_u16(vs, vs->client_width);
2704     vnc_write_u16(vs, vs->client_height);
2705 
2706     pixel_format_message(vs);
2707 
2708     if (qemu_name) {
2709         size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
2710         if (size > sizeof(buf)) {
2711             size = sizeof(buf);
2712         }
2713     } else {
2714         size = snprintf(buf, sizeof(buf), "QEMU");
2715     }
2716 
2717     vnc_write_u32(vs, size);
2718     vnc_write(vs, buf, size);
2719     vnc_flush(vs);
2720 
2721     vnc_client_cache_auth(vs);
2722     vnc_qmp_event(vs, QAPI_EVENT_VNC_INITIALIZED);
2723 
2724     vnc_read_when(vs, protocol_client_msg, 1);
2725 
2726     return 0;
2727 }
2728 
start_client_init(VncState * vs)2729 void start_client_init(VncState *vs)
2730 {
2731     vnc_read_when(vs, protocol_client_init, 1);
2732 }
2733 
authentication_failed(VncState * vs)2734 static void authentication_failed(VncState *vs)
2735 {
2736     vnc_write_u32(vs, 1); /* Reject auth */
2737     if (vs->minor >= 8) {
2738         static const char err[] = "Authentication failed";
2739         vnc_write_u32(vs, sizeof(err));
2740         vnc_write(vs, err, sizeof(err));
2741     }
2742     vnc_flush(vs);
2743     vnc_client_error(vs);
2744 }
2745 
2746 static void
vnc_munge_des_rfb_key(unsigned char * key,size_t nkey)2747 vnc_munge_des_rfb_key(unsigned char *key, size_t nkey)
2748 {
2749     size_t i;
2750     for (i = 0; i < nkey; i++) {
2751         uint8_t r = key[i];
2752         r = (r & 0xf0) >> 4 | (r & 0x0f) << 4;
2753         r = (r & 0xcc) >> 2 | (r & 0x33) << 2;
2754         r = (r & 0xaa) >> 1 | (r & 0x55) << 1;
2755         key[i] = r;
2756     }
2757 }
2758 
protocol_client_auth_vnc(VncState * vs,uint8_t * data,size_t len)2759 static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
2760 {
2761     unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
2762     size_t i, pwlen;
2763     unsigned char key[8];
2764     time_t now = time(NULL);
2765     QCryptoCipher *cipher = NULL;
2766     Error *err = NULL;
2767 
2768     if (!vs->vd->password) {
2769         trace_vnc_auth_fail(vs, vs->auth, "password is not set", "");
2770         goto reject;
2771     }
2772     if (vs->vd->expires < now) {
2773         trace_vnc_auth_fail(vs, vs->auth, "password is expired", "");
2774         goto reject;
2775     }
2776 
2777     memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
2778 
2779     /* Calculate the expected challenge response */
2780     pwlen = strlen(vs->vd->password);
2781     for (i=0; i<sizeof(key); i++)
2782         key[i] = i<pwlen ? vs->vd->password[i] : 0;
2783     vnc_munge_des_rfb_key(key, sizeof(key));
2784 
2785     cipher = qcrypto_cipher_new(
2786         QCRYPTO_CIPHER_ALGO_DES,
2787         QCRYPTO_CIPHER_MODE_ECB,
2788         key, G_N_ELEMENTS(key),
2789         &err);
2790     if (!cipher) {
2791         trace_vnc_auth_fail(vs, vs->auth, "cannot create cipher",
2792                             error_get_pretty(err));
2793         error_free(err);
2794         goto reject;
2795     }
2796 
2797     if (qcrypto_cipher_encrypt(cipher,
2798                                vs->challenge,
2799                                response,
2800                                VNC_AUTH_CHALLENGE_SIZE,
2801                                &err) < 0) {
2802         trace_vnc_auth_fail(vs, vs->auth, "cannot encrypt challenge response",
2803                             error_get_pretty(err));
2804         error_free(err);
2805         goto reject;
2806     }
2807 
2808     /* Compare expected vs actual challenge response */
2809     if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
2810         trace_vnc_auth_fail(vs, vs->auth, "mis-matched challenge response", "");
2811         goto reject;
2812     } else {
2813         trace_vnc_auth_pass(vs, vs->auth);
2814         vnc_write_u32(vs, 0); /* Accept auth */
2815         vnc_flush(vs);
2816 
2817         start_client_init(vs);
2818     }
2819 
2820     qcrypto_cipher_free(cipher);
2821     return 0;
2822 
2823 reject:
2824     authentication_failed(vs);
2825     qcrypto_cipher_free(cipher);
2826     return 0;
2827 }
2828 
start_auth_vnc(VncState * vs)2829 void start_auth_vnc(VncState *vs)
2830 {
2831     Error *err = NULL;
2832 
2833     if (qcrypto_random_bytes(vs->challenge, sizeof(vs->challenge), &err)) {
2834         trace_vnc_auth_fail(vs, vs->auth, "cannot get random bytes",
2835                             error_get_pretty(err));
2836         error_free(err);
2837         authentication_failed(vs);
2838         return;
2839     }
2840 
2841     /* Send client a 'random' challenge */
2842     vnc_write(vs, vs->challenge, sizeof(vs->challenge));
2843     vnc_flush(vs);
2844 
2845     vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
2846 }
2847 
2848 
protocol_client_auth(VncState * vs,uint8_t * data,size_t len)2849 static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
2850 {
2851     /* We only advertise 1 auth scheme at a time, so client
2852      * must pick the one we sent. Verify this */
2853     if (data[0] != vs->auth) { /* Reject auth */
2854        trace_vnc_auth_reject(vs, vs->auth, (int)data[0]);
2855        authentication_failed(vs);
2856     } else { /* Accept requested auth */
2857        trace_vnc_auth_start(vs, vs->auth);
2858        switch (vs->auth) {
2859        case VNC_AUTH_NONE:
2860            if (vs->minor >= 8) {
2861                vnc_write_u32(vs, 0); /* Accept auth completion */
2862                vnc_flush(vs);
2863            }
2864            trace_vnc_auth_pass(vs, vs->auth);
2865            start_client_init(vs);
2866            break;
2867 
2868        case VNC_AUTH_VNC:
2869            start_auth_vnc(vs);
2870            break;
2871 
2872        case VNC_AUTH_VENCRYPT:
2873            start_auth_vencrypt(vs);
2874            break;
2875 
2876 #ifdef CONFIG_VNC_SASL
2877        case VNC_AUTH_SASL:
2878            start_auth_sasl(vs);
2879            break;
2880 #endif /* CONFIG_VNC_SASL */
2881 
2882        default: /* Should not be possible, but just in case */
2883            trace_vnc_auth_fail(vs, vs->auth, "Unhandled auth method", "");
2884            authentication_failed(vs);
2885        }
2886     }
2887     return 0;
2888 }
2889 
protocol_version(VncState * vs,uint8_t * version,size_t len)2890 static int protocol_version(VncState *vs, uint8_t *version, size_t len)
2891 {
2892     char local[13];
2893 
2894     memcpy(local, version, 12);
2895     local[12] = 0;
2896 
2897     if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
2898         VNC_DEBUG("Malformed protocol version %s\n", local);
2899         vnc_client_error(vs);
2900         return 0;
2901     }
2902     VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
2903     if (vs->major != 3 ||
2904         (vs->minor != 3 &&
2905          vs->minor != 4 &&
2906          vs->minor != 5 &&
2907          vs->minor != 7 &&
2908          vs->minor != 8)) {
2909         VNC_DEBUG("Unsupported client version\n");
2910         vnc_write_u32(vs, VNC_AUTH_INVALID);
2911         vnc_flush(vs);
2912         vnc_client_error(vs);
2913         return 0;
2914     }
2915     /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2916      * as equivalent to v3.3 by servers
2917      */
2918     if (vs->minor == 4 || vs->minor == 5)
2919         vs->minor = 3;
2920 
2921     if (vs->minor == 3) {
2922         trace_vnc_auth_start(vs, vs->auth);
2923         if (vs->auth == VNC_AUTH_NONE) {
2924             vnc_write_u32(vs, vs->auth);
2925             vnc_flush(vs);
2926             trace_vnc_auth_pass(vs, vs->auth);
2927             start_client_init(vs);
2928        } else if (vs->auth == VNC_AUTH_VNC) {
2929             VNC_DEBUG("Tell client VNC auth\n");
2930             vnc_write_u32(vs, vs->auth);
2931             vnc_flush(vs);
2932             start_auth_vnc(vs);
2933        } else {
2934             trace_vnc_auth_fail(vs, vs->auth,
2935                                 "Unsupported auth method for v3.3", "");
2936             vnc_write_u32(vs, VNC_AUTH_INVALID);
2937             vnc_flush(vs);
2938             vnc_client_error(vs);
2939        }
2940     } else {
2941         vnc_write_u8(vs, 1); /* num auth */
2942         vnc_write_u8(vs, vs->auth);
2943         vnc_read_when(vs, protocol_client_auth, 1);
2944         vnc_flush(vs);
2945     }
2946 
2947     return 0;
2948 }
2949 
vnc_stat_rect(VncDisplay * vd,int x,int y)2950 static VncRectStat *vnc_stat_rect(VncDisplay *vd, int x, int y)
2951 {
2952     struct VncSurface *vs = &vd->guest;
2953 
2954     return &vs->stats[y / VNC_STAT_RECT][x / VNC_STAT_RECT];
2955 }
2956 
vnc_sent_lossy_rect(VncState * vs,int x,int y,int w,int h)2957 void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h)
2958 {
2959     int i, j;
2960 
2961     w = (x + w) / VNC_STAT_RECT;
2962     h = (y + h) / VNC_STAT_RECT;
2963     x /= VNC_STAT_RECT;
2964     y /= VNC_STAT_RECT;
2965 
2966     for (j = y; j <= h; j++) {
2967         for (i = x; i <= w; i++) {
2968             vs->lossy_rect[j][i] = 1;
2969         }
2970     }
2971 }
2972 
vnc_refresh_lossy_rect(VncDisplay * vd,int x,int y)2973 static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y)
2974 {
2975     VncState *vs;
2976     int sty = y / VNC_STAT_RECT;
2977     int stx = x / VNC_STAT_RECT;
2978     int has_dirty = 0;
2979 
2980     y = QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2981     x = QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2982 
2983     QTAILQ_FOREACH(vs, &vd->clients, next) {
2984         int j;
2985 
2986         /* kernel send buffers are full -> refresh later */
2987         if (vs->output.offset) {
2988             continue;
2989         }
2990 
2991         if (!vs->lossy_rect[sty][stx]) {
2992             continue;
2993         }
2994 
2995         vs->lossy_rect[sty][stx] = 0;
2996         for (j = 0; j < VNC_STAT_RECT; ++j) {
2997             bitmap_set(vs->dirty[y + j],
2998                        x / VNC_DIRTY_PIXELS_PER_BIT,
2999                        VNC_STAT_RECT / VNC_DIRTY_PIXELS_PER_BIT);
3000         }
3001         has_dirty++;
3002     }
3003 
3004     return has_dirty;
3005 }
3006 
vnc_update_stats(VncDisplay * vd,struct timeval * tv)3007 static int vnc_update_stats(VncDisplay *vd,  struct timeval * tv)
3008 {
3009     int width = MIN(pixman_image_get_width(vd->guest.fb),
3010                     pixman_image_get_width(vd->server));
3011     int height = MIN(pixman_image_get_height(vd->guest.fb),
3012                      pixman_image_get_height(vd->server));
3013     int x, y;
3014     struct timeval res;
3015     int has_dirty = 0;
3016 
3017     for (y = 0; y < height; y += VNC_STAT_RECT) {
3018         for (x = 0; x < width; x += VNC_STAT_RECT) {
3019             VncRectStat *rect = vnc_stat_rect(vd, x, y);
3020 
3021             rect->updated = false;
3022         }
3023     }
3024 
3025     qemu_timersub(tv, &VNC_REFRESH_STATS, &res);
3026 
3027     if (timercmp(&vd->guest.last_freq_check, &res, >)) {
3028         return has_dirty;
3029     }
3030     vd->guest.last_freq_check = *tv;
3031 
3032     for (y = 0; y < height; y += VNC_STAT_RECT) {
3033         for (x = 0; x < width; x += VNC_STAT_RECT) {
3034             VncRectStat *rect= vnc_stat_rect(vd, x, y);
3035             int count = ARRAY_SIZE(rect->times);
3036             struct timeval min, max;
3037 
3038             if (!timerisset(&rect->times[count - 1])) {
3039                 continue ;
3040             }
3041 
3042             max = rect->times[(rect->idx + count - 1) % count];
3043             qemu_timersub(tv, &max, &res);
3044 
3045             if (timercmp(&res, &VNC_REFRESH_LOSSY, >)) {
3046                 rect->freq = 0;
3047                 has_dirty += vnc_refresh_lossy_rect(vd, x, y);
3048                 memset(rect->times, 0, sizeof (rect->times));
3049                 continue ;
3050             }
3051 
3052             min = rect->times[rect->idx];
3053             max = rect->times[(rect->idx + count - 1) % count];
3054             qemu_timersub(&max, &min, &res);
3055 
3056             rect->freq = res.tv_sec + res.tv_usec / 1000000.;
3057             rect->freq /= count;
3058             rect->freq = 1. / rect->freq;
3059         }
3060     }
3061     return has_dirty;
3062 }
3063 
vnc_update_freq(VncState * vs,int x,int y,int w,int h)3064 double vnc_update_freq(VncState *vs, int x, int y, int w, int h)
3065 {
3066     int i, j;
3067     double total = 0;
3068     int num = 0;
3069 
3070     x =  QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
3071     y =  QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
3072 
3073     for (j = y; j <= y + h; j += VNC_STAT_RECT) {
3074         for (i = x; i <= x + w; i += VNC_STAT_RECT) {
3075             total += vnc_stat_rect(vs->vd, i, j)->freq;
3076             num++;
3077         }
3078     }
3079 
3080     if (num) {
3081         return total / num;
3082     } else {
3083         return 0;
3084     }
3085 }
3086 
vnc_rect_updated(VncDisplay * vd,int x,int y,struct timeval * tv)3087 static void vnc_rect_updated(VncDisplay *vd, int x, int y, struct timeval * tv)
3088 {
3089     VncRectStat *rect;
3090 
3091     rect = vnc_stat_rect(vd, x, y);
3092     if (rect->updated) {
3093         return;
3094     }
3095     rect->times[rect->idx] = *tv;
3096     rect->idx = (rect->idx + 1) % ARRAY_SIZE(rect->times);
3097     rect->updated = true;
3098 }
3099 
vnc_refresh_server_surface(VncDisplay * vd)3100 static int vnc_refresh_server_surface(VncDisplay *vd)
3101 {
3102     int width = MIN(pixman_image_get_width(vd->guest.fb),
3103                     pixman_image_get_width(vd->server));
3104     int height = MIN(pixman_image_get_height(vd->guest.fb),
3105                      pixman_image_get_height(vd->server));
3106     int cmp_bytes, server_stride, line_bytes, guest_ll, guest_stride, y = 0;
3107     uint8_t *guest_row0 = NULL, *server_row0;
3108     VncState *vs;
3109     int has_dirty = 0;
3110     pixman_image_t *tmpbuf = NULL;
3111     unsigned long offset;
3112     int x;
3113     uint8_t *guest_ptr, *server_ptr;
3114 
3115     struct timeval tv = { 0, 0 };
3116 
3117     if (!vd->non_adaptive) {
3118         gettimeofday(&tv, NULL);
3119         has_dirty = vnc_update_stats(vd, &tv);
3120     }
3121 
3122     offset = find_next_bit((unsigned long *) &vd->guest.dirty,
3123                            height * VNC_DIRTY_BPL(&vd->guest), 0);
3124     if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
3125         /* no dirty bits in guest surface */
3126         return has_dirty;
3127     }
3128 
3129     /*
3130      * Walk through the guest dirty map.
3131      * Check and copy modified bits from guest to server surface.
3132      * Update server dirty map.
3133      */
3134     server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
3135     server_stride = guest_stride = guest_ll =
3136         pixman_image_get_stride(vd->server);
3137     cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
3138                     server_stride);
3139     if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
3140         int w = pixman_image_get_width(vd->server);
3141         tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, w);
3142     } else {
3143         int guest_bpp =
3144             PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
3145         guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
3146         guest_stride = pixman_image_get_stride(vd->guest.fb);
3147         guest_ll = pixman_image_get_width(vd->guest.fb)
3148                    * DIV_ROUND_UP(guest_bpp, 8);
3149     }
3150     line_bytes = MIN(server_stride, guest_ll);
3151 
3152     for (;;) {
3153         y = offset / VNC_DIRTY_BPL(&vd->guest);
3154         x = offset % VNC_DIRTY_BPL(&vd->guest);
3155 
3156         server_ptr = server_row0 + y * server_stride + x * cmp_bytes;
3157 
3158         if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
3159             qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y);
3160             guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf);
3161         } else {
3162             guest_ptr = guest_row0 + y * guest_stride;
3163         }
3164         guest_ptr += x * cmp_bytes;
3165 
3166         for (; x < DIV_ROUND_UP(width, VNC_DIRTY_PIXELS_PER_BIT);
3167              x++, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
3168             int _cmp_bytes = cmp_bytes;
3169             if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
3170                 continue;
3171             }
3172             if ((x + 1) * cmp_bytes > line_bytes) {
3173                 _cmp_bytes = line_bytes - x * cmp_bytes;
3174             }
3175             assert(_cmp_bytes >= 0);
3176             if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
3177                 continue;
3178             }
3179             memcpy(server_ptr, guest_ptr, _cmp_bytes);
3180             if (!vd->non_adaptive) {
3181                 vnc_rect_updated(vd, x * VNC_DIRTY_PIXELS_PER_BIT,
3182                                  y, &tv);
3183             }
3184             QTAILQ_FOREACH(vs, &vd->clients, next) {
3185                 set_bit(x, vs->dirty[y]);
3186             }
3187             has_dirty++;
3188         }
3189 
3190         y++;
3191         offset = find_next_bit((unsigned long *) &vd->guest.dirty,
3192                                height * VNC_DIRTY_BPL(&vd->guest),
3193                                y * VNC_DIRTY_BPL(&vd->guest));
3194         if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
3195             /* no more dirty bits */
3196             break;
3197         }
3198     }
3199     qemu_pixman_image_unref(tmpbuf);
3200     return has_dirty;
3201 }
3202 
vnc_refresh(DisplayChangeListener * dcl)3203 static void vnc_refresh(DisplayChangeListener *dcl)
3204 {
3205     VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
3206     VncState *vs, *vn;
3207     int has_dirty, rects = 0;
3208 
3209     if (QTAILQ_EMPTY(&vd->clients)) {
3210         update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX);
3211         return;
3212     }
3213 
3214     graphic_hw_update(vd->dcl.con);
3215 
3216     if (vnc_trylock_display(vd)) {
3217         update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3218         return;
3219     }
3220 
3221     has_dirty = vnc_refresh_server_surface(vd);
3222     vnc_unlock_display(vd);
3223 
3224     QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
3225         rects += vnc_update_client(vs, has_dirty);
3226         /* vs might be free()ed here */
3227     }
3228 
3229     if (has_dirty && rects) {
3230         vd->dcl.update_interval /= 2;
3231         if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) {
3232             vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE;
3233         }
3234     } else {
3235         vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC;
3236         if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) {
3237             vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX;
3238         }
3239     }
3240 }
3241 
vnc_connect(VncDisplay * vd,QIOChannelSocket * sioc,bool skipauth,bool websocket)3242 static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc,
3243                         bool skipauth, bool websocket)
3244 {
3245     VncState *vs = g_new0(VncState, 1);
3246     bool first_client = QTAILQ_EMPTY(&vd->clients);
3247     int i;
3248 
3249     trace_vnc_client_connect(vs, sioc);
3250     vs->zrle = g_new0(VncZrle, 1);
3251     vs->tight = g_new0(VncTight, 1);
3252     vs->magic = VNC_MAGIC;
3253     vs->sioc = sioc;
3254     object_ref(OBJECT(vs->sioc));
3255     vs->ioc = QIO_CHANNEL(sioc);
3256     object_ref(OBJECT(vs->ioc));
3257     vs->vd = vd;
3258 
3259     buffer_init(&vs->input,          "vnc-input/%p", sioc);
3260     buffer_init(&vs->output,         "vnc-output/%p", sioc);
3261     buffer_init(&vs->jobs_buffer,    "vnc-jobs_buffer/%p", sioc);
3262 
3263     buffer_init(&vs->tight->tight,    "vnc-tight/%p", sioc);
3264     buffer_init(&vs->tight->zlib,     "vnc-tight-zlib/%p", sioc);
3265     buffer_init(&vs->tight->gradient, "vnc-tight-gradient/%p", sioc);
3266 #ifdef CONFIG_VNC_JPEG
3267     buffer_init(&vs->tight->jpeg,     "vnc-tight-jpeg/%p", sioc);
3268 #endif
3269 #ifdef CONFIG_PNG
3270     buffer_init(&vs->tight->png,      "vnc-tight-png/%p", sioc);
3271 #endif
3272     buffer_init(&vs->zlib.zlib,      "vnc-zlib/%p", sioc);
3273     buffer_init(&vs->zrle->zrle,      "vnc-zrle/%p", sioc);
3274     buffer_init(&vs->zrle->fb,        "vnc-zrle-fb/%p", sioc);
3275     buffer_init(&vs->zrle->zlib,      "vnc-zrle-zlib/%p", sioc);
3276 
3277     if (skipauth) {
3278         vs->auth = VNC_AUTH_NONE;
3279         vs->subauth = VNC_AUTH_INVALID;
3280     } else {
3281         if (websocket) {
3282             vs->auth = vd->ws_auth;
3283             vs->subauth = VNC_AUTH_INVALID;
3284         } else {
3285             vs->auth = vd->auth;
3286             vs->subauth = vd->subauth;
3287         }
3288     }
3289     VNC_DEBUG("Client sioc=%p ws=%d auth=%d subauth=%d\n",
3290               sioc, websocket, vs->auth, vs->subauth);
3291 
3292     vs->lossy_rect = g_malloc0(VNC_STAT_ROWS * sizeof (*vs->lossy_rect));
3293     for (i = 0; i < VNC_STAT_ROWS; ++i) {
3294         vs->lossy_rect[i] = g_new0(uint8_t, VNC_STAT_COLS);
3295     }
3296 
3297     VNC_DEBUG("New client on socket %p\n", vs->sioc);
3298     update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3299     qio_channel_set_blocking(vs->ioc, false, NULL);
3300     if (vs->ioc_tag) {
3301         g_source_remove(vs->ioc_tag);
3302     }
3303     if (websocket) {
3304         vs->websocket = 1;
3305         if (vd->tlscreds) {
3306             vs->ioc_tag = qio_channel_add_watch(
3307                 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3308                 vncws_tls_handshake_io, vs, NULL);
3309         } else {
3310             vs->ioc_tag = qio_channel_add_watch(
3311                 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3312                 vncws_handshake_io, vs, NULL);
3313         }
3314     } else {
3315         vs->ioc_tag = qio_channel_add_watch(
3316             vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3317             vnc_client_io, vs, NULL);
3318     }
3319 
3320     vnc_client_cache_addr(vs);
3321     vnc_qmp_event(vs, QAPI_EVENT_VNC_CONNECTED);
3322     vnc_set_share_mode(vs, VNC_SHARE_MODE_CONNECTING);
3323 
3324     vs->last_x = -1;
3325     vs->last_y = -1;
3326 
3327     vs->as.freq = 44100;
3328     vs->as.nchannels = 2;
3329     vs->as.fmt = AUDIO_FORMAT_S16;
3330     vs->as.endianness = 0;
3331 
3332     qemu_mutex_init(&vs->output_mutex);
3333     vs->bh = qemu_bh_new(vnc_jobs_bh, vs);
3334 
3335     QTAILQ_INSERT_TAIL(&vd->clients, vs, next);
3336     if (first_client) {
3337         vnc_update_server_surface(vd);
3338     }
3339 
3340     graphic_hw_update(vd->dcl.con);
3341 
3342     if (!vs->websocket) {
3343         vnc_start_protocol(vs);
3344     }
3345 
3346     if (vd->num_connecting > vd->connections_limit) {
3347         QTAILQ_FOREACH(vs, &vd->clients, next) {
3348             if (vs->share_mode == VNC_SHARE_MODE_CONNECTING) {
3349                 vnc_disconnect_start(vs);
3350                 return;
3351             }
3352         }
3353     }
3354 }
3355 
vnc_start_protocol(VncState * vs)3356 void vnc_start_protocol(VncState *vs)
3357 {
3358     vnc_write(vs, "RFB 003.008\n", 12);
3359     vnc_flush(vs);
3360     vnc_read_when(vs, protocol_version, 12);
3361 
3362     vs->mouse_mode_notifier.notify = check_pointer_type_change;
3363     qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
3364 }
3365 
vnc_listen_io(QIONetListener * listener,QIOChannelSocket * cioc,void * opaque)3366 static void vnc_listen_io(QIONetListener *listener,
3367                           QIOChannelSocket *cioc,
3368                           void *opaque)
3369 {
3370     VncDisplay *vd = opaque;
3371     bool isWebsock = listener == vd->wslistener;
3372 
3373     qio_channel_set_name(QIO_CHANNEL(cioc),
3374                          isWebsock ? "vnc-ws-server" : "vnc-server");
3375     qio_channel_set_delay(QIO_CHANNEL(cioc), false);
3376     vnc_connect(vd, cioc, false, isWebsock);
3377 }
3378 
3379 static const DisplayChangeListenerOps dcl_ops = {
3380     .dpy_name             = "vnc",
3381     .dpy_refresh          = vnc_refresh,
3382     .dpy_gfx_update       = vnc_dpy_update,
3383     .dpy_gfx_switch       = vnc_dpy_switch,
3384     .dpy_gfx_check_format = qemu_pixman_check_format,
3385     .dpy_mouse_set        = vnc_mouse_set,
3386     .dpy_cursor_define    = vnc_dpy_cursor_define,
3387 };
3388 
vnc_display_init(const char * id,Error ** errp)3389 void vnc_display_init(const char *id, Error **errp)
3390 {
3391     VncDisplay *vd;
3392 
3393     if (vnc_display_find(id) != NULL) {
3394         return;
3395     }
3396     vd = g_malloc0(sizeof(*vd));
3397 
3398     vd->id = strdup(id);
3399     QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
3400 
3401     QTAILQ_INIT(&vd->clients);
3402     vd->expires = TIME_MAX;
3403 
3404     if (keyboard_layout) {
3405         trace_vnc_key_map_init(keyboard_layout);
3406         vd->kbd_layout = init_keyboard_layout(name2keysym,
3407                                               keyboard_layout, errp);
3408     } else {
3409         vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us", errp);
3410     }
3411 
3412     if (!vd->kbd_layout) {
3413         return;
3414     }
3415 
3416     vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3417     vd->connections_limit = 32;
3418 
3419     qemu_mutex_init(&vd->mutex);
3420     vnc_start_worker_thread();
3421 
3422     vd->dcl.ops = &dcl_ops;
3423     register_displaychangelistener(&vd->dcl);
3424     vd->kbd = qkbd_state_init(vd->dcl.con);
3425 }
3426 
3427 
vnc_display_close(VncDisplay * vd)3428 static void vnc_display_close(VncDisplay *vd)
3429 {
3430     if (!vd) {
3431         return;
3432     }
3433 
3434     if (vd->listener) {
3435         qio_net_listener_disconnect(vd->listener);
3436         object_unref(OBJECT(vd->listener));
3437     }
3438     vd->listener = NULL;
3439 
3440     if (vd->wslistener) {
3441         qio_net_listener_disconnect(vd->wslistener);
3442         object_unref(OBJECT(vd->wslistener));
3443     }
3444     vd->wslistener = NULL;
3445 
3446     vd->auth = VNC_AUTH_INVALID;
3447     vd->subauth = VNC_AUTH_INVALID;
3448     if (vd->tlscreds) {
3449         object_unref(OBJECT(vd->tlscreds));
3450         vd->tlscreds = NULL;
3451     }
3452     if (vd->tlsauthz) {
3453         object_unparent(OBJECT(vd->tlsauthz));
3454         vd->tlsauthz = NULL;
3455     }
3456     g_free(vd->tlsauthzid);
3457     vd->tlsauthzid = NULL;
3458     if (vd->lock_key_sync) {
3459         qemu_remove_led_event_handler(vd->led);
3460         vd->led = NULL;
3461     }
3462 #ifdef CONFIG_VNC_SASL
3463     if (vd->sasl.authz) {
3464         object_unparent(OBJECT(vd->sasl.authz));
3465         vd->sasl.authz = NULL;
3466     }
3467     g_free(vd->sasl.authzid);
3468     vd->sasl.authzid = NULL;
3469 #endif
3470 }
3471 
vnc_display_password(const char * id,const char * password)3472 int vnc_display_password(const char *id, const char *password)
3473 {
3474     VncDisplay *vd = vnc_display_find(id);
3475 
3476     if (!vd) {
3477         return -EINVAL;
3478     }
3479     if (vd->auth == VNC_AUTH_NONE) {
3480         error_printf_unless_qmp("If you want use passwords please enable "
3481                                 "password auth using '-vnc ${dpy},password'.\n");
3482         return -EINVAL;
3483     }
3484 
3485     g_free(vd->password);
3486     vd->password = g_strdup(password);
3487 
3488     return 0;
3489 }
3490 
vnc_display_pw_expire(const char * id,time_t expires)3491 int vnc_display_pw_expire(const char *id, time_t expires)
3492 {
3493     VncDisplay *vd = vnc_display_find(id);
3494 
3495     if (!vd) {
3496         return -EINVAL;
3497     }
3498 
3499     vd->expires = expires;
3500     return 0;
3501 }
3502 
vnc_display_print_local_addr(VncDisplay * vd)3503 static void vnc_display_print_local_addr(VncDisplay *vd)
3504 {
3505     SocketAddress *addr;
3506 
3507     if (!vd->listener || !vd->listener->nsioc) {
3508         return;
3509     }
3510 
3511     addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], NULL);
3512     if (!addr) {
3513         return;
3514     }
3515 
3516     if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
3517         qapi_free_SocketAddress(addr);
3518         return;
3519     }
3520     error_printf_unless_qmp("VNC server running on %s:%s\n",
3521                             addr->u.inet.host,
3522                             addr->u.inet.port);
3523     qapi_free_SocketAddress(addr);
3524 }
3525 
3526 static QemuOptsList qemu_vnc_opts = {
3527     .name = "vnc",
3528     .head = QTAILQ_HEAD_INITIALIZER(qemu_vnc_opts.head),
3529     .implied_opt_name = "vnc",
3530     .desc = {
3531         {
3532             .name = "vnc",
3533             .type = QEMU_OPT_STRING,
3534         },{
3535             .name = "websocket",
3536             .type = QEMU_OPT_STRING,
3537         },{
3538             .name = "tls-creds",
3539             .type = QEMU_OPT_STRING,
3540         },{
3541             .name = "share",
3542             .type = QEMU_OPT_STRING,
3543         },{
3544             .name = "display",
3545             .type = QEMU_OPT_STRING,
3546         },{
3547             .name = "head",
3548             .type = QEMU_OPT_NUMBER,
3549         },{
3550             .name = "connections",
3551             .type = QEMU_OPT_NUMBER,
3552         },{
3553             .name = "to",
3554             .type = QEMU_OPT_NUMBER,
3555         },{
3556             .name = "ipv4",
3557             .type = QEMU_OPT_BOOL,
3558         },{
3559             .name = "ipv6",
3560             .type = QEMU_OPT_BOOL,
3561         },{
3562             .name = "password",
3563             .type = QEMU_OPT_BOOL,
3564         },{
3565             .name = "password-secret",
3566             .type = QEMU_OPT_STRING,
3567         },{
3568             .name = "reverse",
3569             .type = QEMU_OPT_BOOL,
3570         },{
3571             .name = "lock-key-sync",
3572             .type = QEMU_OPT_BOOL,
3573         },{
3574             .name = "key-delay-ms",
3575             .type = QEMU_OPT_NUMBER,
3576         },{
3577             .name = "sasl",
3578             .type = QEMU_OPT_BOOL,
3579         },{
3580             .name = "tls-authz",
3581             .type = QEMU_OPT_STRING,
3582         },{
3583             .name = "sasl-authz",
3584             .type = QEMU_OPT_STRING,
3585         },{
3586             .name = "lossy",
3587             .type = QEMU_OPT_BOOL,
3588         },{
3589             .name = "non-adaptive",
3590             .type = QEMU_OPT_BOOL,
3591         },{
3592             .name = "audiodev",
3593             .type = QEMU_OPT_STRING,
3594         },{
3595             .name = "power-control",
3596             .type = QEMU_OPT_BOOL,
3597         },
3598         { /* end of list */ }
3599     },
3600 };
3601 
3602 
3603 static int
vnc_display_setup_auth(int * auth,int * subauth,QCryptoTLSCreds * tlscreds,bool password,bool sasl,bool websocket,Error ** errp)3604 vnc_display_setup_auth(int *auth,
3605                        int *subauth,
3606                        QCryptoTLSCreds *tlscreds,
3607                        bool password,
3608                        bool sasl,
3609                        bool websocket,
3610                        Error **errp)
3611 {
3612     /*
3613      * We have a choice of 3 authentication options
3614      *
3615      *   1. none
3616      *   2. vnc
3617      *   3. sasl
3618      *
3619      * The channel can be run in 2 modes
3620      *
3621      *   1. clear
3622      *   2. tls
3623      *
3624      * And TLS can use 2 types of credentials
3625      *
3626      *   1. anon
3627      *   2. x509
3628      *
3629      * We thus have 9 possible logical combinations
3630      *
3631      *   1. clear + none
3632      *   2. clear + vnc
3633      *   3. clear + sasl
3634      *   4. tls + anon + none
3635      *   5. tls + anon + vnc
3636      *   6. tls + anon + sasl
3637      *   7. tls + x509 + none
3638      *   8. tls + x509 + vnc
3639      *   9. tls + x509 + sasl
3640      *
3641      * These need to be mapped into the VNC auth schemes
3642      * in an appropriate manner. In regular VNC, all the
3643      * TLS options get mapped into VNC_AUTH_VENCRYPT
3644      * sub-auth types.
3645      *
3646      * In websockets, the https:// protocol already provides
3647      * TLS support, so there is no need to make use of the
3648      * VeNCrypt extension. Furthermore, websockets browser
3649      * clients could not use VeNCrypt even if they wanted to,
3650      * as they cannot control when the TLS handshake takes
3651      * place. Thus there is no option but to rely on https://,
3652      * meaning combinations 4->6 and 7->9 will be mapped to
3653      * VNC auth schemes in the same way as combos 1->3.
3654      *
3655      * Regardless of fact that we have a different mapping to
3656      * VNC auth mechs for plain VNC vs websockets VNC, the end
3657      * result has the same security characteristics.
3658      */
3659     if (websocket || !tlscreds) {
3660         if (password) {
3661             VNC_DEBUG("Initializing VNC server with password auth\n");
3662             *auth = VNC_AUTH_VNC;
3663         } else if (sasl) {
3664             VNC_DEBUG("Initializing VNC server with SASL auth\n");
3665             *auth = VNC_AUTH_SASL;
3666         } else {
3667             VNC_DEBUG("Initializing VNC server with no auth\n");
3668             *auth = VNC_AUTH_NONE;
3669         }
3670         *subauth = VNC_AUTH_INVALID;
3671     } else {
3672         bool is_x509 = object_dynamic_cast(OBJECT(tlscreds),
3673                                            TYPE_QCRYPTO_TLS_CREDS_X509) != NULL;
3674         bool is_anon = object_dynamic_cast(OBJECT(tlscreds),
3675                                            TYPE_QCRYPTO_TLS_CREDS_ANON) != NULL;
3676 
3677         if (!is_x509 && !is_anon) {
3678             error_setg(errp,
3679                        "Unsupported TLS cred type %s",
3680                        object_get_typename(OBJECT(tlscreds)));
3681             return -1;
3682         }
3683         *auth = VNC_AUTH_VENCRYPT;
3684         if (password) {
3685             if (is_x509) {
3686                 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3687                 *subauth = VNC_AUTH_VENCRYPT_X509VNC;
3688             } else {
3689                 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3690                 *subauth = VNC_AUTH_VENCRYPT_TLSVNC;
3691             }
3692 
3693         } else if (sasl) {
3694             if (is_x509) {
3695                 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3696                 *subauth = VNC_AUTH_VENCRYPT_X509SASL;
3697             } else {
3698                 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3699                 *subauth = VNC_AUTH_VENCRYPT_TLSSASL;
3700             }
3701         } else {
3702             if (is_x509) {
3703                 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3704                 *subauth = VNC_AUTH_VENCRYPT_X509NONE;
3705             } else {
3706                 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3707                 *subauth = VNC_AUTH_VENCRYPT_TLSNONE;
3708             }
3709         }
3710     }
3711     return 0;
3712 }
3713 
3714 
vnc_display_get_address(const char * addrstr,bool websocket,bool reverse,int displaynum,int to,bool has_ipv4,bool has_ipv6,bool ipv4,bool ipv6,SocketAddress ** retaddr,Error ** errp)3715 static int vnc_display_get_address(const char *addrstr,
3716                                    bool websocket,
3717                                    bool reverse,
3718                                    int displaynum,
3719                                    int to,
3720                                    bool has_ipv4,
3721                                    bool has_ipv6,
3722                                    bool ipv4,
3723                                    bool ipv6,
3724                                    SocketAddress **retaddr,
3725                                    Error **errp)
3726 {
3727     int ret = -1;
3728     SocketAddress *addr = NULL;
3729 
3730     addr = g_new0(SocketAddress, 1);
3731 
3732     if (strncmp(addrstr, "unix:", 5) == 0) {
3733         addr->type = SOCKET_ADDRESS_TYPE_UNIX;
3734         addr->u.q_unix.path = g_strdup(addrstr + 5);
3735 
3736         if (to) {
3737             error_setg(errp, "Port range not support with UNIX socket");
3738             goto cleanup;
3739         }
3740         ret = 0;
3741     } else {
3742         const char *port;
3743         size_t hostlen;
3744         uint64_t baseport = 0;
3745         InetSocketAddress *inet;
3746 
3747         port = strrchr(addrstr, ':');
3748         if (!port) {
3749             if (websocket) {
3750                 hostlen = 0;
3751                 port = addrstr;
3752             } else {
3753                 error_setg(errp, "no vnc port specified");
3754                 goto cleanup;
3755             }
3756         } else {
3757             hostlen = port - addrstr;
3758             port++;
3759             if (*port == '\0') {
3760                 error_setg(errp, "vnc port cannot be empty");
3761                 goto cleanup;
3762             }
3763         }
3764 
3765         addr->type = SOCKET_ADDRESS_TYPE_INET;
3766         inet = &addr->u.inet;
3767         if (hostlen && addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
3768             inet->host = g_strndup(addrstr + 1, hostlen - 2);
3769         } else {
3770             inet->host = g_strndup(addrstr, hostlen);
3771         }
3772         /* plain VNC port is just an offset, for websocket
3773          * port is absolute */
3774         if (websocket) {
3775             if (g_str_equal(addrstr, "") ||
3776                 g_str_equal(addrstr, "on")) {
3777                 if (displaynum == -1) {
3778                     error_setg(errp, "explicit websocket port is required");
3779                     goto cleanup;
3780                 }
3781                 inet->port = g_strdup_printf(
3782                     "%d", displaynum + 5700);
3783                 if (to) {
3784                     inet->has_to = true;
3785                     inet->to = to + 5700;
3786                 }
3787             } else {
3788                 inet->port = g_strdup(port);
3789             }
3790         } else {
3791             int offset = reverse ? 0 : 5900;
3792             if (parse_uint_full(port, 10, &baseport) < 0) {
3793                 error_setg(errp, "can't convert to a number: %s", port);
3794                 goto cleanup;
3795             }
3796             if (baseport > 65535 ||
3797                 baseport + offset > 65535) {
3798                 error_setg(errp, "port %s out of range", port);
3799                 goto cleanup;
3800             }
3801             inet->port = g_strdup_printf(
3802                 "%d", (int)baseport + offset);
3803 
3804             if (to) {
3805                 inet->has_to = true;
3806                 inet->to = to + offset;
3807             }
3808         }
3809 
3810         inet->ipv4 = ipv4;
3811         inet->has_ipv4 = has_ipv4;
3812         inet->ipv6 = ipv6;
3813         inet->has_ipv6 = has_ipv6;
3814 
3815         ret = baseport;
3816     }
3817 
3818     *retaddr = addr;
3819 
3820  cleanup:
3821     if (ret < 0) {
3822         qapi_free_SocketAddress(addr);
3823     }
3824     return ret;
3825 }
3826 
vnc_display_get_addresses(QemuOpts * opts,bool reverse,SocketAddressList ** saddr_list_ret,SocketAddressList ** wsaddr_list_ret,Error ** errp)3827 static int vnc_display_get_addresses(QemuOpts *opts,
3828                                      bool reverse,
3829                                      SocketAddressList **saddr_list_ret,
3830                                      SocketAddressList **wsaddr_list_ret,
3831                                      Error **errp)
3832 {
3833     SocketAddress *saddr = NULL;
3834     SocketAddress *wsaddr = NULL;
3835     g_autoptr(SocketAddressList) saddr_list = NULL;
3836     SocketAddressList **saddr_tail = &saddr_list;
3837     SocketAddress *single_saddr = NULL;
3838     g_autoptr(SocketAddressList) wsaddr_list = NULL;
3839     SocketAddressList **wsaddr_tail = &wsaddr_list;
3840     QemuOptsIter addriter;
3841     const char *addr;
3842     int to = qemu_opt_get_number(opts, "to", 0);
3843     bool has_ipv4 = qemu_opt_get(opts, "ipv4");
3844     bool has_ipv6 = qemu_opt_get(opts, "ipv6");
3845     bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false);
3846     bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false);
3847     int displaynum = -1;
3848 
3849     addr = qemu_opt_get(opts, "vnc");
3850     if (addr == NULL || g_str_equal(addr, "none")) {
3851         return 0;
3852     }
3853     if (qemu_opt_get(opts, "websocket") &&
3854         !qcrypto_hash_supports(QCRYPTO_HASH_ALGO_SHA1)) {
3855         error_setg(errp,
3856                    "SHA1 hash support is required for websockets");
3857         return -1;
3858     }
3859 
3860     qemu_opt_iter_init(&addriter, opts, "vnc");
3861     while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3862         int rv;
3863         rv = vnc_display_get_address(addr, false, reverse, 0, to,
3864                                      has_ipv4, has_ipv6,
3865                                      ipv4, ipv6,
3866                                      &saddr, errp);
3867         if (rv < 0) {
3868             return -1;
3869         }
3870         /* Historical compat - first listen address can be used
3871          * to set the default websocket port
3872          */
3873         if (displaynum == -1) {
3874             displaynum = rv;
3875         }
3876         QAPI_LIST_APPEND(saddr_tail, saddr);
3877     }
3878 
3879     if (saddr_list && !saddr_list->next) {
3880         single_saddr = saddr_list->value;
3881     } else {
3882         /*
3883          * If we had multiple primary displays, we don't do defaults
3884          * for websocket, and require explicit config instead.
3885          */
3886         displaynum = -1;
3887     }
3888 
3889     qemu_opt_iter_init(&addriter, opts, "websocket");
3890     while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3891         if (vnc_display_get_address(addr, true, reverse, displaynum, to,
3892                                     has_ipv4, has_ipv6,
3893                                     ipv4, ipv6,
3894                                     &wsaddr, errp) < 0) {
3895             return -1;
3896         }
3897 
3898         /* Historical compat - if only a single listen address was
3899          * provided, then this is used to set the default listen
3900          * address for websocket too
3901          */
3902         if (single_saddr &&
3903             single_saddr->type == SOCKET_ADDRESS_TYPE_INET &&
3904             wsaddr->type == SOCKET_ADDRESS_TYPE_INET &&
3905             g_str_equal(wsaddr->u.inet.host, "") &&
3906             !g_str_equal(single_saddr->u.inet.host, "")) {
3907             g_free(wsaddr->u.inet.host);
3908             wsaddr->u.inet.host = g_strdup(single_saddr->u.inet.host);
3909         }
3910 
3911         QAPI_LIST_APPEND(wsaddr_tail, wsaddr);
3912     }
3913 
3914     *saddr_list_ret = g_steal_pointer(&saddr_list);
3915     *wsaddr_list_ret = g_steal_pointer(&wsaddr_list);
3916     return 0;
3917 }
3918 
vnc_display_connect(VncDisplay * vd,SocketAddressList * saddr_list,SocketAddressList * wsaddr_list,Error ** errp)3919 static int vnc_display_connect(VncDisplay *vd,
3920                                SocketAddressList *saddr_list,
3921                                SocketAddressList *wsaddr_list,
3922                                Error **errp)
3923 {
3924     /* connect to viewer */
3925     QIOChannelSocket *sioc = NULL;
3926     if (wsaddr_list) {
3927         error_setg(errp, "Cannot use websockets in reverse mode");
3928         return -1;
3929     }
3930     if (!saddr_list || saddr_list->next) {
3931         error_setg(errp, "Expected a single address in reverse mode");
3932         return -1;
3933     }
3934     sioc = qio_channel_socket_new();
3935     qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
3936     if (qio_channel_socket_connect_sync(sioc, saddr_list->value, errp) < 0) {
3937         object_unref(OBJECT(sioc));
3938         return -1;
3939     }
3940     vnc_connect(vd, sioc, false, false);
3941     object_unref(OBJECT(sioc));
3942     return 0;
3943 }
3944 
3945 
vnc_display_listen(VncDisplay * vd,SocketAddressList * saddr_list,SocketAddressList * wsaddr_list,Error ** errp)3946 static int vnc_display_listen(VncDisplay *vd,
3947                               SocketAddressList *saddr_list,
3948                               SocketAddressList *wsaddr_list,
3949                               Error **errp)
3950 {
3951     SocketAddressList *el;
3952 
3953     if (saddr_list) {
3954         vd->listener = qio_net_listener_new();
3955         qio_net_listener_set_name(vd->listener, "vnc-listen");
3956         for (el = saddr_list; el; el = el->next) {
3957             if (qio_net_listener_open_sync(vd->listener,
3958                                            el->value, 1,
3959                                            errp) < 0)  {
3960                 return -1;
3961             }
3962         }
3963 
3964         qio_net_listener_set_client_func(vd->listener,
3965                                          vnc_listen_io, vd, NULL);
3966     }
3967 
3968     if (wsaddr_list) {
3969         vd->wslistener = qio_net_listener_new();
3970         qio_net_listener_set_name(vd->wslistener, "vnc-ws-listen");
3971         for (el = wsaddr_list; el; el = el->next) {
3972             if (qio_net_listener_open_sync(vd->wslistener,
3973                                            el->value, 1,
3974                                            errp) < 0)  {
3975                 return -1;
3976             }
3977         }
3978 
3979         qio_net_listener_set_client_func(vd->wslistener,
3980                                          vnc_listen_io, vd, NULL);
3981     }
3982 
3983     return 0;
3984 }
3985 
vnc_display_update(DisplayUpdateOptionsVNC * arg,Error ** errp)3986 bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
3987 {
3988     VncDisplay *vd = vnc_display_find(NULL);
3989 
3990     if (!vd) {
3991         error_setg(errp, "Can not find vnc display");
3992         return false;
3993     }
3994 
3995     if (arg->has_addresses) {
3996         if (vd->listener) {
3997             qio_net_listener_disconnect(vd->listener);
3998             object_unref(OBJECT(vd->listener));
3999             vd->listener = NULL;
4000         }
4001 
4002         if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) {
4003             return false;
4004         }
4005     }
4006 
4007     return true;
4008 }
4009 
vnc_display_open(const char * id,Error ** errp)4010 void vnc_display_open(const char *id, Error **errp)
4011 {
4012     VncDisplay *vd = vnc_display_find(id);
4013     QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
4014     g_autoptr(SocketAddressList) saddr_list = NULL;
4015     g_autoptr(SocketAddressList) wsaddr_list = NULL;
4016     const char *share, *device_id;
4017     QemuConsole *con;
4018     bool password = false;
4019     bool reverse = false;
4020     const char *credid;
4021     bool sasl = false;
4022     const char *tlsauthz;
4023     const char *saslauthz;
4024     int lock_key_sync = 1;
4025     int key_delay_ms;
4026     const char *audiodev;
4027     const char *passwordSecret;
4028 
4029     if (!vd) {
4030         error_setg(errp, "VNC display not active");
4031         return;
4032     }
4033     vnc_display_close(vd);
4034 
4035     if (!opts) {
4036         return;
4037     }
4038 
4039     reverse = qemu_opt_get_bool(opts, "reverse", false);
4040     if (vnc_display_get_addresses(opts, reverse, &saddr_list, &wsaddr_list,
4041                                   errp) < 0) {
4042         goto fail;
4043     }
4044 
4045 
4046     passwordSecret = qemu_opt_get(opts, "password-secret");
4047     if (passwordSecret) {
4048         if (qemu_opt_get(opts, "password")) {
4049             error_setg(errp,
4050                        "'password' flag is redundant with 'password-secret'");
4051             goto fail;
4052         }
4053         vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret,
4054                                                      errp);
4055         if (!vd->password) {
4056             goto fail;
4057         }
4058         password = true;
4059     } else {
4060         password = qemu_opt_get_bool(opts, "password", false);
4061     }
4062     if (password) {
4063         if (!qcrypto_cipher_supports(
4064                 QCRYPTO_CIPHER_ALGO_DES, QCRYPTO_CIPHER_MODE_ECB)) {
4065             error_setg(errp,
4066                        "Cipher backend does not support DES algorithm");
4067             goto fail;
4068         }
4069     }
4070 
4071     lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
4072     key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 10);
4073     sasl = qemu_opt_get_bool(opts, "sasl", false);
4074 #ifndef CONFIG_VNC_SASL
4075     if (sasl) {
4076         error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
4077         goto fail;
4078     }
4079 #endif /* CONFIG_VNC_SASL */
4080     credid = qemu_opt_get(opts, "tls-creds");
4081     if (credid) {
4082         Object *creds;
4083         creds = object_resolve_path_component(
4084             object_get_objects_root(), credid);
4085         if (!creds) {
4086             error_setg(errp, "No TLS credentials with id '%s'",
4087                        credid);
4088             goto fail;
4089         }
4090         vd->tlscreds = (QCryptoTLSCreds *)
4091             object_dynamic_cast(creds,
4092                                 TYPE_QCRYPTO_TLS_CREDS);
4093         if (!vd->tlscreds) {
4094             error_setg(errp, "Object with id '%s' is not TLS credentials",
4095                        credid);
4096             goto fail;
4097         }
4098         object_ref(OBJECT(vd->tlscreds));
4099 
4100         if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds,
4101                                               QCRYPTO_TLS_CREDS_ENDPOINT_SERVER,
4102                                               errp)) {
4103             goto fail;
4104         }
4105     }
4106     tlsauthz = qemu_opt_get(opts, "tls-authz");
4107     if (tlsauthz && !vd->tlscreds) {
4108         error_setg(errp, "'tls-authz' provided but TLS is not enabled");
4109         goto fail;
4110     }
4111 
4112     saslauthz = qemu_opt_get(opts, "sasl-authz");
4113     if (saslauthz && !sasl) {
4114         error_setg(errp, "'sasl-authz' provided but SASL auth is not enabled");
4115         goto fail;
4116     }
4117 
4118     share = qemu_opt_get(opts, "share");
4119     if (share) {
4120         if (strcmp(share, "ignore") == 0) {
4121             vd->share_policy = VNC_SHARE_POLICY_IGNORE;
4122         } else if (strcmp(share, "allow-exclusive") == 0) {
4123             vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
4124         } else if (strcmp(share, "force-shared") == 0) {
4125             vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
4126         } else {
4127             error_setg(errp, "unknown vnc share= option");
4128             goto fail;
4129         }
4130     } else {
4131         vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
4132     }
4133     vd->connections_limit = qemu_opt_get_number(opts, "connections", 32);
4134 
4135 #ifdef CONFIG_VNC_JPEG
4136     vd->lossy = qemu_opt_get_bool(opts, "lossy", false);
4137 #endif
4138     vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false);
4139     /* adaptive updates are only used with tight encoding and
4140      * if lossy updates are enabled so we can disable all the
4141      * calculations otherwise */
4142     if (!vd->lossy) {
4143         vd->non_adaptive = true;
4144     }
4145 
4146     vd->power_control = qemu_opt_get_bool(opts, "power-control", false);
4147 
4148     if (tlsauthz) {
4149         vd->tlsauthzid = g_strdup(tlsauthz);
4150     }
4151 #ifdef CONFIG_VNC_SASL
4152     if (sasl) {
4153         if (saslauthz) {
4154             vd->sasl.authzid = g_strdup(saslauthz);
4155         }
4156     }
4157 #endif
4158 
4159     if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
4160                                vd->tlscreds, password,
4161                                sasl, false, errp) < 0) {
4162         goto fail;
4163     }
4164     trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
4165 
4166     if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
4167                                vd->tlscreds, password,
4168                                sasl, true, errp) < 0) {
4169         goto fail;
4170     }
4171     trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
4172 
4173 #ifdef CONFIG_VNC_SASL
4174     if (sasl && !vnc_sasl_server_init(errp)) {
4175         goto fail;
4176     }
4177 #endif
4178     vd->lock_key_sync = lock_key_sync;
4179     if (lock_key_sync) {
4180         vd->led = qemu_add_led_event_handler(kbd_leds, vd);
4181     }
4182     vd->ledstate = 0;
4183 
4184     audiodev = qemu_opt_get(opts, "audiodev");
4185     if (audiodev) {
4186         vd->audio_state = audio_state_by_name(audiodev, errp);
4187         if (!vd->audio_state) {
4188             goto fail;
4189         }
4190     } else {
4191         vd->audio_state = audio_get_default_audio_state(NULL);
4192     }
4193 
4194     device_id = qemu_opt_get(opts, "display");
4195     if (device_id) {
4196         int head = qemu_opt_get_number(opts, "head", 0);
4197         Error *err = NULL;
4198 
4199         con = qemu_console_lookup_by_device_name(device_id, head, &err);
4200         if (err) {
4201             error_propagate(errp, err);
4202             goto fail;
4203         }
4204     } else {
4205         con = qemu_console_lookup_default();
4206     }
4207 
4208     if (con != vd->dcl.con) {
4209         qkbd_state_free(vd->kbd);
4210         unregister_displaychangelistener(&vd->dcl);
4211         vd->dcl.con = con;
4212         register_displaychangelistener(&vd->dcl);
4213         vd->kbd = qkbd_state_init(vd->dcl.con);
4214     }
4215     qkbd_state_set_delay(vd->kbd, key_delay_ms);
4216 
4217     if (saddr_list == NULL) {
4218         return;
4219     }
4220 
4221     if (reverse) {
4222         if (vnc_display_connect(vd, saddr_list, wsaddr_list, errp) < 0) {
4223             goto fail;
4224         }
4225     } else {
4226         if (vnc_display_listen(vd, saddr_list, wsaddr_list, errp) < 0) {
4227             goto fail;
4228         }
4229     }
4230 
4231     if (qemu_opt_get(opts, "to")) {
4232         vnc_display_print_local_addr(vd);
4233     }
4234 
4235     /* Success */
4236     return;
4237 
4238 fail:
4239     vnc_display_close(vd);
4240 }
4241 
vnc_display_add_client(const char * id,int csock,bool skipauth)4242 void vnc_display_add_client(const char *id, int csock, bool skipauth)
4243 {
4244     VncDisplay *vd = vnc_display_find(id);
4245     QIOChannelSocket *sioc;
4246 
4247     if (!vd) {
4248         return;
4249     }
4250 
4251     sioc = qio_channel_socket_new_fd(csock, NULL);
4252     if (sioc) {
4253         qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server");
4254         vnc_connect(vd, sioc, skipauth, false);
4255         object_unref(OBJECT(sioc));
4256     }
4257 }
4258 
vnc_auto_assign_id(QemuOptsList * olist,QemuOpts * opts)4259 static void vnc_auto_assign_id(QemuOptsList *olist, QemuOpts *opts)
4260 {
4261     int i = 2;
4262     char *id;
4263 
4264     id = g_strdup("default");
4265     while (qemu_opts_find(olist, id)) {
4266         g_free(id);
4267         id = g_strdup_printf("vnc%d", i++);
4268     }
4269     qemu_opts_set_id(opts, id);
4270 }
4271 
vnc_parse(const char * str)4272 void vnc_parse(const char *str)
4273 {
4274     QemuOptsList *olist = qemu_find_opts("vnc");
4275     QemuOpts *opts = qemu_opts_parse_noisily(olist, str, !is_help_option(str));
4276     const char *id;
4277 
4278     if (!opts) {
4279         exit(1);
4280     }
4281 
4282     id = qemu_opts_id(opts);
4283     if (!id) {
4284         /* auto-assign id if not present */
4285         vnc_auto_assign_id(olist, opts);
4286     }
4287 }
4288 
vnc_init_func(void * opaque,QemuOpts * opts,Error ** errp)4289 int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
4290 {
4291     Error *local_err = NULL;
4292     char *id = (char *)qemu_opts_id(opts);
4293 
4294     assert(id);
4295     vnc_display_init(id, &local_err);
4296     if (local_err) {
4297         error_propagate(errp, local_err);
4298         return -1;
4299     }
4300     vnc_display_open(id, &local_err);
4301     if (local_err != NULL) {
4302         error_propagate(errp, local_err);
4303         return -1;
4304     }
4305     return 0;
4306 }
4307 
vnc_register_config(void)4308 static void vnc_register_config(void)
4309 {
4310     qemu_add_opts(&qemu_vnc_opts);
4311 }
4312 opts_init(vnc_register_config);
4313