From 37cdc2432270313a8b0be232f2760b32f0643806 Mon Sep 17 00:00:00 2001 From: riastradh Date: Tue, 4 Jul 2023 15:06:28 +0000 Subject: [PATCH] jemalloc: Enforce alignment-must-divide-size rule of aligned_alloc. C11, Sec. 7.22.3.1 The aligned_alloc function, paragraph 2, p. 348: The value of alignment shall be a valid alignment supported by the implementation and the value of size shall be an integral multiple of alignment. posix_memalign does not appear to have any corresponding constraint. XXX pullup-10 --- external/bsd/jemalloc/dist/src/jemalloc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/external/bsd/jemalloc/dist/src/jemalloc.c b/external/bsd/jemalloc/dist/src/jemalloc.c index f5800a3fbc95..0007d3fe41a7 100644 --- a/external/bsd/jemalloc/dist/src/jemalloc.c +++ b/external/bsd/jemalloc/dist/src/jemalloc.c @@ -1635,6 +1635,9 @@ struct static_opts_s { /* Whether to set errno when we encounter an error condition. */ bool set_errno_on_error; + /* Whether the alignment must divide the size. */ + bool alignment_must_divide_size; + /* * The minimum valid alignment for functions requesting aligned storage. */ @@ -1662,6 +1665,7 @@ static_opts_init(static_opts_t *static_opts) { static_opts->assert_nonempty_alloc = false; static_opts->null_out_result_on_error = false; static_opts->set_errno_on_error = false; + static_opts->alignment_must_divide_size = false; static_opts->min_alignment = 0; static_opts->oom_string = ""; static_opts->invalid_alignment_string = ""; @@ -1857,6 +1861,11 @@ imalloc_body(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd) { || (dopts->alignment & (dopts->alignment - 1)) != 0)) { goto label_invalid_alignment; } + if (sopts->alignment_must_divide_size) { + if (unlikely(dopts->item_size % dopts->alignment)) { + goto label_invalid_alignment; + } + } /* This is the beginning of the "core" algorithm. */ @@ -2125,6 +2134,7 @@ je_aligned_alloc(size_t alignment, size_t size) { sopts.bump_empty_alloc = true; sopts.null_out_result_on_error = true; sopts.set_errno_on_error = true; + sopts.alignment_must_divide_size = true; sopts.min_alignment = 1; sopts.oom_string = ": Error allocating aligned memory: out of memory\n";