summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2026-05-09 00:57:09 +0200
committerOliver Kiddle <opk@zsh.org>2026-05-10 22:09:07 +0200
commit1c19dac5c1524093ae0ccf96a9763cbd10465163 (patch)
treead8a2c4e6e06f80638e34866936e6fa1340cbbb1
parent54486: fix reading outside string issue reported by valgrind (diff)
downloadzsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar.gz
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar.bz2
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar.lz
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar.xz
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.tar.zst
zsh-1c19dac5c1524093ae0ccf96a9763cbd10465163.zip
54506: fix checking of dash following the prefix in terminal extensions
-rw-r--r--ChangeLog3
-rw-r--r--Src/Zle/termquery.c31
2 files changed, 20 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a355bd2b..935ad92b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2026-05-10 Oliver Kiddle <opk@zsh.org>
+ * 54506: Src/Zle/termquery.c: fix checking of dash following
+ the prefix in terminal extensions
+
* 54486: Doc/Zsh/zle.yo, Src/Zle/termquery.c: fix reading
outside string issue reported by valgrind
diff --git a/Src/Zle/termquery.c b/Src/Zle/termquery.c
index aefc495f3..983f2d622 100644
--- a/Src/Zle/termquery.c
+++ b/Src/Zle/termquery.c
@@ -659,16 +659,17 @@ system_clipput(char clip, char *content, size_t clen)
/**/
static int
-extension_enabled(const char *class, const char *ext, unsigned clen, int def)
+extension_enabled(const char *prefix, const char *ext, unsigned plen, int def)
{
- char **e, **elist = getaparam(EXTVAR);
+ char dash, **e, **elist = getaparam(EXTVAR);
for (e = elist; e && *e; e++) {
int negate = (**e == '-');
- if (strncmp(*e + negate, class, clen))
+ if (strncmp(*e + negate, prefix, plen))
continue;
- if (!*(*e + negate + clen) || !strcmp(*e + negate + clen + 1, ext))
+ if (!(dash = *(*e + negate + plen)) ||
+ (dash == '-' && !strcmp(*e + negate + plen + 1, ext)))
return !negate;
}
return def;
@@ -677,7 +678,7 @@ extension_enabled(const char *class, const char *ext, unsigned clen, int def)
struct extension {
char *key, *seq[2];
- int class, enabled;
+ int prefix, enabled;
};
static const struct extension editext[] = {
@@ -707,11 +708,11 @@ collate_seq(int sindex, int dir)
int negate = (**e == '-');
if (negate != enabled)
continue;
- if ((!editext[i].class ||
- !strncmp(*e + negate, editext[i].key, editext[i].class)) &&
- ((editext[i].class && !*(*e + negate + editext[i].class)) ||
- !strcmp(*e + negate + editext[i].class,
- editext[i].key + editext[i].class)))
+ if ((!editext[i].prefix ||
+ !strncmp(*e + negate, editext[i].key, editext[i].prefix)) &&
+ ((editext[i].prefix && !*(*e + negate + editext[i].prefix)) ||
+ !strcmp(*e + negate + editext[i].prefix,
+ editext[i].key + editext[i].prefix)))
{
enabled = !negate;
break;
@@ -906,12 +907,14 @@ zle_set_cursorform(void)
}
}
- if (!setup || trashedzle) {
+ if (trashedzle)
+ setup = 0;
+ else if (!setup) {
cursor_enabled_mask = 0;
setup = 1;
- if (!extension_enabled("cursor", "shape", 6, 1))
+ if (extension_enabled("cursor", "shape", 6, 1))
cursor_enabled_mask |= CURF_SHAPE_MASK | CURF_BLINK | CURF_STEADY;
- if (!extension_enabled("cursor", "color", 6, 1))
+ if (extension_enabled("cursor", "color", 6, 1))
cursor_enabled_mask |= CURF_COLOR_MASK;
}
}
@@ -953,7 +956,7 @@ cursor_form(void)
} else
context = invicmdmode() ? CURC_COMMAND : (vichgflag ? CURC_INSERT : CURC_EDIT);
want = (context == CURC_DEFAULT) ? CURF_DEFAULT : cursor_forms[context];
- if (!(changed = (want ^ state) & ~cursor_enabled_mask))
+ if (!(changed = (want ^ state) & cursor_enabled_mask))
return;
if (changed & CURF_HIDDEN)