Fix for unaligned memory accesses.

reviewed by: plam
This commit is contained in:
Patrick Lam 2006-01-19 19:20:30 +00:00
parent 58bdd29619
commit 986e35979e
2 changed files with 16 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2006-01-19 Andreas Schwab <schwab@suse.de>
reviewed by: plam
* src/fcpat.c (FcStrNeededBytes):
Fix for unaligned memory accesses.
2006-01-18 Mike Fabian <mfabian@suse.de> 2006-01-18 Mike Fabian <mfabian@suse.de>
reviewed by: plam reviewed by: plam
@ -6,7 +13,7 @@
Properly order the FcConfigAddFontDir and FcConfigNormalizeFontDir Properly order the FcConfigAddFontDir and FcConfigNormalizeFontDir
calls to avoid crashes. calls to avoid crashes.
2006-01-14 Patirck Lam <plam@mit.edu> 2006-01-14 Patrick Lam <plam@mit.edu>
* src/fccache.c (FcDirCacheConsume): * src/fccache.c (FcDirCacheConsume):
Fix segfault when consuming zero-length caches in fc-cat Fix segfault when consuming zero-length caches in fc-cat

View File

@ -1888,6 +1888,7 @@ FcStrNeededBytes (const FcChar8 * s)
struct objectBucket **p; struct objectBucket **p;
struct objectBucket *b; struct objectBucket *b;
int size; int size;
FcChar8 *const null = 0;
for (p = &FcStrBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) for (p = &FcStrBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
if (b->hash == hash && !strcmp ((char *)s, (char *) (b + 1))) 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 * incorrect to replace the with a memset, because the C
* specification doesn't guarantee that the null pointer is * specification doesn't guarantee that the null pointer is
* the same as the zero bit pattern. */ * 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; *p = b;
fcstr_count += strlen((char *)s) + 1; 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)) for (p = &FcStrBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
if (b->hash == hash && !strcmp ((char *)s, (char *) (b + 1))) 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) if (!t)
{ {
strcpy((char *)(static_strs[bi] + fcstr_ptr), (char *)s); 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; 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; return t;
} }