diff options
author | Axel Beckert <abe@deuxchevaux.org> | 2018-04-09 00:42:15 +0200 |
---|---|---|
committer | Axel Beckert <abe@deuxchevaux.org> | 2018-04-09 00:42:15 +0200 |
commit | fe36c1ada77f817dbeeeed5ee70c7ba08eeb1d18 (patch) | |
tree | 0229967da5e73bd29a2d6014c847509b361f3631 /Src | |
parent | 1521c7d0f7e607b789564e819173e228e9475137 (diff) | |
parent | f9e9dce5443f323b340303596406f9d3ce11d23a (diff) | |
download | zsh-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.c | 3 | ||||
-rw-r--r-- | Src/Zle/complete.c | 3 | ||||
-rw-r--r-- | Src/Zle/computil.c | 6 | ||||
-rw-r--r-- | Src/Zle/zle_params.c | 14 | ||||
-rw-r--r-- | Src/builtin.c | 10 | ||||
-rw-r--r-- | Src/params.c | 4 | ||||
-rw-r--r-- | Src/utils.c | 12 |
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 == '_') |