diff options
author | David Robillard <d@drobilla.net> | 2019-04-09 10:28:59 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-10-27 13:13:58 +0100 |
commit | e2d2c7b027ac9ac142ae306d248f2d687df211eb (patch) | |
tree | c8326d3deb8b9bb23e2c815d88b917220ef0d85b /src/reader.c | |
parent | 68b30967872915b93c600e353d2fd6d5fb4987c6 (diff) | |
download | serd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.tar.gz serd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.tar.bz2 serd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.zip |
Align nodes with posix_memalign if possible
Diffstat (limited to 'src/reader.c')
-rw-r--r-- | src/reader.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/reader.c b/src/reader.c index 2a021e83..f4a874cb 100644 --- a/src/reader.c +++ b/src/reader.c @@ -83,8 +83,9 @@ push_node_padded(SerdReader* reader, size_t maxlen, } *terminator = 0; - void* mem = serd_stack_push_aligned( - &reader->stack, sizeof(SerdNode) + maxlen + 1, sizeof(SerdNode)); + void* mem = serd_stack_push_aligned(&reader->stack, + sizeof(SerdNode) + maxlen + 1, + sizeof(SerdNode)); if (!mem) { return NULL; @@ -160,15 +161,26 @@ serd_reader_new(SerdWorld* world, const SerdSink* sink, size_t stack_size) { + if (stack_size < 8 * sizeof(SerdNode)) { + return NULL; + } + SerdReader* me = (SerdReader*)calloc(1, sizeof(SerdReader)); me->world = world; me->sink = sink; - me->stack = serd_stack_new(stack_size); + me->stack = serd_stack_new(stack_size, serd_node_align); me->syntax = syntax; me->next_id = 1; me->strict = true; + /* Reserve a bit of space at the end of the stack to zero pad nodes. This + particular kind of overflow could be detected (in emit_statement), but + this is simpler and a bit more resilient to mistakes since the reader + generally pushes only a few bytes at a time, making it pretty unlikely + to overshoot the buffer by this much. */ + me->stack.buf_size -= 8 * sizeof(size_t); + me->rdf_first = push_node(me, SERD_URI, NS_RDF "first", 48); me->rdf_rest = push_node(me, SERD_URI, NS_RDF "rest", 47); me->rdf_nil = push_node(me, SERD_URI, NS_RDF "nil", 46); |