[PATCH] Use realparamtab and don't dereference special parameters in zle code
Philippe Altherr <[email protected]> Fri, 19 Jun 2026 01:55:57 +0200
| Newsgroups | gmane.comp.shells.zsh.devel |
|---|---|
| Message-ID | <CAGdYchuj-=WwyprQGo-V9k2KY4hNW_dN0L7qHHmmtsJRAcry6A@mail.gmail.com> |
- Use realparamtab and don't dereference special parameters in zle code <https://github.com/zsh-users/zsh/compare/master...paltherr:zsh:use-realparamtab-in-zle> Philippe
use-realparamtab-in-zle.txt
(text/plain, 6.5 KB)
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index ce39db211..c33578a12 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -3661,7 +3661,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
dumphashtable(cmdnamtab, -3);
/* And parameter names if autocd and cdablevars are set. */
if (isset(AUTOCD) && isset(CDABLEVARS))
- dumphashtable(paramtab, -4);
+ dumphashtable(realparamtab, -4);
}
oaw = addwhat = (cc->mask & CC_QUOTEFLAG) ? -2 : CC_QUOTEFLAG;
@@ -3673,7 +3673,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
dumphashtable(optiontab, addwhat);
if (cc->mask & CC_VARS) {
/* And parameter names. */
- dumphashtable(paramtab, -9);
+ dumphashtable(realparamtab, -9);
addwhat = oaw;
}
if (cc->mask & CC_BINDINGS) {
@@ -3840,7 +3840,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
if ((t = cc->mask & (CC_ARRAYS | CC_INTVARS | CC_ENVVARS | CC_SCALARS |
CC_READONLYS | CC_SPECIALS | CC_PARAMS)))
/* Add various flavours of parameters. */
- dumphashtable(paramtab, t);
+ dumphashtable(realparamtab, t);
if ((t = cc->mask & CC_SHFUNCS))
/* Add shell functions. */
dumphashtable(shfunctab, t | (cc->mask & (CC_DISCMDS|CC_EXCMDS)));
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index 4bc048776..34387b776 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1307,15 +1307,14 @@ addcompparams(struct compparam *cp, Param *pp)
Param pm = createparam(cp->name,
cp->type |PM_SPECIAL|PM_REMOVABLE|PM_LOCAL);
if (!pm)
- pm = (Param) paramtab->getnode(paramtab, cp->name);
- DPUTS(!pm, "param not set in addcompparams");
+ pm = (Param) paramtab->getnode2(paramtab, cp->name);
+ DPUTS1(!pm, "param %s not set in addcompparams", cp->name);
*pp = pm;
pm->level = locallevel + 1;
if ((pm->u.data = cp->var)) {
switch(PM_TYPE(cp->type)) {
case PM_SCALAR:
- case PM_NAMEREF:
pm->gsu.s = &compvarscalar_gsu;
break;
case PM_INTEGER:
@@ -1340,23 +1339,21 @@ void
makecompparams(void)
{
Param cpm;
- HashTable tht;
addcompparams(comprparams, comprpms);
if (!(cpm = createparam(
COMPSTATENAME,
PM_SPECIAL|PM_REMOVABLE|PM_SINGLE|PM_LOCAL|PM_HASHED)))
- cpm = (Param) paramtab->getnode(paramtab, COMPSTATENAME);
- DPUTS(!cpm, "param not set in makecompparams");
+ cpm = (Param) realparamtab->getnode2(realparamtab, COMPSTATENAME);
+ DPUTS1(!cpm, "param %s not set in makecompparams", COMPSTATENAME);
comprpms[CPN_COMPSTATE] = cpm;
- tht = paramtab;
cpm->level = locallevel + 1;
cpm->gsu.h = &compstate_gsu;
cpm->u.hash = paramtab = newparamtable(31, COMPSTATENAME);
addcompparams(compkparams, compkpms);
- paramtab = tht;
+ paramtab = realparamtab;
}
/**/
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index f7d74ec7a..e8a6b6422 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1082,7 +1082,7 @@ do_single(Cmatch m)
} else
n = p + 1;
- if ((pm = (Param) paramtab->getnode(paramtab, n)) &&
+ if ((pm = (Param) realparamtab->getnode(realparamtab, n)) &&
PM_TYPE(pm->node.flags) != PM_SCALAR)
tryit = 0;
}
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 37d587d02..c2b592490 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1867,7 +1867,7 @@ bin_vared(char *name, char **args, Options ops, UNUSED(int func))
createparam(args[0], type);
}
queue_signals();
- pm = (Param) paramtab->getnode(paramtab, args[0]);
+ pm = (Param) realparamtab->getnode(realparamtab, args[0]);
if (pm && (PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED))) {
char **a;
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 6ac7d4f0a..b828e145c 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -200,14 +200,13 @@ makezleparams(int ro)
Param pm = createparam(zp->name, (zp->type |PM_SPECIAL|PM_REMOVABLE|
PM_LOCAL|(ro ? PM_READONLY : 0)));
if (!pm)
- pm = (Param) paramtab->getnode(paramtab, zp->name);
- DPUTS(!pm, "param not set in makezleparams");
+ pm = (Param) realparamtab->getnode2(realparamtab, zp->name);
+ DPUTS1(!pm, "param %s not set in makezleparams", zp->name);
pm->level = locallevel + 1;
pm->u.data = zp->data;
switch(PM_TYPE(zp->type)) {
case PM_SCALAR:
- case PM_NAMEREF:
pm->gsu.s = zp->gsu;
break;
case PM_ARRAY:
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 94e67f838..7b1ef79ad 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -683,7 +683,8 @@ bin_zle_flags(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
if (invicmdmode()) {
startvichange(-1);
if (zmod.flags & (MOD_MULT|MOD_TMULT)) {
- Param pm = (Param) paramtab->getnode(paramtab, "NUMERIC");
+ Param pm = (Param)
+ realparamtab->getnode2(realparamtab, "NUMERIC");
if (pm && pm->node.flags & PM_SPECIAL)
pm->node.flags &= ~PM_UNSET;
}
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 3e46acdab..8f8776da3 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -437,8 +437,8 @@ checkparams(char *p)
int t0, n, l = strlen(p), e = 0;
struct hashnode *hn;
- for (t0 = paramtab->hsize - 1, n = 0; n < 2 && t0 >= 0; t0--)
- for (hn = paramtab->nodes[t0]; n < 2 && hn; hn = hn->next)
+ for (t0 = realparamtab->hsize - 1, n = 0; n < 2 && t0 >= 0; t0--)
+ for (hn = realparamtab->nodes[t0]; n < 2 && hn; hn = hn->next)
if (pfxlen(p, hn->nam) == l) {
n++;
if ((int)strlen(hn->nam) == l)
@@ -1512,7 +1512,8 @@ get_comp_string(void)
zlemetacs_qsub - wb) {
s = NULL;
inwhat = IN_MATH;
- if ((keypm = (Param) paramtab->getnode(paramtab, varname)) &&
+ if ((keypm = (Param)
+ realparamtab->getnode(realparamtab, varname)) &&
(keypm->node.flags & PM_HASHED))
insubscr = 2;
else
@@ -1612,7 +1613,8 @@ get_comp_string(void)
zsfree(varname);
varname = ztrdup(nb);
*ne = sav;
- if ((keypm = (Param) paramtab->getnode(paramtab, varname)) &&
+ if ((keypm = (Param)
+ realparamtab->getnode(realparamtab, varname)) &&
(keypm->node.flags & PM_HASHED))
insubscr = 2;
}
@@ -1693,7 +1695,8 @@ get_comp_string(void)
if (wptr < sqbr) {
zsfree(varname);
varname = ztrduppfx(wptr, sqbr - wptr);
- if ((keypm = (Param) paramtab->getnode(paramtab, varname)) &&
+ if ((keypm = (Param)
+ realparamtab->getnode(realparamtab, varname)) &&
(keypm->node.flags & PM_HASHED)) {
if (insubscr != 3)
insubscr = 2;