forked from pool/glibc
69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
|
-------------------------------------------------------------------
|
||
|
Mon Oct 21 17:20:04 CEST 2002 - schwab@suse.de
|
||
|
|
||
|
- Fix alignment in locale-archive.
|
||
|
|
||
|
--- locale/programs/locarchive.c 2002-10-18 11:14:16.000000000 +0200
|
||
|
+++ locale/programs/locarchive.c 2002-10-21 13:28:27.000000000 +0200
|
||
|
@@ -72,6 +72,9 @@ static const char *locnames[] =
|
||
|
#define INITIAL_NUM_SUMS 2000
|
||
|
|
||
|
|
||
|
+#define ALIGN(offset, alignment) \
|
||
|
+ (((offset) + (alignment) - 1) & -(alignment))
|
||
|
+
|
||
|
static void
|
||
|
create_archive (const char *archivefname, struct locarhandle *ah)
|
||
|
{
|
||
|
@@ -90,8 +93,9 @@ create_archive (const char *archivefname
|
||
|
|
||
|
/* Create the initial content of the archive. */
|
||
|
head.magic = AR_MAGIC;
|
||
|
head.serial = 0;
|
||
|
- head.namehash_offset = sizeof (struct locarhead);
|
||
|
+ head.namehash_offset = ALIGN (sizeof (struct locarhead),
|
||
|
+ __alignof__ (struct namehashent));
|
||
|
head.namehash_used = 0;
|
||
|
head.namehash_size = next_prime (INITIAL_NUM_NAMES);
|
||
|
|
||
|
@@ -99,12 +103,15 @@ create_archive (const char *archivefname
|
||
|
head.string_used = 0;
|
||
|
head.string_size = INITIAL_SIZE_STRINGS;
|
||
|
|
||
|
- head.locrectab_offset = head.string_offset + head.string_size;
|
||
|
+ head.locrectab_offset = ALIGN (head.string_offset + head.string_size,
|
||
|
+ __alignof__ (struct locrecent));
|
||
|
head.locrectab_used = 0;
|
||
|
head.locrectab_size = INITIAL_NUM_LOCREC;
|
||
|
|
||
|
- head.sumhash_offset = (head.locrectab_offset
|
||
|
- + head.locrectab_size * sizeof (struct locrecent));
|
||
|
+ head.sumhash_offset = ALIGN (head.locrectab_offset
|
||
|
+ + (head.locrectab_size
|
||
|
+ * sizeof (struct locrecent)),
|
||
|
+ __alignof__ (struct sumhashent));
|
||
|
head.sumhash_used = 0;
|
||
|
head.sumhash_size = next_prime (INITIAL_NUM_SUMS);
|
||
|
|
||
|
@@ -274,13 +281,16 @@ enlarge_archive (struct locarhandle *ah,
|
||
|
* sizeof (struct namehashent)));
|
||
|
newhead.string_size = MAX (2 * newhead.string_used, newhead.string_size);
|
||
|
|
||
|
- newhead.locrectab_offset = newhead.string_offset + newhead.string_size;
|
||
|
+ newhead.locrectab_offset = ALIGN (newhead.string_offset
|
||
|
+ + newhead.string_size,
|
||
|
+ __alignof__ (struct locrecent));
|
||
|
newhead.locrectab_size = MAX (2 * newhead.locrectab_used,
|
||
|
newhead.locrectab_size);
|
||
|
|
||
|
- newhead.sumhash_offset = (newhead.locrectab_offset
|
||
|
- + (newhead.locrectab_size
|
||
|
- * sizeof (struct locrecent)));
|
||
|
+ newhead.sumhash_offset = ALIGN (newhead.locrectab_offset
|
||
|
+ + (newhead.locrectab_size
|
||
|
+ * sizeof (struct locrecent)),
|
||
|
+ __alignof__ (struct sumhashent));
|
||
|
newhead.sumhash_size = MAX (next_prime (2 * newhead.sumhash_used),
|
||
|
newhead.sumhash_size);
|
||
|
|