sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit a2940adeba5293032f6ceb7d218dc9f09d6de984
parent 40a4999b60355a8e498f1d228469aeca17f9a698
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Mon, 19 Jan 2026 18:49:42 +0100

dc: Don't trash val next pointer

When a value was assigned to a register using the 's'
command we were assigning the full value from execution
stack, overwriting the next pointer of the register
stack with the next pointer of the execution stack.

Diffstat:
Mdc.c | 6++++--
Atests/0048-dc.sh | 18++++++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/dc.c b/dc.c @@ -1541,6 +1541,7 @@ dupval(Val v) nv.u.n = copy(&zero); break; } + nv.next = NULL; return nv; } @@ -2057,9 +2058,10 @@ eval(void) break; case 's': rp = lookup(regname()); + v1 = pop(); freeval(rp->val); - rp->val.type = NVAL; - rp->val = pop(); + rp->val.u = v1.u; + rp->val.type = v1.type; break; case 'l': rp = lookup(regname()); diff --git a/tests/0048-dc.sh b/tests/0048-dc.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +tmp=$$.tmp + +trap 'rm -f $tmp' EXIT +trap 'exit $?' HUP INT TERM + +cat <<'EOF' > $tmp +1 +EOF + +$EXEC ../dc -i <<'EOF' | diff -u - $tmp +[Splp 1+dsps. 0 Lps. 1Q]s<1> + +1dsps. +lpl<1>xs. +lpps. +EOF