Browse Source

Merge pull request #54344 from mhilbrunner/rpc-error-msgs

Websockets: Fix buffer size checks in put_packet(), silent failures/connection hangs
Fabio Alessandrelli 3 years ago
parent
commit
dae626ad64
2 changed files with 9 additions and 6 deletions
  1. 5 2
      modules/websocket/emws_peer.cpp
  2. 4 4
      modules/websocket/wsl_peer.cpp

+ 5 - 2
modules/websocket/emws_peer.cpp

@@ -54,11 +54,14 @@ Error EMWSPeer::read_msg(const uint8_t *p_data, uint32_t p_size, bool p_is_strin
 }
 }
 
 
 Error EMWSPeer::put_packet(const uint8_t *p_buffer, int p_buffer_size) {
 Error EMWSPeer::put_packet(const uint8_t *p_buffer, int p_buffer_size) {
-	ERR_FAIL_COND_V(_out_buf_size && ((uint64_t)godot_js_websocket_buffered_amount(peer_sock) >= (1ULL << _out_buf_size)), ERR_OUT_OF_MEMORY);
+	ERR_FAIL_COND_V(_out_buf_size && ((uint64_t)godot_js_websocket_buffered_amount(peer_sock) + p_buffer_size >= (1ULL << _out_buf_size)), ERR_OUT_OF_MEMORY);
 
 
 	int is_bin = write_mode == WebSocketPeer::WRITE_MODE_BINARY ? 1 : 0;
 	int is_bin = write_mode == WebSocketPeer::WRITE_MODE_BINARY ? 1 : 0;
 
 
-	godot_js_websocket_send(peer_sock, p_buffer, p_buffer_size, is_bin);
+	if (godot_js_websocket_send(peer_sock, p_buffer, p_buffer_size, is_bin) != 0) {
+		return FAILED;
+	}
+
 	return OK;
 	return OK;
 }
 }
 
 

+ 4 - 4
modules/websocket/wsl_peer.cpp

@@ -242,15 +242,15 @@ void WSLPeer::poll() {
 Error WSLPeer::put_packet(const uint8_t *p_buffer, int p_buffer_size) {
 Error WSLPeer::put_packet(const uint8_t *p_buffer, int p_buffer_size) {
 	ERR_FAIL_COND_V(!is_connected_to_host(), FAILED);
 	ERR_FAIL_COND_V(!is_connected_to_host(), FAILED);
 	ERR_FAIL_COND_V(_out_pkt_size && (wslay_event_get_queued_msg_count(_data->ctx) >= (1ULL << _out_pkt_size)), ERR_OUT_OF_MEMORY);
 	ERR_FAIL_COND_V(_out_pkt_size && (wslay_event_get_queued_msg_count(_data->ctx) >= (1ULL << _out_pkt_size)), ERR_OUT_OF_MEMORY);
-	ERR_FAIL_COND_V(_out_buf_size && (wslay_event_get_queued_msg_length(_data->ctx) >= (1ULL << _out_buf_size)), ERR_OUT_OF_MEMORY);
+	ERR_FAIL_COND_V(_out_buf_size && (wslay_event_get_queued_msg_length(_data->ctx) + p_buffer_size >= (1ULL << _out_buf_size)), ERR_OUT_OF_MEMORY);
 
 
-	struct wslay_event_msg msg; // Should I use fragmented?
+	struct wslay_event_msg msg;
 	msg.opcode = write_mode == WRITE_MODE_TEXT ? WSLAY_TEXT_FRAME : WSLAY_BINARY_FRAME;
 	msg.opcode = write_mode == WRITE_MODE_TEXT ? WSLAY_TEXT_FRAME : WSLAY_BINARY_FRAME;
 	msg.msg = p_buffer;
 	msg.msg = p_buffer;
 	msg.msg_length = p_buffer_size;
 	msg.msg_length = p_buffer_size;
 
 
-	wslay_event_queue_msg(_data->ctx, &msg);
-	if (wslay_event_send(_data->ctx) < 0) {
+	// Queue & send message.
+	if (wslay_event_queue_msg(_data->ctx, &msg) != 0 || wslay_event_send(_data->ctx) != 0) {
 		close_now();
 		close_now();
 		return FAILED;
 		return FAILED;
 	}
 	}