aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-03-17 17:08:01 -0400
committerJustin M. Keyes <justinkz@gmail.com>2019-03-17 22:08:01 +0100
commitd86c816f8cae993dd21ab6ce932eb36a3e965dcb (patch)
tree1bec254dd850f5c715b7eb072493a9105a252d19
parent027a2157d3322e366f87fee877cd9ecce1f5cd1e (diff)
downloadrneovim-d86c816f8cae993dd21ab6ce932eb36a3e965dcb.tar.gz
rneovim-d86c816f8cae993dd21ab6ce932eb36a3e965dcb.tar.bz2
rneovim-d86c816f8cae993dd21ab6ce932eb36a3e965dcb.zip
vim-patch:8.1.0048: vim_str2nr() on numbers close to max #9744
Problem: vim_str2nr() does not handle numbers close to the maximum. Solution: Check for overflow more precisely. (Ken Takata, closes vim/vim#2746) https://github.com/vim/vim/commit/07ccf7ce7fb948fd4d080b817e9fbaea9e721dab
-rw-r--r--src/nvim/charset.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index ddff93d83b..b155b3861f 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -1777,9 +1777,12 @@ void vim_str2nr(const char_u *const start, int *const prep, int *const len,
#define PARSE_NUMBER(base, cond, conv) \
do { \
while (!STRING_ENDED(ptr) && (cond)) { \
+ const uvarnumber_T digit = (uvarnumber_T)(conv); \
/* avoid ubsan error for overflow */ \
- if (un < UVARNUMBER_MAX / base) { \
- un = base * un + (uvarnumber_T)(conv); \
+ if (un < UVARNUMBER_MAX / base \
+ || (un == UVARNUMBER_MAX / base \
+ && (base != 10 || digit <= UVARNUMBER_MAX % 10))) { \
+ un = base * un + digit; \
} else { \
un = UVARNUMBER_MAX; \
} \