From 986e35979e56774c91f3214af9e8a6f71817dcfa Mon Sep 17 00:00:00 2001 From: Patrick Lam Date: Thu, 19 Jan 2006 19:20:30 +0000 Subject: [PATCH] Fix for unaligned memory accesses. reviewed by: plam --- ChangeLog | 9 ++++++++- src/fcpat.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 18a626c..98e404c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-01-19 Andreas Schwab + reviewed by: plam + + * src/fcpat.c (FcStrNeededBytes): + + Fix for unaligned memory accesses. + 2006-01-18 Mike Fabian reviewed by: plam @@ -6,7 +13,7 @@ Properly order the FcConfigAddFontDir and FcConfigNormalizeFontDir calls to avoid crashes. -2006-01-14 Patirck Lam +2006-01-14 Patrick Lam * src/fccache.c (FcDirCacheConsume): Fix segfault when consuming zero-length caches in fc-cat diff --git a/src/fcpat.c b/src/fcpat.c index f150614..aa1e8d6 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -1888,6 +1888,7 @@ FcStrNeededBytes (const FcChar8 * s) struct objectBucket **p; struct objectBucket *b; int size; + FcChar8 *const null = 0; for (p = &FcStrBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) if (b->hash == hash && !strcmp ((char *)s, (char *) (b + 1))) @@ -1905,7 +1906,8 @@ FcStrNeededBytes (const FcChar8 * s) * incorrect to replace the with a memset, because the C * specification doesn't guarantee that the null pointer is * the same as the zero bit pattern. */ - *(char **)((char *) (b + 1) + strlen((char *)s) + 1) = 0; + /* Misaligned pointers are not guaranteed to work, either! */ + memcpy (((char *) (b + 1) + strlen((char *)s) + 1), &null, sizeof (null)); *p = b; fcstr_count += strlen((char *)s) + 1; @@ -1968,13 +1970,15 @@ FcStrSerialize (int bank, const FcChar8 * s) for (p = &FcStrBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) if (b->hash == hash && !strcmp ((char *)s, (char *) (b + 1))) { - FcChar8 * t = *(FcChar8 **)(((FcChar8 *)(b + 1)) + strlen ((char *)s) + 1); + FcChar8 * t; + memcpy (&t, ((FcChar8 *)(b + 1)) + strlen ((char *)s) + 1, sizeof (FcChar8 *)); if (!t) { strcpy((char *)(static_strs[bi] + fcstr_ptr), (char *)s); - *(FcChar8 **)((FcChar8 *) (b + 1) + strlen((char *)s) + 1) = (static_strs[bi] + fcstr_ptr); + t = static_strs[bi] + fcstr_ptr; + memcpy ((FcChar8 *) (b + 1) + strlen((char *)s) + 1, &t, sizeof (FcChar8 *)); fcstr_ptr += strlen((char *)s) + 1; - t = *(FcChar8 **)(((FcChar8 *)(b + 1)) + strlen ((char *)s) + 1); + memcpy (&t, ((FcChar8 *)(b + 1)) + strlen ((char *)s) + 1, sizeof (FcChar8 *)); } return t; } -- 2.39.2