diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2021-08-17 10:30:08 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2021-08-24 00:43:27 -0700 |
commit | 2b455da03fb9de9af75fecf5792844a1de108899 (patch) | |
tree | 217ef3434af61696d911ffefcf80fafee122743e | |
parent | 33b2d2eded9c9679853631ec94825247aae711ac (diff) | |
download | grep-2b455da03fb9de9af75fecf5792844a1de108899.tar.gz |
grep: avoid some size_t casts
This helps move the code away from unsigned types.
* src/grep.c (buf_has_encoding_errors, contains_encoding_error):
* src/searchutils.c (mb_goback):
Compare to MB_LEN_MAX, not to (size_t) -2. This is a bit safer
anyway, as grep relies on MB_LEN_MAX limits elsewhere.
* src/search.h (mb_clen): Compare to -2 before converting to size_t.
-rw-r--r-- | src/grep.c | 8 | ||||
-rw-r--r-- | src/search.h | 4 | ||||
-rw-r--r-- | src/searchutils.c | 8 |
3 files changed, 10 insertions, 10 deletions
@@ -768,7 +768,7 @@ buf_has_encoding_errors (char *buf, size_t size) for (char const *p = buf; (p = skip_easy_bytes (p)) < buf + size; p += clen) { clen = mbrlen (p, buf + size - p, &mbs); - if ((size_t) -2 <= clen) + if (MB_LEN_MAX < clen) return true; } @@ -2234,12 +2234,12 @@ static bool contains_encoding_error (char const *pat, size_t patlen) { mbstate_t mbs = { 0 }; - size_t i, charlen; + size_t charlen; - for (i = 0; i < patlen; i += charlen) + for (size_t i = 0; i < patlen; i += charlen) { charlen = mb_clen (pat + i, patlen - i, &mbs); - if ((size_t) -2 <= charlen) + if (MB_LEN_MAX < charlen) return true; } return false; diff --git a/src/search.h b/src/search.h index 4853583f..6a5814a9 100644 --- a/src/search.h +++ b/src/search.h @@ -78,8 +78,8 @@ extern void fgrep_to_grep_pattern (char **, size_t *); SEARCH_INLINE size_t mb_clen (char const *s, size_t n, mbstate_t *mbs) { - size_t len = localeinfo.sbclen[to_uchar (*s)]; - return len == (size_t) -2 ? mbrlen (s, n, mbs) : len; + signed char len = localeinfo.sbclen[to_uchar (*s)]; + return len == -2 ? mbrlen (s, n, mbs) : len; } extern char const *input_filename (void); diff --git a/src/searchutils.c b/src/searchutils.c index 80585118..b63990a9 100644 --- a/src/searchutils.c +++ b/src/searchutils.c @@ -68,8 +68,8 @@ kwsinit (bool mb_trans) When returning zero, set *MB_START to CUR. When returning a positive value, set *MB_START to the next boundary after CUR, - or to END if there is no such boundary, and set *MBCLEN to the - length of the preceding character. */ + or to END if there is no such boundary, and if MBCLEN is nonnull + set *MBCLEN to the length of the preceding character. */ ptrdiff_t mb_goback (char const **mb_start, size_t *mbclen, char const *cur, char const *end) @@ -92,7 +92,7 @@ mb_goback (char const **mb_start, size_t *mbclen, char const *cur, { mbstate_t mbs = { 0 }; clen = mb_clen (cur - i, end - (cur - i), &mbs); - if (i < clen && clen < (size_t) -2) + if (i < clen && clen <= MB_LEN_MAX) { p0 = cur - i; p = p0 + clen; @@ -107,7 +107,7 @@ mb_goback (char const **mb_start, size_t *mbclen, char const *cur, { clen = mb_clen (p, end - p, &mbs); - if ((size_t) -2 <= clen) + if (MB_LEN_MAX < clen) { /* An invalid sequence, or a truncated multibyte character. Treat it as a single byte character. */ |