You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ay...@apache.org on 2014/07/19 00:02:13 UTC
git commit: [CXF-5893] Websocket transport sporadically fails with
corrupted data
Repository: cxf
Updated Branches:
refs/heads/master 1bcb4ec0d -> 95bfefb65
[CXF-5893] Websocket transport sporadically fails with corrupted data
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/95bfefb6
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/95bfefb6
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/95bfefb6
Branch: refs/heads/master
Commit: 95bfefb653417b8b23ad481ee3f61139ef0eb5ed
Parents: 1bcb4ec
Author: Akitoshi Yoshida <ay...@apache.org>
Authored: Fri Jul 18 23:57:40 2014 +0200
Committer: Akitoshi Yoshida <ay...@apache.org>
Committed: Sat Jul 19 00:01:46 2014 +0200
----------------------------------------------------------------------
.../websocket/atmosphere/AtmosphereWebSocketHandler.java | 9 +++++++--
.../cxf/transport/websocket/jetty/JettyWebSocket.java | 7 ++++++-
2 files changed, 13 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/95bfefb6/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/atmosphere/AtmosphereWebSocketHandler.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/atmosphere/AtmosphereWebSocketHandler.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/atmosphere/AtmosphereWebSocketHandler.java
index 6a5550d..ee4e358 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/atmosphere/AtmosphereWebSocketHandler.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/atmosphere/AtmosphereWebSocketHandler.java
@@ -86,18 +86,23 @@ public class AtmosphereWebSocketHandler implements WebSocketProtocol {
} catch (UnsupportedEncodingException e) {
// will not happen
}
- return onMessage(webSocket, bdata, 0, bdata.length);
+ return invokeService(webSocket, new ByteArrayInputStream(bdata, 0, bdata.length));
}
/** {@inheritDoc}*/
@Override
public List<AtmosphereRequest> onMessage(WebSocket webSocket, byte[] data, int offset, int length) {
- return invokeService(webSocket, new ByteArrayInputStream(data, offset, length));
+ final byte[] safedata = new byte[length];
+ System.arraycopy(data, offset, safedata, 0, length);
+ return invokeService(webSocket, new ByteArrayInputStream(safedata, 0, safedata.length));
}
protected List<AtmosphereRequest> invokeService(final WebSocket webSocket, final InputStream stream) {
LOG.info("invokeService(WebSocket, InputStream)");
// invoke the service directly as onMessage is synchronously blocked (in jetty)
+ // make sure the byte array passed to this method is immutable, as the websocket framework
+ // may corrupt the byte array after this method is returned (i.e., before the data is returned in
+ // the executor's thread.
destination.getExecutor().execute(new Runnable() {
@Override
public void run() {
http://git-wip-us.apache.org/repos/asf/cxf/blob/95bfefb6/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
index 3f2a79f..8d0f596 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
@@ -99,11 +99,16 @@ class JettyWebSocket implements WebSocket.OnBinaryMessage, WebSocket.OnTextMessa
if (LOG.isLoggable(Level.INFO)) {
LOG.log(Level.INFO, "onMessage({0}, {1}, {2})", new Object[]{data, offset, length});
}
- invokeService(data, offset, length);
+ final byte[] safedata = new byte[length];
+ System.arraycopy(data, offset, safedata, 0, length);
+ invokeService(safedata, 0, safedata.length);
}
private void invokeService(final byte[] data, final int offset, final int length) {
// invoke the service asynchronously as the jetty websocket's onMessage is synchronously blocked
+ // make sure the byte array passed to this method is immutable, as the websocket framework
+ // may corrupt the byte array after this method is returned (i.e., before the data is returned in
+ // the executor's thread.
manager.getExecutor().execute(new Runnable() {
@Override
public void run() {