diff options
Diffstat (limited to 'src/misc1.c')
-rw-r--r-- | src/misc1.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/misc1.c b/src/misc1.c index 5f9828ebe9..dc0deae67a 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -975,9 +975,8 @@ get_number( c = safe_vgetc(); if (VIM_ISDIGIT(c)) { - if (n > INT_MAX / 10) + if (vim_append_digit_int(&n, c - '0') == FAIL) return 0; - n = n * 10 + c - '0'; msg_putchar(c); ++typed; } @@ -2817,3 +2816,25 @@ may_trigger_modechanged(void) restore_v_event(v_event, &save_v_event); #endif } + +// For overflow detection, add a digit safely to an int value. + int +vim_append_digit_int(int *value, int digit) +{ + int x = *value; + if (x > ((INT_MAX - digit) / 10)) + return FAIL; + *value = x * 10 + digit; + return OK; +} + +// For overflow detection, add a digit safely to a long value. + int +vim_append_digit_long(long *value, int digit) +{ + long x = *value; + if (x > ((LONG_MAX - (long)digit) / 10)) + return FAIL; + *value = x * 10 + (long)digit; + return OK; +} |