Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
    npro  
 Modern all-safe Rust Network Protocol library supporting h1, h2, h3, ws, wt sans-IO and with socket IO + tls
git clone https://npro.rs/repo/npro
 
root / CMakeLists.txt
Author[]google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.c...> 2025-12-27 12:03 UTC
Committer[]Andy Green <andy@warmcat.com> 2025-12-27 12:03 UTC
Treeba506ad7c7448e807bdb7726e227fd079f30f298   Raw Patch
 
Debug logging and fragmentation fix for PCON control
Debug logging and fragmentation fix for PCON control

- Fix critical Use-After-Free in `sais_power_rx` (`s-power.c`) when handling fragmented energy reports by returning early on `LEJP_CONTINUE`.
- Add `lwsl_warn` logging to `w-ws-browser.c`, `s-ws-web.c`, `p-ws-server.c`, and `p-sai.c` to trace `pcon_control` message flow.
- Add error checking for queueing `pcon_control` messages in `w-ws-browser.c`.
- Ensure consistent schema usage for `pcon_control` across components.
diff --git a/src/power/p-sai.c b/src/power/p-sai.c index 2bd5c67..1bb887b 100644 --- a/src/power/p-sai.c +++ b/src/power/p-sai.c @@ -213,14 +213,17 @@ sul_pcon_check_cb(lws_sorted_usec_list_t *sul) /* Rule 2: User Keep On -> Turn ON */ if (pc->user_keep_on) { target_on = 1; - lwsl_info("%s: PCON %s has user keep on -> Force ON\n", __func__, pc->name); + lwsl_warn("%s: PCON %s has user keep on -> Force ON\n", __func__, pc->name); } /* Rule 3: Server Requested -> Turn ON */ else if (pc->server_requested_on) { target_on = 1; - lwsl_info("%s: PCON %s has server request -> Force ON\n", __func__, pc->name); + lwsl_warn("%s: PCON %s has server request -> Force ON\n", __func__, pc->name); } + lwsl_info("%s: PCON %s check: target=%d, current=%d (user=%d, srv=%d)\n", + __func__, pc->name, target_on, pc->on, pc->user_keep_on, pc->server_requested_on); + /* If we decide it should be ON, trigger it */ if (target_on && !pc->on) { lwsl_notice("%s: PCON %s ON (target=1, current=%d)\n", __func__, pc->name, pc->on); diff --git a/src/power/p-ws-server.c b/src/power/p-ws-server.c index 2474268..e1228b8 100644 --- a/src/power/p-ws-server.c +++ b/src/power/p-ws-server.c @@ -212,8 +212,11 @@ saip_m_rx(void *userobj, const uint8_t *buf, size_t len, int flags) sai_pcon_control_t *ctl = (sai_pcon_control_t *)a.dest; saip_pcon_t *pc = saip_pcon_by_name(&power, ctl->pcon_name); + lwsl_warn("%s: RX PCON Control '%s' -> %d\n", __func__, ctl->pcon_name, ctl->on); + if (pc) { - lwsl_notice("%s: PCON Control '%s' -> %d\n", __func__, pc->name, ctl->on); + lwsl_warn("%s: Applying PCON Control '%s' -> %d (prev user_keep_on=%d)\n", + __func__, pc->name, ctl->on, pc->user_keep_on); pc->user_keep_on = ctl->on; if (ctl->on) { saip_switch(pc, 1); diff --git a/src/server/s-power.c b/src/server/s-power.c index d222188..049efc3 100644 --- a/src/server/s-power.c +++ b/src/server/s-power.c @@ -353,6 +353,10 @@ passthru: free(p); } + + if (n == LEJP_CONTINUE) + return 0; + break; default: lwsl_warn("%s: unknown schema\n", __func__); diff --git a/src/server/s-ws-web.c b/src/server/s-ws-web.c index 5cdfde7..bc20a07 100644 --- a/src/server/s-ws-web.c +++ b/src/server/s-ws-web.c @@ -480,8 +480,9 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags) case SAIS_WS_WEBSRV_RX_PCON_CONTROL: { sai_pcon_control_t *ctl = (sai_pcon_control_t *)a.dest; + int count = 0; - lwsl_notice("%s: pcon control received from web: %s -> %d\n", + lwsl_warn("%s: pcon control received from web: '%s' -> %d\n", __func__, ctl->pcon_name, ctl->on); lws_start_foreach_dll(struct lws_dll2 *, p, @@ -494,10 +495,15 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags) *s = *ctl; lws_dll2_add_tail(&s->list, &pss_power->pcon_control_owner); lws_callback_on_writable(pss_power->wsi); - lwsl_wsi_notice(pss_power->wsi, "queued pcon control on power conn"); - } + lwsl_wsi_warn(pss_power->wsi, "queued pcon control on power conn"); + count++; + } else + lwsl_err("%s: OOM queuing control\n", __func__); } lws_end_foreach_dll(p); + if (!count) + lwsl_warn("%s: No sai-power connections found to forward control to!\n", __func__); + lwsac_free(&a.ac); break; } diff --git a/src/web/w-ws-browser.c b/src/web/w-ws-browser.c index c41b8a3..bc3f33a 100644 --- a/src/web/w-ws-browser.c +++ b/src/web/w-ws-browser.c @@ -684,12 +684,16 @@ saiw_ws_json_rx_browser(struct vhd *vhd, struct pss *pss, uint8_t *buf, lwsl_err("%s: pcon control didn't like auth\n", __func__); goto auth_error; } - lwsl_notice("%s: web: received pcon control req\n", __func__); + lwsl_warn("%s: web: received pcon control req (len %d)\n", __func__, (int)bl); /* Forward to sai-server via websrv link */ - sai_ss_queue_frag_on_buflist_REQUIRES_LWS_PRE(vhd->h_ss_websrv, + if (sai_ss_queue_frag_on_buflist_REQUIRES_LWS_PRE(vhd->h_ss_websrv, &((saiw_websrv_t *)lws_ss_to_user_object(vhd->h_ss_websrv))->wbltx, - buf, bl, ss_flags); + buf, bl, ss_flags)) + lwsl_err("%s: failed to queue pcon control to server\n", __func__); + else + lwsl_warn("%s: queued pcon control to server OK\n", __func__); + goto ok; case SAIM_WS_BROWSER_RX_TASKREBUILDLASTSTEP:
Page fetched 0s ago, creation time: 4ms (vhost etag hits: 0%, cache hits: 0%)