diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-10 23:12:57 -0700 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-10 23:12:57 -0700 |
commit | 605a73e415772a1d74cff39212618c8f1d58297b (patch) | |
tree | e40ef7beca0b554d2b968a2fa15f2552833c80d0 | |
parent | 22c4ea424ce2e8febce04d324c5ec9898f5d534b (diff) | |
download | zsh-605a73e415772a1d74cff39212618c8f1d58297b.tar.gz zsh-605a73e415772a1d74cff39212618c8f1d58297b.tar.xz zsh-605a73e415772a1d74cff39212618c8f1d58297b.zip |
33429: disallow non-integer values for HISTSIZE and SAVEHIST of "fc -p", and fix crash on zero values for same
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/builtin.c | 17 | ||||
-rw-r--r-- | Src/hist.c | 9 |
3 files changed, 25 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index 5b3b1b23c..33089abdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-10-10 Barton E. Schaefer <schaefer@zsh.org> + + * 33429: Src/builtin.c, Src/hist.c: disallow non-integer values + for the temporary HISTSIZE and SAVEHIST of "fc -p", and fix + crash on zero values for same + 2014-10-09 Frank Terbeck <ft@bewatermyfriend.org> * 33405: Functions/VCS_Info/vcs_info: Make sure maxexports diff --git a/Src/builtin.c b/Src/builtin.c index 4a10c7dd1..5b711edc0 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -1363,10 +1363,19 @@ bin_fc(char *nam, char **argv, Options ops, int func) if (*argv) { hf = *argv++; if (*argv) { - hs = zstrtol(*argv++, NULL, 10); - if (*argv) - shs = zstrtol(*argv++, NULL, 10); - else + char *check; + hs = zstrtol(*argv++, &check, 10); + if (*check) { + zwarnnam("fc", "HISTSIZE must be an integer"); + return 1; + } + if (*argv) { + shs = zstrtol(*argv++, &check, 10); + if (*check) { + zwarnnam("fc", "SAVEHIST must be an integer"); + return 1; + } + } else shs = hs; if (*argv) { zwarnnam("fc", "too many arguments"); diff --git a/Src/hist.c b/Src/hist.c index 4660fd073..083175640 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -1110,8 +1110,11 @@ static void putoldhistentryontop(short keep_going) { static Histent next = NULL; - Histent he = keep_going? next : hist_ring->down; - next = he->down; + Histent he = (keep_going || !hist_ring) ? next : hist_ring->down; + if (he) + next = he->down; + else + return; if (isset(HISTEXPIREDUPSFIRST) && !(he->node.flags & HIST_DUP)) { static zlong max_unique_ct = 0; if (!keep_going) @@ -1151,7 +1154,7 @@ prepnexthistent(void) freehistnode(&hist_ring->node); } - if (histlinect < histsiz) { + if (histlinect < histsiz || !hist_ring) { he = (Histent)zshcalloc(sizeof *he); if (!hist_ring) hist_ring = he->up = he->down = he; |