diff options
author | Peter Maydell | 2022-02-26 19:07:18 +0100 |
---|---|---|
committer | Peter Maydell | 2022-03-07 14:14:07 +0100 |
commit | bc0fecc1c2f2c70780e38b3f821dc5b89eed0716 (patch) | |
tree | edcf3e2d80255a67460e4dca53467c3d20b3b8c4 /util | |
parent | util: Unify implementations of qemu_memalign() (diff) | |
download | qemu-bc0fecc1c2f2c70780e38b3f821dc5b89eed0716.tar.gz qemu-bc0fecc1c2f2c70780e38b3f821dc5b89eed0716.tar.xz qemu-bc0fecc1c2f2c70780e38b3f821dc5b89eed0716.zip |
util: Return valid allocation for qemu_try_memalign() with zero size
Currently qemu_try_memalign()'s behaviour if asked to allocate
0 bytes is rather variable:
* on Windows, we will assert
* on POSIX platforms, we get the underlying behaviour of
the posix_memalign() or equivalent function, which may be
either "return a valid non-NULL pointer" or "return NULL"
Explictly check for 0 byte allocations, so we get consistent
behaviour across platforms. We handle them by incrementing the size
so that we return a valid non-NULL pointer that can later be passed
to qemu_vfree(). This is permitted behaviour for the
posix_memalign() API and is the most usual way that underlying
malloc() etc implementations handle a zero-sized allocation request,
because it won't trip up calling code that assumes NULL means an
error. (This includes our own qemu_memalign(), which will abort on
NULL.)
This change is a preparation for sharing the qemu_try_memalign() code
between Windows and POSIX.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Diffstat (limited to 'util')
-rw-r--r-- | util/oslib-posix.c | 3 | ||||
-rw-r--r-- | util/oslib-win32.c | 4 |
2 files changed, 6 insertions, 1 deletions
diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 0278902ee7..f7e22f4ff9 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -209,6 +209,9 @@ void *qemu_try_memalign(size_t alignment, size_t size) g_assert(is_power_of_2(alignment)); } + if (size == 0) { + size++; + } #if defined(CONFIG_POSIX_MEMALIGN) int ret; ret = posix_memalign(&ptr, alignment, size); diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 0585741469..8c28d70904 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -48,12 +48,14 @@ void *qemu_try_memalign(size_t alignment, size_t size) { void *ptr; - g_assert(size != 0); if (alignment < sizeof(void *)) { alignment = sizeof(void *); } else { g_assert(is_power_of_2(alignment)); } + if (size == 0) { + size++; + } ptr = _aligned_malloc(size, alignment); trace_qemu_memalign(alignment, size, ptr); return ptr; |