mirror of
https://github.com/espressif/esp-idf.git
synced 2024-09-20 00:36:01 -04:00
fix(ws_transport): fixed server-key
corruption
When first fragment is sent over HTTP during websocket
connection, defer buffering of fragment until after the
websocket server-key is validated.
This order is required because the first fragment buffering
overwrites the memory holding the server-key headers.
Fixes 2267d4b
Fixes https://github.com/espressif/esp-protocols/issues/396
PR https://github.com/espressif/esp-idf/pull/13724
This commit is contained in:
parent
5d8bb1c72a
commit
c42cfe1818
@ -307,20 +307,6 @@ static int ws_connect(esp_transport_handle_t t, const char *host, int port, int
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delim_ptr != NULL) {
|
|
||||||
size_t delim_pos = delim_ptr - ws->buffer + sizeof(delimiter) - 1;
|
|
||||||
size_t remaining_len = ws->buffer_len - delim_pos;
|
|
||||||
if (remaining_len > 0) {
|
|
||||||
memmove(ws->buffer, ws->buffer + delim_pos, remaining_len);
|
|
||||||
ws->buffer_len = remaining_len;
|
|
||||||
} else {
|
|
||||||
#ifdef CONFIG_WS_DYNAMIC_BUFFER
|
|
||||||
free(ws->buffer);
|
|
||||||
ws->buffer = NULL;
|
|
||||||
#endif
|
|
||||||
ws->buffer_len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// See esp_crypto_sha1() arg size
|
// See esp_crypto_sha1() arg size
|
||||||
unsigned char expected_server_sha1[20];
|
unsigned char expected_server_sha1[20];
|
||||||
// Size of base64 coded string see above
|
// Size of base64 coded string see above
|
||||||
@ -340,6 +326,22 @@ static int ws_connect(esp_transport_handle_t t, const char *host, int port, int
|
|||||||
ESP_LOGE(TAG, "Invalid websocket key");
|
ESP_LOGE(TAG, "Invalid websocket key");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delim_ptr != NULL) {
|
||||||
|
size_t delim_pos = delim_ptr - ws->buffer + sizeof(delimiter) - 1;
|
||||||
|
size_t remaining_len = ws->buffer_len - delim_pos;
|
||||||
|
if (remaining_len > 0) {
|
||||||
|
memmove(ws->buffer, ws->buffer + delim_pos, remaining_len);
|
||||||
|
ws->buffer_len = remaining_len;
|
||||||
|
} else {
|
||||||
|
#ifdef CONFIG_WS_DYNAMIC_BUFFER
|
||||||
|
free(ws->buffer);
|
||||||
|
ws->buffer = NULL;
|
||||||
|
#endif
|
||||||
|
ws->buffer_len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user