diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ChangeLog | 3 | ||||
-rw-r--r-- | lib/regex_internal.c | 9 |
2 files changed, 9 insertions, 3 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 802bde813..78d9b9090 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,8 @@ 2006-08-11 Paul Eggert <eggert@cs.ucla.edu> + * regex_internal.c (re_string_skip_chars): Don't assume WEOF fits + in wchar_t. Problem reported by Eric Blake. + * snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when LEN is smaller than SIZE. Suggested by Bruno Haible. Also, help the compiler to keep LEN in a register. diff --git a/lib/regex_internal.c b/lib/regex_internal.c index a377d2b28..633db7a7f 100644 --- a/lib/regex_internal.c +++ b/lib/regex_internal.c @@ -488,16 +488,17 @@ re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc) mbstate_t prev_st; Idx rawbuf_idx; size_t mbclen; - wchar_t wc = WEOF; + wint_t wc = WEOF; /* Skip the characters which are not necessary to check. */ for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len; rawbuf_idx < new_raw_idx;) { + wchar_t wc2; Idx remain_len; remain_len = pstr->len - rawbuf_idx; prev_st = pstr->cur_state; - mbclen = mbrtowc (&wc, (const char *) pstr->raw_mbs + rawbuf_idx, + mbclen = mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx, remain_len, &pstr->cur_state); if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 0)) { @@ -509,10 +510,12 @@ re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc) mbclen = 1; pstr->cur_state = prev_st; } + else + wc = wc2; /* Then proceed the next character. */ rawbuf_idx += mbclen; } - *last_wc = (wint_t) wc; + *last_wc = wc; return rawbuf_idx; } #endif /* RE_ENABLE_I18N */ |