Hi Naveen,

On 7/8/26 4:33 PM, Naveen Kumar Chaudhary wrote:
The '/' and '%' arms of the operator switch in do_setexpr() perform
a / b and a % b directly on the user-supplied ulongs with no check
that b is non-zero. The consequences are architecture-dependent:

   - On x86 and sandbox, integer divide-by-zero raises an exception
     (#DE / SIGFPE) which aborts the shell.
   - On arm64, arm, and RISC-V, the UDIV/SDIV instructions are defined
     to return 0 on a zero divisor and do not trap, so 'setexpr x 10
     / 0' silently succeeds and stores 0 into the environment
     variable, which is a plausible-looking but garbage result.

Neither behaviour is acceptable for a scripting primitive. Check b
before dividing and print a clear error, returning failure so
scripts can detect it.

++++++ Before Fix ++++++++
=> setexpr x 0xa / 0
=> printenv x
x=0

++++++ After Fix +++++++++
=> setexpr x 0xa / 0
Error: division by zero
=> setexpr x 0xa % 0
Error: modulo by zero
=>
Signed-off-by: Naveen Kumar Chaudhary <[email protected]>

Makes sense to me, though we definitely need new tests for those, c.f.
test/cmd/setexpr.c, so we don't regress in the future.

Cheers,
Quentin

Reply via email to