diff --git a/nostr_core/core_relay_pool.c b/nostr_core/core_relay_pool.c index 65d85937..67297fcd 100644 --- a/nostr_core/core_relay_pool.c +++ b/nostr_core/core_relay_pool.c @@ -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); diff --git a/nostr_websocket/nostr_websocket_openssl.c b/nostr_websocket/nostr_websocket_openssl.c index e4a8a8af..5eff3ea5 100644 --- a/nostr_websocket/nostr_websocket_openssl.c +++ b/nostr_websocket/nostr_websocket_openssl.c @@ -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) {