From af10f458a1590691e4c2f03a499d6c22fdf81cfe Mon Sep 17 00:00:00 2001
From: Rafael Folco <rafaelfolco@gmail.com>
Date: Wed, 25 Mar 2015 01:20:25 -0300
Subject: [PATCH] BUGFIX: Websocket frame corruption on big-endian #150
This patch fixes noVNC endianess problem on handshake.
It affects noVNC sessions on Big Endian platforms.
Fixes #150
---
websockify/websocket.py | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/websockify/websocket.py b/websockify/websocket.py
index 1b3dca9..de56af3 100644
--- a/websockify/websocket.py
+++ b/websockify/websocket.py
@@ -118,20 +118,24 @@ class WebSocketRequestHandler(SimpleHTTPRequestHandler):
if numpy:
b = c = s2b('')
if plen >= 4:
- mask = numpy.frombuffer(buf, dtype=numpy.dtype('<u4'),
- offset=hlen, count=1)
- data = numpy.frombuffer(buf, dtype=numpy.dtype('<u4'),
- offset=pstart, count=int(plen / 4))
+ dtype=numpy.dtype('<u4')
+ if sys.byteorder == 'big':
+ dtype = dtype.newbyteorder('>')
+ mask = numpy.frombuffer(buf, dtype, offset=hlen, count=1)
+ data = numpy.frombuffer(buf, dtype, offset=pstart,
+ count=int(plen / 4))
#b = numpy.bitwise_xor(data, mask).data
b = numpy.bitwise_xor(data, mask).tostring()
if plen % 4:
#self.msg("Partial unmask")
- mask = numpy.frombuffer(buf, dtype=numpy.dtype('B'),
- offset=hlen, count=(plen % 4))
- data = numpy.frombuffer(buf, dtype=numpy.dtype('B'),
- offset=pend - (plen % 4),
+ dtype=numpy.dtype('B')
+ if sys.byteorder == 'big':
+ dtype = dtype.newbyteorder('>')
+ mask = numpy.frombuffer(buf, dtype, offset=hlen,
count=(plen % 4))
+ data = numpy.frombuffer(buf, dtype,
+ offset=pend - (plen % 4), count=(plen % 4))
c = numpy.bitwise_xor(data, mask).tostring()
return b + c
else:
--
2.3.4