Skip to content

mwan3: prevent NaN in rpcd status for empty state files - #30800

Open
ZyPulse-zy wants to merge 1 commit into
openwrt:masterfrom
ZyPulse-zy:fix/mwan3-finite-status
Open

ZyPulse-zy wants to merge 1 commit into
openwrt:masterfrom
ZyPulse-zy:fix/mwan3-finite-status

Conversation

@ZyPulse-zy

@ZyPulse-zy ZyPulse-zy commented Oct 17, 2026 •

Copy link
Copy Markdown

An empty mwan3track state file reaches int('') in get_int() and becomes NaN. The value then propagates into interface age, counters or tracked-IP metrics in the rpcd response, breaking JSON consumers such as LuCI's batched status request.

Default failed integer conversions to zero, restoring the previous shell handler's empty-state behavior. Add a package regression that loads the installed rpcd implementation with isolated filesystem, UCI and ubus fixtures. Bump the package release.

Fixes #29653. Maintainer: @feckert.

Validation:

  • Actual ucode interpreter: the original plugin fails on the empty-file age case; the fixed plugin passes all 63 checks (missing, empty, newline-only, invalid, zero and valid numeric state; time/counter fields and tracked-IP metrics).
  • Built mwan3-2.12.2-r3.apk in a separate AArch64/musl OpenWrt SDK and reran the regression against the plugin extracted from that package: 63 checks passed.
  • Shell syntax checks with dash and BusyBox ash, and git diff --check, passed.

Runtime tests use fixtures for external I/O; a live ubus daemon and router deployment were not used. AI assistance was used for implementation and test development.

  • Reviewed CONTRIBUTING.md.

Checker follow-up: the current Makefile formality finding confuses the extensionless rpcd plugin with its same-named UCI sibling. The Makefile and extracted APK install the plugin under /usr/share/rpcd/ucode/. The source-path inference fix is proposed in openwrt/openwrt-bot-worker#122, with a reproduction using this actual Makefile, 10 regression cases and 753 passing tests.

An empty mwan3track state file converts to NaN in get_int(). This
propagates through get_x_time() and the interface status payload,
allowing invalid numeric values in RPC replies during startup or
partial state updates.

Default failed integer conversions to zero, preserving the previous
shell handler's empty-state behavior. Cover all integer/time fields
and tracked-IP metrics by loading the installed rpcd implementation
with isolated filesystem, UCI and ubus fixtures in the package test.

Fixes: openwrt#29653
Signed-off-by: Yuen Su <zypulsecore@gmail.com>
Copilot AI balanced review requested due to automatic review settings October 17, 2026 15:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@openwrt

openwrt Bot commented Oct 17, 2026

Copy link
Copy Markdown

Formality Check: Failed

We checked this pull request against the contribution guidelines. Here is what needs your attention:

🛑 CRITICAL ERRORS

Commit 641c469 - mwan3: keep rpcd integer status fields numeric for empty state:

  • File 'net/mwan3/files/usr/share/rpcd/ucode/mwan3' is destined for '/etc/config/' but is not a valid UCI configuration file. In OpenWrt, '/etc/config/' is reserved for UCI-formatted configuration files. Raw files (such as TOML, JSON, or YAML) are not allowed at this path. Invalid line 1: ''use strict';'

Tip

Do not close this pull request to make corrections. Instead, modify your existing commits (e.g. git commit --amend) and update the branch using git push --force-with-lease --force-if-includes. The checks will re-run automatically.


Something broken? Consider reporting an issue.
Running version 37cc78e deployed on 2026-10-15 12:36:36 CEST

github-actions Bot pushed a commit to ZyPulse-zy/openwrt-bot-worker that referenced this pull request Oct 17, 2026
An extensionless rpcd payload and its UCI configuration can share the
same basename. Matching all lines containing that basename includes
the sibling's conffiles entry and falsely rejects the payload as UCI.

Resolve explicit install commands by the package-relative source
path, joining continued recipe lines before inspecting their literal
package-root destination. Keep the existing fallback when the
destination cannot be resolved, and retain validation when a source
also installs into etc/config.

Reproduces the false positive on openwrt/packages#30800. Add ten
regression cases for same-name siblings, continuations, quoting,
source boundaries, unknown destinations and config installations.

Signed-off-by: Yuen Su <zypulsecore@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mwan3: rpcd ucode status handler emits invalid JSON ("age": nan) for online interface, breaking LuCI Status Overview

2 participants