aboutsummaryrefslogtreecommitdiff
path: root/posix/regex.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-02-09 05:37:25 +0000
committerUlrich Drepper <drepper@redhat.com>2001-02-09 05:37:25 +0000
commit441f7d1eb2ab291a1d7ee3aa31aa5030d6007355 (patch)
treece15dffd5df15caea9f2ba1463a4b41a8663a271 /posix/regex.c
parent6b58cbc02d642a18343fbb8663e76d87a538dd4a (diff)
downloadglibc-441f7d1eb2ab291a1d7ee3aa31aa5030d6007355.tar
glibc-441f7d1eb2ab291a1d7ee3aa31aa5030d6007355.tar.gz
glibc-441f7d1eb2ab291a1d7ee3aa31aa5030d6007355.tar.bz2
glibc-441f7d1eb2ab291a1d7ee3aa31aa5030d6007355.zip
Update.
* posix/regex.c: Fix alignment problem. Patch by Isamu Hasegawa <isamu@yamato.ibm.com>. Contributed by Rick Gorton <rick.gorton@alpha-processor.com>.
Diffstat (limited to 'posix/regex.c')
-rw-r--r--posix/regex.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/posix/regex.c b/posix/regex.c
index ec25642e31..63f072afac 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -62,7 +62,7 @@
# define US_CHAR_TYPE wchar_t/* unsigned character type */
# define COMPILED_BUFFER_VAR wc_buffer
# define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */
-# define CHAR_CLASS_SIZE (sizeof(wctype_t)/sizeof(CHAR_TYPE)+1)
+# define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_TYPE)+1)
# define PUT_CHAR(c) \
do { \
if (MC_CUR_MAX == 1) \
@@ -2807,6 +2807,8 @@ regex_compile (pattern, size, syntax, bufp)
if (c == ':' && *p == ']')
{
wctype_t wt;
+ uintptr_t alignedp;
+
/* Query the character class as wctype_t. */
wt = IS_CHAR_CLASS (str);
if (wt == 0)
@@ -2824,9 +2826,14 @@ regex_compile (pattern, size, syntax, bufp)
b += CHAR_CLASS_SIZE;
/* Move data which follow character classes
not to violate the data. */
- insert_space(CHAR_CLASS_SIZE, laststart + 6, b - 1);
+ insert_space(CHAR_CLASS_SIZE,
+ laststart + 6 + laststart[1],
+ b - 1);
+ alignedp = ((uintptr_t)(laststart + 6 + laststart[1])
+ + __alignof__(wctype_t) - 1)
+ & ~(uintptr_t)(__alignof__(wctype_t) - 1);
/* Store the character class. */
- *((wctype_t*)(laststart + 6)) = wt;
+ *((wctype_t*)alignedp) = wt;
/* Update length of char_classes */
laststart[1] += CHAR_CLASS_SIZE;
@@ -6001,7 +6008,11 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
/* match with char_class? */
for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE)
{
- wctype_t wctype = *((wctype_t*)workp);
+ wctype_t wctype;
+ uintptr_t alignedp = ((uintptr_t)workp
+ + __alignof__(wctype_t) - 1)
+ & ~(uintptr_t)(__alignof__(wctype_t) - 1);
+ wctype = *((wctype_t*)alignedp);
workp += CHAR_CLASS_SIZE;
if (iswctype((wint_t)c, wctype))
goto char_set_matched;