diff options
Diffstat (limited to 'libcpp/directives.c')
-rw-r--r-- | libcpp/directives.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/libcpp/directives.c b/libcpp/directives.c index fa66b5c..7511560 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -915,12 +915,11 @@ read_flag (cpp_reader *pfile, unsigned int last) /* Subroutine of do_line and do_linemarker. Convert a number in STR, of length LEN, to binary; store it in NUMP, and return false if the number was well-formed, true if not. WRAPPED is set to true if the - number did not fit into 'unsigned long'. */ + number did not fit into 'linenum_type'. */ static bool strtolinenum (const uchar *str, size_t len, linenum_type *nump, bool *wrapped) { linenum_type reg = 0; - linenum_type reg_prev = 0; uchar c; *wrapped = false; @@ -929,11 +928,12 @@ strtolinenum (const uchar *str, size_t len, linenum_type *nump, bool *wrapped) c = *str++; if (!ISDIGIT (c)) return true; + if (reg > ((linenum_type) -1) / 10) + *wrapped = true; reg *= 10; - reg += c - '0'; - if (reg < reg_prev) + if (reg > ((linenum_type) -1) - (c - '0')) *wrapped = true; - reg_prev = reg; + reg += c - '0'; } *nump = reg; return false; |