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:
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