diff options
| author | Your Name <you@example.com> | 2026-05-18 14:02:55 +0530 |
|---|---|---|
| committer | Your Name <you@example.com> | 2026-05-18 14:02:55 +0530 |
| commit | 36fa7451a3be1c49932e944859364fe4e9f9fcc4 (patch) | |
| tree | e2d6bd781add57d44940137c6b6ef6c8aa35f5de /main/cvm_server.c | |
| parent | 8a2f7a6c9423e0c00fae3c1233bee9e0bb3ae239 (diff) | |
fix: EVENT msg buffer underflow + WS write loop + WPA3 auth
- Fix buffer size for ["EVENT",...] wrapper: was 8+event_len+1,
needed 10+event_len+2 (9 char prefix + ] + null). snprintf was
truncating the closing bracket, causing relay JSON parse errors.
- Add write loop in ws_send_text for large payloads that don't fit
in a single esp_tls_conn_write call.
- Change STA auth threshold from WPA2_PSK to WPA3_PSK for
compatibility with WPA3 access points.
- Announcements now successfully stored on relay.primal.net!
Diffstat (limited to 'main/cvm_server.c')
| -rw-r--r-- | main/cvm_server.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/main/cvm_server.c b/main/cvm_server.c index cf052df..dd04047 100644 --- a/main/cvm_server.c +++ b/main/cvm_server.c | |||
| @@ -100,9 +100,24 @@ static int ws_send_text(esp_tls_t *tls, const char *msg) | |||
| 100 | frame[pos + i] = (uint8_t)msg[i] ^ mask[i & 3]; | 100 | frame[pos + i] = (uint8_t)msg[i] ^ mask[i & 3]; |
| 101 | pos += len; | 101 | pos += len; |
| 102 | 102 | ||
| 103 | int w = esp_tls_conn_write(tls, frame, pos); | 103 | int total = pos; |
| 104 | int written = 0; | ||
| 105 | while (written < total) { | ||
| 106 | int w = esp_tls_conn_write(tls, frame + written, total - written); | ||
| 107 | if (w < 0) { | ||
| 108 | ESP_LOGE(TAG, "ws_send: write failed at %d/%d", written, total); | ||
| 109 | free(frame); | ||
| 110 | return -1; | ||
| 111 | } | ||
| 112 | if (w == 0) { | ||
| 113 | ESP_LOGW(TAG, "ws_send: write returned 0 at %d/%d", written, total); | ||
| 114 | vTaskDelay(pdMS_TO_TICKS(1)); | ||
| 115 | } | ||
| 116 | written += w; | ||
| 117 | } | ||
| 118 | ESP_LOGD(TAG, "ws_send: sent %d bytes (payload %d)", total, (int)len); | ||
| 104 | free(frame); | 119 | free(frame); |
| 105 | return w > 0 ? 0 : -1; | 120 | return 0; |
| 106 | } | 121 | } |
| 107 | 122 | ||
| 108 | static esp_err_t ws_connect(const char *relay_url, esp_tls_t **tls_out) | 123 | static esp_err_t ws_connect(const char *relay_url, esp_tls_t **tls_out) |
| @@ -292,7 +307,7 @@ static esp_err_t publish_event_to_relay(const char *relay_url, const char *event | |||
| 292 | 307 | ||
| 293 | char *msg; | 308 | char *msg; |
| 294 | size_t event_len2 = strlen(event_json); | 309 | size_t event_len2 = strlen(event_json); |
| 295 | size_t msg_len2 = 8 + event_len2 + 1; | 310 | size_t msg_len2 = 10 + event_len2 + 2; |
| 296 | msg = malloc(msg_len2); | 311 | msg = malloc(msg_len2); |
| 297 | snprintf(msg, msg_len2, "[\"EVENT\",%s]", event_json); | 312 | snprintf(msg, msg_len2, "[\"EVENT\",%s]", event_json); |
| 298 | 313 | ||
| @@ -591,7 +606,7 @@ static esp_err_t publish_event_via_ws(esp_tls_t *tls, int kind, | |||
| 591 | 606 | ||
| 592 | char *msg; | 607 | char *msg; |
| 593 | size_t event_len = strlen(event_json); | 608 | size_t event_len = strlen(event_json); |
| 594 | size_t msg_len = 8 + event_len + 1; | 609 | size_t msg_len = 10 + event_len + 2; |
| 595 | msg = malloc(msg_len); | 610 | msg = malloc(msg_len); |
| 596 | snprintf(msg, msg_len, "[\"EVENT\",%s]", event_json); | 611 | snprintf(msg, msg_len, "[\"EVENT\",%s]", event_json); |
| 597 | 612 | ||