summaryrefslogtreecommitdiffstats
path: root/libvncserver/websockets.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvncserver/websockets.c')
-rw-r--r--libvncserver/websockets.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/libvncserver/websockets.c b/libvncserver/websockets.c
index 7532e33..425bc15 100644
--- a/libvncserver/websockets.c
+++ b/libvncserver/websockets.c
@@ -527,7 +527,10 @@ webSocketsDecodeHixie(rfbClientPtr cl, char *dst, int len)
n = ws_peek(cl, buf, len*2+2);
if (n <= 0) {
+ /* save errno because rfbErr() will tamper it */
+ int olderrno = errno;
rfbErr("%s: peek (%d) %m\n", __func__, errno);
+ errno = olderrno;
return n;
}
@@ -642,14 +645,20 @@ webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
buf = wsctx->codeBuf;
header = (ws_header_t *)wsctx->codeBuf;
- if (-1 == (ret = ws_peek(cl, buf, B64LEN(len) + WSHLENMAX))) {
- rfbErr("%s: peek; %m\n", __func__);
- goto spor;
- }
+ ret = ws_peek(cl, buf, B64LEN(len) + WSHLENMAX);
if (ret < 2) {
- rfbErr("%s: peek; got %d bytes\n", __func__, ret);
- goto spor; /* Incomplete frame header */
+ /* save errno because rfbErr() will tamper it */
+ if (-1 == ret) {
+ int olderrno = errno;
+ rfbErr("%s: peek; %m\n", __func__);
+ errno = olderrno;
+ } else if (0 == ret) {
+ result = 0;
+ } else {
+ errno = EAGAIN;
+ }
+ goto spor;
}
opcode = header->b0 & 0x0f;
@@ -691,7 +700,9 @@ webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
payload = buf + fhlen + 4; /* header length + mask */
if (-1 == (ret = ws_read(cl, buf, total))) {
+ int olderrno = errno;
rfbErr("%s: read; %m", __func__);
+ errno = olderrno;
return ret;
} else if (ret < total) {
/* GT TODO: hmm? */
@@ -760,7 +771,7 @@ webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, char **dst)
* 0xA - pong
**/
if (!len) {
- rfbLog("%s: nothing to encode\n", __func__);
+ /* nothing to encode */
return 0;
}