summaryrefslogtreecommitdiff
path: root/lib/obstack.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2004-08-10 05:16:53 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2004-08-10 05:16:53 +0000
commitd2cffec544f98047457b91ba5ec62c26975885d5 (patch)
treea3e08b5eaf48f5e3030f37355ef0a07ff5097adb /lib/obstack.c
parent3dec705e020f4e9a0dcd618b5addcf9bc7fb2bb6 (diff)
downloadgnulib-d2cffec544f98047457b91ba5ec62c26975885d5.tar.gz
(_obstack_begin, _obstack_begin_1, _obstack_newchunk):
Don't assume that chunk->contents is suitably aligned.
Diffstat (limited to 'lib/obstack.c')
-rw-r--r--lib/obstack.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/obstack.c b/lib/obstack.c
index 52946d26de..8ce49ad8cc 100644
--- a/lib/obstack.c
+++ b/lib/obstack.c
@@ -173,7 +173,8 @@ _obstack_begin (struct obstack *h,
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if (!chunk)
(*obstack_alloc_failed_handler) ();
- h->next_free = h->object_base = chunk->contents;
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
h->chunk_limit = chunk->limit
= (char *) chunk + h->chunk_size;
chunk->prev = 0;
@@ -220,7 +221,8 @@ _obstack_begin_1 (struct obstack *h, int size, int alignment,
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if (!chunk)
(*obstack_alloc_failed_handler) ();
- h->next_free = h->object_base = chunk->contents;
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
h->chunk_limit = chunk->limit
= (char *) chunk + h->chunk_size;
chunk->prev = 0;
@@ -287,7 +289,10 @@ _obstack_newchunk (struct obstack *h, int length)
/* If the object just copied was the only data in OLD_CHUNK,
free that chunk and remove it from the chain.
But not if that chunk might contain an empty object. */
- if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
+ if (! h->maybe_empty_object
+ && (h->object_base
+ == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+ h->alignment_mask)))
{
new_chunk->prev = old_chunk->prev;
CALL_FREEFUN (h, old_chunk);