Fix oversized ws frame handling and increase receive buffers
This commit is contained in:
@@ -1292,7 +1292,7 @@ cJSON** nostr_relay_pool_query_sync(
|
||||
for (int i = 0; i < connected_count; i++) {
|
||||
relay_connection_t* relay = connected_relays[i];
|
||||
|
||||
char buffer[8192];
|
||||
char buffer[65536];
|
||||
int len = nostr_ws_receive(relay->ws_client, buffer, sizeof(buffer) - 1, 100);
|
||||
if (len > 0) {
|
||||
buffer[len] = '\0';
|
||||
@@ -1902,7 +1902,7 @@ int nostr_relay_pool_poll(nostr_relay_pool_t* pool, int timeout_ms) {
|
||||
check_connection_health(relay);
|
||||
|
||||
// Process incoming messages
|
||||
char buffer[8192];
|
||||
char buffer[65536];
|
||||
int timeout_per_relay = timeout_ms / pool->relay_count;
|
||||
|
||||
int len = nostr_ws_receive(relay->ws_client, buffer, sizeof(buffer) - 1, timeout_per_relay);
|
||||
|
||||
@@ -915,11 +915,6 @@ static int ws_receive_frame(nostr_ws_client_t* client, ws_opcode_t* opcode, char
|
||||
header_len = 10;
|
||||
}
|
||||
|
||||
// Check payload length
|
||||
if (len > *payload_len) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Read mask (if present)
|
||||
uint32_t mask = 0;
|
||||
if (masked) {
|
||||
@@ -932,6 +927,21 @@ static int ws_receive_frame(nostr_ws_client_t* client, ws_opcode_t* opcode, char
|
||||
header[header_len + 3];
|
||||
header_len += 4;
|
||||
}
|
||||
|
||||
// Check payload length; if too large for caller buffer, drain frame to keep stream aligned
|
||||
if (len > *payload_len) {
|
||||
char discard[1024];
|
||||
uint64_t remaining = len;
|
||||
while (remaining > 0) {
|
||||
size_t chunk = remaining > sizeof(discard) ? sizeof(discard) : (size_t)remaining;
|
||||
int got = client->transport->recv(&client->transport_ctx, discard, chunk, timeout_ms);
|
||||
if (got <= 0) {
|
||||
return -1;
|
||||
}
|
||||
remaining -= (uint64_t)got;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Read payload
|
||||
if (len > 0) {
|
||||
|
||||
Reference in New Issue
Block a user