while ('0' <= *ptr && *ptr <= '1')
{
/* avoid ubsan error for overflow */
- if (un < UVARNUM_MAX / 2)
- un = 2 * un + (unsigned long)(*ptr - '0');
+ if (un <= UVARNUM_MAX / 2)
+ un = 2 * un + (uvarnumber_T)(*ptr - '0');
else
un = UVARNUM_MAX;
++ptr;
while ('0' <= *ptr && *ptr <= '7')
{
/* avoid ubsan error for overflow */
- if (un < UVARNUM_MAX / 8)
+ if (un <= UVARNUM_MAX / 8)
un = 8 * un + (uvarnumber_T)(*ptr - '0');
else
un = UVARNUM_MAX;
while (vim_isxdigit(*ptr))
{
/* avoid ubsan error for overflow */
- if (un < UVARNUM_MAX / 16)
+ if (un <= UVARNUM_MAX / 16)
un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
else
un = UVARNUM_MAX;
/* decimal */
while (VIM_ISDIGIT(*ptr))
{
+ uvarnumber_T digit = (uvarnumber_T)(*ptr - '0');
+
/* avoid ubsan error for overflow */
- if (un < UVARNUM_MAX / 10)
- un = 10 * un + (uvarnumber_T)(*ptr - '0');
+ if (un < UVARNUM_MAX / 10
+ || (un == UVARNUM_MAX / 10 && digit <= UVARNUM_MAX % 10))
+ un = 10 * un + digit;
else
un = UVARNUM_MAX;
++ptr;