summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorAxel Beckert <abe@deuxchevaux.org>2018-04-09 00:42:15 +0200
committerAxel Beckert <abe@deuxchevaux.org>2018-04-09 00:42:15 +0200
commitfe36c1ada77f817dbeeeed5ee70c7ba08eeb1d18 (patch)
tree0229967da5e73bd29a2d6014c847509b361f3631 /Src
parent1521c7d0f7e607b789564e819173e228e9475137 (diff)
parentf9e9dce5443f323b340303596406f9d3ce11d23a (diff)
downloadzsh-fe36c1ada77f817dbeeeed5ee70c7ba08eeb1d18.tar.gz
zsh-fe36c1ada77f817dbeeeed5ee70c7ba08eeb1d18.zip
Merge tag 'zsh-5.5' and hence branch 'upstream' into branch 'debian'
Release 5.5 of zsh
Diffstat (limited to 'Src')
-rw-r--r--Src/Modules/mapfile.c3
-rw-r--r--Src/Zle/complete.c3
-rw-r--r--Src/Zle/computil.c6
-rw-r--r--Src/Zle/zle_params.c14
-rw-r--r--Src/builtin.c10
-rw-r--r--Src/params.c4
-rw-r--r--Src/utils.c12
7 files changed, 34 insertions, 18 deletions
diff --git a/Src/Modules/mapfile.c b/Src/Modules/mapfile.c
index 7a903418f..dd86fb596 100644
--- a/Src/Modules/mapfile.c
+++ b/Src/Modules/mapfile.c
@@ -158,7 +158,8 @@ setpmmapfiles(Param pm, HashTable ht)
setpmmapfile(v.pm, ztrdup(getstrvalue(&v)));
}
- deleteparamtable(ht);
+ if (ht != pm->u.hash)
+ deleteparamtable(ht);
}
/**/
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index 313dcb92f..1dc2b01c2 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1325,7 +1325,8 @@ set_compstate(UNUSED(Param pm), HashTable ht)
break;
}
- deleteparamtable(ht);
+ if (ht != pm->u.hash)
+ deleteparamtable(ht);
}
/**/
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 4ce8eeee5..5526e0ad0 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -2675,7 +2675,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
for (; lstate; lstate = lstate->snext) {
if (lstate->actopts &&
- (lstate->opt || lstate->def ||
+ (lstate->opt || (ca_doff && lstate->def) ||
(lstate->def && lstate->def->opt &&
(lstate->def->type == CAA_OPT ||
(lstate->def->type >= CAA_RARGS &&
@@ -3022,6 +3022,7 @@ parse_cvdef(char *nam, char **args)
if (hassep && !sep && name + bs + 1 < p) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "no multi-letter values with empty separator allowed");
return NULL;
}
@@ -3035,6 +3036,7 @@ parse_cvdef(char *nam, char **args)
if (!*p) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "invalid value definition: %s", *args);
return NULL;
}
@@ -3046,6 +3048,7 @@ parse_cvdef(char *nam, char **args)
}
if (c && c != ':') {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "invalid value definition: %s", *args);
return NULL;
}
@@ -3054,6 +3057,7 @@ parse_cvdef(char *nam, char **args)
if (c == ':') {
if (hassep && !sep) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "no value with argument with empty separator allowed");
return NULL;
}
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 0a922d2d6..f3112165a 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -124,7 +124,7 @@ static const struct gsu_array killring_gsu =
static const struct gsu_scalar register_gsu =
{ strgetfn, set_register, unset_register };
static const struct gsu_hash registers_gsu =
-{ hashgetfn, set_registers, zleunsetfn };
+{ hashgetfn, set_registers, unset_registers };
/* implementation is in zle_refresh.c */
static const struct gsu_array region_highlight_gsu =
@@ -837,7 +837,17 @@ set_registers(UNUSED(Param pm), HashTable ht)
set_register(v.pm, getstrvalue(&v));
}
- deleteparamtable(ht);
+ if (ht != pm->u.hash)
+ deleteparamtable(ht);
+}
+
+/**/
+static void
+unset_registers(Param pm, int exp)
+{
+ stdunsetfn(pm, exp);
+ deletehashtable(pm->u.hash);
+ pm->u.hash = NULL;
}
static void
diff --git a/Src/builtin.c b/Src/builtin.c
index fb59738f3..73cfe7ad1 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -695,13 +695,11 @@ bin_set(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
char **a = NULL, **y;
int len = arrlen(args);
- if (array < 0 && (a = getaparam(arrayname))) {
- int al = arrlen(a);
-
- if (al > len)
- len = al;
+ if (array < 0 && (a = getaparam(arrayname)) && arrlen_gt(a, len)) {
+ a += len;
+ len += arrlen(a);
}
- for (x = y = zalloc((len + 1) * sizeof(char *)); len--; a++) {
+ for (x = y = zalloc((len + 1) * sizeof(char *)); len--;) {
if (!*args)
args = a;
*y++ = ztrdup(*args++);
diff --git a/Src/params.c b/Src/params.c
index de7730ae7..36f5f0676 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3216,7 +3216,7 @@ assignaparam(char *s, char **val, int flags)
* This only applies if the flag ASSPM_KEY_VALUE is passed in,
* indicating prefork() detected this syntax.
*
- * For associative arrays we just junk the Makrer elements.
+ * For associative arrays we just junk the Marker elements.
*/
if (flags & ASSPM_KEY_VALUE) {
char **aptr;
@@ -3243,6 +3243,7 @@ assignaparam(char *s, char **val, int flags)
(!isset(KSHARRAYS) && *iptr == 0)) {
unqueue_signals();
zerr("bad subscript for direct array assignment: %s", *aptr);
+ freearray(val);
return NULL;
}
if (!isset(KSHARRAYS))
@@ -3260,6 +3261,7 @@ assignaparam(char *s, char **val, int flags)
fullval = zshcalloc((maxlen+1) * sizeof(char *));
if (!fullval) {
zerr("array too large");
+ freearray(val);
return NULL;
}
fullval[maxlen] = NULL;
diff --git a/Src/utils.c b/Src/utils.c
index 3587c3622..180693d67 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1653,7 +1653,7 @@ checkmailpath(char **s)
LinkList l;
DIR *lock = opendir(unmeta(*s));
char buf[PATH_MAX * 2 + 1], **arr, **ap;
- int ct = 1;
+ int buflen, ct = 1;
if (lock) {
char *fn;
@@ -1662,9 +1662,11 @@ checkmailpath(char **s)
l = newlinklist();
while ((fn = zreaddir(lock, 1)) && !errflag) {
if (u)
- sprintf(buf, "%s/%s?%s", *s, fn, u);
+ buflen = snprintf(buf, sizeof(buf), "%s/%s?%s", *s, fn, u);
else
- sprintf(buf, "%s/%s", *s, fn);
+ buflen = snprintf(buf, sizeof(buf), "%s/%s", *s, fn);
+ if (buflen < 0 || buflen >= (int)sizeof(buf))
+ continue;
addlinknode(l, dupstring(buf));
ct++;
}
@@ -2486,9 +2488,7 @@ zstrtoul_underscore(const char *s, zulong *retval)
base = 2, s++;
else
base = isset(OCTALZEROES) ? 8 : 10;
- if (base < 2 || base > 36) {
- return 0;
- } else if (base <= 10) {
+ if (base <= 10) {
for (; (*s >= '0' && *s < ('0' + base)) ||
*s == '_'; s++) {
if (*s == '_')