fix memory leek

send reason code on clientDisconnect if no reason buffer is set
code style
This commit is contained in:
Markus Sattler
2015-05-23 07:33:26 +02:00
parent f1ecfa9d20
commit 2af71ab97a
3 changed files with 63 additions and 35 deletions

View File

@ -10,7 +10,7 @@
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h> #include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h> #include <WebSocketsServer.h>
#include <hash.h> #include <Hash.h>
ESP8266WiFiMulti WiFiMulti; ESP8266WiFiMulti WiFiMulti;

View File

@ -33,7 +33,14 @@
*/ */
void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) {
if(client->status == WSC_CONNECTED && code) { if(client->status == WSC_CONNECTED && code) {
if(reason) {
sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen);
} else {
uint8_t buffer[2];
buffer[0] = ((code >> 8) & 0xFF);
buffer[1] = (code & 0xFF);
sendFrame(client, WSop_close, &buffer[0], 2);
}
} }
clientDisconnect(client); clientDisconnect(client);
} }
@ -171,6 +178,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
if(!readWait(client, payload, payloadLen)) { if(!readWait(client, payload, payloadLen)) {
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] missing data!\n", client->num); DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] missing data!\n", client->num);
free(payload);
clientDisconnect(client, 1002); clientDisconnect(client, 1002);
return; return;
} }
@ -183,10 +191,12 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
payload[i] = (payload[i] ^ maskKey[i % 4]); payload[i] = (payload[i] ^ maskKey[i % 4]);
} }
} }
}
switch(opCode) { switch(opCode) {
case WSop_text: case WSop_text:
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload); DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload)
;
// no break here! // no break here!
case WSop_binary: case WSop_binary:
messageRecived(client, opCode, payload, payloadLen); messageRecived(client, opCode, payload, payloadLen);
@ -196,12 +206,22 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
sendFrame(client, WSop_pong, payload, payloadLen); sendFrame(client, WSop_pong, payload, payloadLen);
break; break;
case WSop_pong: case WSop_pong:
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload); DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload)
;
break; break;
case WSop_close: case WSop_close:
{ {
uint16_t reasonCode = buffer[0] << 8 | buffer[1]; uint16_t reasonCode = 1000;
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] client ask for close. Code: %d (%s)\n", client->num, reasonCode, (payload + 2)); if(payloadLen >= 2) {
reasonCode = payload[0] << 8 | payload[1];
}
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] client ask for close. Code: %d", client->num, reasonCode);
if(payloadLen > 2) {
DEBUG_WEBSOCKETS("(%s)\n", (payload+2));
} else {
DEBUG_WEBSOCKETS("\n");
}
clientDisconnect(client, 1000); clientDisconnect(client, 1000);
} }
break; break;
@ -213,6 +233,9 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
clientDisconnect(client, 1002); clientDisconnect(client, 1002);
break; break;
} }
if(payload) {
free(payload);
} }
} }

View File

@ -102,7 +102,7 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length) {
} }
void WebSocketsServer::sendTXT(uint8_t num, String payload) { void WebSocketsServer::sendTXT(uint8_t num, String payload) {
sendTXT(num, (uint8_t *)payload.c_str(), payload.length()); sendTXT(num, (uint8_t *) payload.c_str(), payload.length());
} }
/** /**
@ -120,9 +120,8 @@ void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length) {
} }
} }
void WebSocketsServer::broadcastTXT(String payload) { void WebSocketsServer::broadcastTXT(String payload) {
broadcastTXT((uint8_t *)payload.c_str(), payload.length()); broadcastTXT((uint8_t *) payload.c_str(), payload.length());
} }
/** /**
@ -311,7 +310,7 @@ void WebSocketsServer::handleHeader(WSclient_t * client) {
if(headerLine.length() > 0) { if(headerLine.length() > 0) {
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str());
// websocket request starts allway with GET see rfc6455 // websocket request starts allways with GET see rfc6455
if(headerLine.startsWith("GET ")) { if(headerLine.startsWith("GET ")) {
// cut URL out // cut URL out
client->cUrl = headerLine.substring(4, headerLine.indexOf(' ', 4)); client->cUrl = headerLine.substring(4, headerLine.indexOf(' ', 4));
@ -337,7 +336,13 @@ void WebSocketsServer::handleHeader(WSclient_t * client) {
} else { } else {
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num);
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade);DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket);DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str());
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade);
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket);
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str());
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str());
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str());
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion);
bool ok = (client->cIsUpgrade && client->cIsWebsocket); bool ok = (client->cIsUpgrade && client->cIsWebsocket);