summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-04-21 21:16:03 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2019-04-21 21:16:26 -0700
commite85bff0bbb60e1d819f8f5e00f8496026f27f7ea (patch)
treedbfe6998ce8235bb5dde9e6576fe88db6f65a3a0
parent4a5ed6b05a71593cda33af4da44f30eb84b51f30 (diff)
downloademacs-e85bff0bbb60e1d819f8f5e00f8496026f27f7ea.tar.gz
Fix drain_reloc_list alignment bug
* src/pdumper.c (dump_charset): Use alignof (struct charset), not alignof (int), since struct charset might be more strictly aligned than int. I think this is just a minor performance issue, but we might as well use the correct alignment. (drain_reloc_list): Use an alignment instead of a size for the output alignment. This prevents undefined behavior when alignof (struct emacs_reloc) == 8 and sizeof (dump_off) == 4 when building on x86-64 with gcc -fsanitize=undefined.
-rw-r--r--src/pdumper.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/pdumper.c b/src/pdumper.c
index 6ab82769ec9..39931c6807f 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -3167,7 +3167,7 @@ dump_charset (struct dump_context *ctx, int cs_i)
#if CHECK_STRUCTS && !defined (HASH_charset_317C49E291)
# error "charset changed. See CHECK_STRUCTS comment."
#endif
- dump_align_output (ctx, alignof (int));
+ dump_align_output (ctx, alignof (struct charset));
const struct charset *cs = charset_table + cs_i;
struct charset out;
dump_object_start (ctx, &out, sizeof (out));
@@ -3816,7 +3816,8 @@ drain_reloc_list (struct dump_context *ctx,
Lisp_Object relocs = Fsort (Fnreverse (*reloc_list),
Qdump_emacs_portable__sort_predicate);
*reloc_list = Qnil;
- dump_align_output (ctx, sizeof (dump_off));
+ dump_align_output (ctx, max (alignof (struct dump_reloc),
+ alignof (struct emacs_reloc)));
struct dump_table_locator locator;
memset (&locator, 0, sizeof (locator));
locator.offset = ctx->offset;