about summary refs log tree commit diff
path: root/Src/builtin.c
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2023-02-13 18:20:11 -0800
committerBart Schaefer <schaefer@zsh.org>2023-02-13 18:20:11 -0800
commit03887bb03fbca246fa94b5b5f2266572c0b6d038 (patch)
tree70ed74a1c4ef766d64dae4574f722f3bc87f6818 /Src/builtin.c
parentf4c706f0c84bddb7777d38635c4ba1d43703e2e5 (diff)
downloadzsh-03887bb03fbca246fa94b5b5f2266572c0b6d038.tar.gz
zsh-03887bb03fbca246fa94b5b5f2266572c0b6d038.tar.xz
zsh-03887bb03fbca246fa94b5b5f2266572c0b6d038.zip
51430: Misc. problems with typeset and $parameters
* Fix and test for regression of assignment when using typeset command
* Fix output of typeset +m and $parameters[ref]
* Prevent segfault in typeset
Diffstat (limited to 'Src/builtin.c')
-rw-r--r--Src/builtin.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index cf7e9d9fe..47b337edc 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2262,8 +2262,9 @@ typeset_single(char *cname, char *pname, Param pm, int func,
 	     */
 	    if (!(on & PM_READONLY) || !isset(POSIXBUILTINS))
 		off |= PM_UNSET;
-	    pm->node.flags = (pm->node.flags |
-			      (on & ~PM_READONLY)) & ~off;
+	    if (!OPT_ISSET(ops, 'p'))
+		pm->node.flags = (pm->node.flags |
+				  (on & ~PM_READONLY)) & ~off;
 	}
 	if (on & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) {
 	    if (typeset_setwidth(cname, pm, ops, on, 0))
@@ -3063,12 +3064,15 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	    if (asg->value.scalar &&
 		((pm = (Param)resolve_nameref((Param)hn, asg)) &&
 		 (pm->node.flags & PM_NAMEREF))) {
-		if (pm->node.flags & PM_SPECIAL)
+		if (pm->node.flags & PM_SPECIAL) {
 		    zwarnnam(name, "%s: invalid reference", pm->node.nam);
-		else
+		    returnval = 1;
+		    continue;
+		} else if (pm->u.str && strcmp(pm->u.str, asg->name) == 0) {
 		    zwarnnam(name, "%s: invalid self reference", asg->name);
-		returnval = 1;
-		continue;
+		    returnval = 1;
+		    continue;
+		}
 	    }
 	    if (hn) {
 		/* namerefs always start over fresh */