Skip to content

Commit 07ccf7c

Browse files
committed
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Problem: vim_str2nr() does not handle numbers close to the maximum. Solution: Check for overflow more precisely. (Ken Takata, closes #2746)
1 parent 1983401 commit 07ccf7c

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

src/charset.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,8 +1928,8 @@ vim_str2nr(
19281928
while ('0' <= *ptr && *ptr <= '1')
19291929
{
19301930
/* avoid ubsan error for overflow */
1931-
if (un < UVARNUM_MAX / 2)
1932-
un = 2 * un + (unsigned long)(*ptr - '0');
1931+
if (un <= UVARNUM_MAX / 2)
1932+
un = 2 * un + (uvarnumber_T)(*ptr - '0');
19331933
else
19341934
un = UVARNUM_MAX;
19351935
++ptr;
@@ -1943,7 +1943,7 @@ vim_str2nr(
19431943
while ('0' <= *ptr && *ptr <= '7')
19441944
{
19451945
/* avoid ubsan error for overflow */
1946-
if (un < UVARNUM_MAX / 8)
1946+
if (un <= UVARNUM_MAX / 8)
19471947
un = 8 * un + (uvarnumber_T)(*ptr - '0');
19481948
else
19491949
un = UVARNUM_MAX;
@@ -1960,7 +1960,7 @@ vim_str2nr(
19601960
while (vim_isxdigit(*ptr))
19611961
{
19621962
/* avoid ubsan error for overflow */
1963-
if (un < UVARNUM_MAX / 16)
1963+
if (un <= UVARNUM_MAX / 16)
19641964
un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
19651965
else
19661966
un = UVARNUM_MAX;
@@ -1974,9 +1974,12 @@ vim_str2nr(
19741974
/* decimal */
19751975
while (VIM_ISDIGIT(*ptr))
19761976
{
1977+
uvarnumber_T digit = (uvarnumber_T)(*ptr - '0');
1978+
19771979
/* avoid ubsan error for overflow */
1978-
if (un < UVARNUM_MAX / 10)
1979-
un = 10 * un + (uvarnumber_T)(*ptr - '0');
1980+
if (un < UVARNUM_MAX / 10
1981+
|| (un == UVARNUM_MAX / 10 && digit <= UVARNUM_MAX % 10))
1982+
un = 10 * un + digit;
19801983
else
19811984
un = UVARNUM_MAX;
19821985
++ptr;

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ static char *(features[]) =
761761

762762
static int included_patches[] =
763763
{ /* Add new patch number below this line */
764+
/**/
765+
48,
764766
/**/
765767
47,
766768
/**/

0 commit comments

Comments
 (0)