@@ -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 ;
0 commit comments