Mercurial > vim
changeset 20677:ab0dc036f586 v8.2.0892
patch 8.2.0892: ubsan warns for undefined behavior
Commit: https://github.com/vim/vim/commit/c5acc0f7fed6b061d994fc5ac660dcc0312750bd
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jun 3 18:55:38 2020 +0200
patch 8.2.0892: ubsan warns for undefined behavior
Problem: Ubsan warns for undefined behavior.
Solution: Use unsigned instead of signed variable. (Dominique Pelle,
closes #6193)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 03 Jun 2020 19:00:04 +0200 |
parents | 96e5c3e65d20 |
children | f5bc9724bf64 |
files | src/regexp_nfa.c src/version.c |
diffstat | 2 files changed, 15 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -246,6 +246,7 @@ static int nfa_classcodes[] = { static char_u e_nul_found[] = N_("E865: (NFA) Regexp end encountered prematurely"); static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c"); static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %d"); +static char_u e_value_too_large[] = N_("E951: \\% value too large"); // Variables only used in nfa_regcomp() and descendants. static int nfa_re_flags; // re_flags passed to nfa_regcomp() @@ -1541,19 +1542,27 @@ nfa_regatom(void) default: { - long n = 0; + long_u n = 0; int cmp = c; if (c == '<' || c == '>') c = getchr(); while (VIM_ISDIGIT(c)) { - n = n * 10 + (c - '0'); + long_u tmp = n * 10 + (c - '0'); + + if (tmp < n) + { + // overflow. + emsg(_(e_value_too_large)); + return FAIL; + } + n = tmp; c = getchr(); } if (c == 'l' || c == 'c' || c == 'v') { - int limit = INT_MAX; + long_u limit = INT_MAX; if (c == 'l') { @@ -1576,7 +1585,7 @@ nfa_regatom(void) } if (n >= limit) { - emsg(_("E951: \\% value too large")); + emsg(_(e_value_too_large)); return FAIL; } EMIT((int)n);