summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-08-11 18:29:06 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-08-11 18:29:06 +0000
commitba79117e35e35b9792c0c4d516cf8901585df90b (patch)
tree3b3f7c159a8ff727d607816139df04827305e4cd
parent0154d1876bba4cb56c606406add8bf68954a495a (diff)
downloadcoreutils-ba79117e35e35b9792c0c4d516cf8901585df90b.tar.xz
(re_string_skip_chars): Don't assume WEOF fits in wchar_t.
-rw-r--r--lib/ChangeLog3
-rw-r--r--lib/regex_internal.c9
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 */