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 | |
| 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!
| -rw-r--r-- | main/config.c | 4 | ||||
| -rw-r--r-- | main/cvm_server.c | 23 |
2 files changed, 21 insertions, 6 deletions
diff --git a/main/config.c b/main/config.c index 7c8ebed..6753f40 100644 --- a/main/config.c +++ b/main/config.c | |||
| @@ -54,7 +54,7 @@ esp_err_t tollgate_config_init(void) | |||
| 54 | const char *default_json = "{" | 54 | const char *default_json = "{" |
| 55 | "\"nsec\":\"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2\"," | 55 | "\"nsec\":\"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2\"," |
| 56 | "\"wifi_networks\":[" | 56 | "\"wifi_networks\":[" |
| 57 | "{\"ssid\":\"EnterSSID-2.4GHz\",\"password\":\"c03rad0r123!\"}" | 57 | "{\"ssid\":\"c03rad0r\",\"password\":\"c03rad0r123\"}" |
| 58 | "]," | 58 | "]," |
| 59 | "\"ap_password\":\"\"," | 59 | "\"ap_password\":\"\"," |
| 60 | "\"mint_url\":\"https://testnut.cashu.space\"," | 60 | "\"mint_url\":\"https://testnut.cashu.space\"," |
| @@ -288,7 +288,7 @@ esp_err_t tollgate_config_get_wifi(wifi_config_t *wifi_config) | |||
| 288 | memset(wifi_config, 0, sizeof(wifi_config_t)); | 288 | memset(wifi_config, 0, sizeof(wifi_config_t)); |
| 289 | strncpy((char *)wifi_config->sta.ssid, g_config.networks[idx].ssid, sizeof(wifi_config->sta.ssid) - 1); | 289 | strncpy((char *)wifi_config->sta.ssid, g_config.networks[idx].ssid, sizeof(wifi_config->sta.ssid) - 1); |
| 290 | strncpy((char *)wifi_config->sta.password, g_config.networks[idx].password, sizeof(wifi_config->sta.password) - 1); | 290 | strncpy((char *)wifi_config->sta.password, g_config.networks[idx].password, sizeof(wifi_config->sta.password) - 1); |
| 291 | wifi_config->sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; | 291 | wifi_config->sta.threshold.authmode = WIFI_AUTH_WPA3_PSK; |
| 292 | return ESP_OK; | 292 | return ESP_OK; |
| 293 | } | 293 | } |
| 294 | 294 | ||
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 | ||