From 08c708015ec372b6c28d341cba7bbc86843cc17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 14 Sep 2022 11:40:09 +0300 Subject: tools: Allocate the priv structs with proper alignment Previously, they could be allocated with any random alignment matching the end of the MuxerContext/DemuxerContext. The priv structs themselves can have members that require specific alignment, or at least the default alignment of malloc()/calloc() (which is sufficient for native types such as uint64_t and doubles). This fixes crashes in some arm builds, where GCC (correctly) wants to use 64 bit aligned stores to write to MD5Context. --- tools/input/input.c | 5 +++-- tools/output/output.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/input/input.c b/tools/input/input.c index 4756648..2dfaa97 100644 --- a/tools/input/input.c +++ b/tools/input/input.c @@ -41,6 +41,7 @@ struct DemuxerContext { DemuxerPriv *data; const Demuxer *impl; + uint64_t priv_data[]; }; extern const Demuxer ivf_demuxer; @@ -109,12 +110,12 @@ int input_open(DemuxerContext **const c_out, } } - if (!(c = calloc(1, sizeof(DemuxerContext) + impl->priv_data_size))) { + if (!(c = calloc(1, offsetof(DemuxerContext, priv_data) + impl->priv_data_size))) { fprintf(stderr, "Failed to allocate memory\n"); return DAV1D_ERR(ENOMEM); } c->impl = impl; - c->data = (DemuxerPriv *) &c[1]; + c->data = (DemuxerPriv *) c->priv_data; if ((res = impl->open(c->data, filename, fps, num_frames, timebase)) < 0) { free(c); return res; diff --git a/tools/output/output.c b/tools/output/output.c index cf66d2e..f8910d4 100644 --- a/tools/output/output.c +++ b/tools/output/output.c @@ -46,6 +46,7 @@ struct MuxerContext { unsigned fps[2]; const char *filename; int framenum; + uint64_t priv_data[]; }; extern const Muxer null_muxer; @@ -123,12 +124,12 @@ int output_open(MuxerContext **const c_out, } } - if (!(c = malloc(sizeof(MuxerContext) + impl->priv_data_size))) { + if (!(c = malloc(offsetof(MuxerContext, priv_data) + impl->priv_data_size))) { fprintf(stderr, "Failed to allocate memory\n"); return DAV1D_ERR(ENOMEM); } c->impl = impl; - c->data = (MuxerPriv *) &c[1]; + c->data = (MuxerPriv *) c->priv_data; int have_num_pattern = 0; for (const char *ptr = filename ? strchr(filename, '%') : NULL; !have_num_pattern && ptr; ptr = strchr(ptr, '%')) -- cgit v1.2.3