Skip to content

qemu vnc screen resize #640

@cxcel

Description

@cxcel

When the remote segment changes the resolution, a segmentation fault occurs. rfbEncodingExtDesktopSize and qemu do not match. After turning off rfbEncodingExtDesktopSize, the resolution can be changed normally.

######################
libvncclient code:

diff --git a/src/libvncclient/rfbclient.c b/src/libvncclient/rfbclient.c
index 6f0afac2..5a73eb47 100644
--- a/src/libvncclient/rfbclient.c
+++ b/src/libvncclient/rfbclient.c
@@ -1424,8 +1424,8 @@ SetFormatAndEncodings(rfbClient* client)
/* New Frame Buffer Size */
if (se->nEncodings < MAX_ENCODINGS && client->canHandleNewFBSize)
encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingNewFBSize);

  • if (se->nEncodings < MAX_ENCODINGS)
  • encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingExtDesktopSize);
  • //if (se->nEncodings < MAX_ENCODINGS)

  • // encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingExtDesktopSize);

    /* Last Rect */
    if (se->nEncodings < MAX_ENCODINGS && requestLastRectEncoding)

#########################
qemu vnc code:

static void vnc_desktop_resize_ext(VncState *vs, int reject_reason)
{
trace_vnc_msg_server_ext_desktop_resize(
vs, vs->ioc, vs->client_width, vs->client_height, reject_reason);

vnc_lock_output(vs);
vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
vnc_write_u8(vs, 0);
vnc_write_u16(vs, 1); /* number of rects */
vnc_framebuffer_update(vs,
                       reject_reason ? 1 : 0,
                       reject_reason,
                       vs->client_width, vs->client_height,
                       VNC_ENCODING_DESKTOP_RESIZE_EXT);
vnc_write_u8(vs, 1);  /* number of screens */
vnc_write_u8(vs, 0);  /* padding */
vnc_write_u8(vs, 0);  /* padding */
vnc_write_u8(vs, 0);  /* padding */
vnc_write_u32(vs, 0); /* screen id */
vnc_write_u16(vs, 0); /* screen x-pos */
vnc_write_u16(vs, 0); /* screen y-pos */
vnc_write_u16(vs, vs->client_width);
vnc_write_u16(vs, vs->client_height);
vnc_write_u32(vs, 0); /* screen flags */
vnc_unlock_output(vs);
vnc_flush(vs);

}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions