diff options
author | Reuben Thomas <rrt@sc3d.org> | 2010-11-10 21:07:58 +0000 |
---|---|---|
committer | Reuben Thomas <rrt@sc3d.org> | 2010-11-10 21:07:58 +0000 |
commit | c0798523e9ee44288199c79b6b25eff391909161 (patch) | |
tree | 3b2cd5d67fab582a9fd572d2a8004dfc58c1dd5f /src | |
parent | fd887fd2f8ebaf3f4baa55d0fe987685e8b89ac1 (diff) | |
download | lrexlib-c0798523e9ee44288199c79b6b25eff391909161.tar.gz |
Fix memory alignment bug. (Shmuel)
Diffstat (limited to 'src')
-rw-r--r-- | src/common.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/common.c b/src/common.c index 4756358..ae6147c 100644 --- a/src/common.c +++ b/src/common.c @@ -8,6 +8,8 @@ #include "lauxlib.h" #include "common.h" +#define N_ALIGN sizeof(int) + /* the table must be on Lua stack top */ int get_int_field (lua_State *L, const char* field) { @@ -153,7 +155,8 @@ void buffer_addlstring (TBuffer *buf, const void *src, size_t sz) { buf->arr = p; buf->size = 2 * newtop; } - memcpy (buf->arr + buf->top, src, sz); + if (src) + memcpy (buf->arr + buf->top, src, sz); buf->top = newtop; } @@ -164,10 +167,13 @@ void buffer_addvalue (TBuffer *buf, int stackpos) { } static void bufferZ_addlstring (TBuffer *buf, const void *src, size_t len) { + int n; size_t header[2] = { ID_STRING }; header[1] = len; buffer_addlstring (buf, header, sizeof (header)); buffer_addlstring (buf, src, len); + n = len % N_ALIGN; + if (n) buffer_addlstring (buf, NULL, N_ALIGN - n); } static void bufferZ_addnum (TBuffer *buf, size_t num) { @@ -230,8 +236,11 @@ int bufferZ_next (TBuffer *buf, size_t *iter, size_t *num, const char **str) { *iter += 2 * sizeof (size_t); *str = NULL; if (*ptr_header == ID_STRING) { + int n; *str = buf->arr + *iter; *iter += *num; + n = *iter % N_ALIGN; + if (n) *iter += (N_ALIGN - n); } return 1; } |