[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 4/9] util: Return valid allocation for qemu_try_memalign() wit
From: |
Peter Maydell |
Subject: |
[PATCH v2 4/9] util: Return valid allocation for qemu_try_memalign() with zero size |
Date: |
Fri, 4 Mar 2022 11:21:21 +0000 |
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>
---
util/oslib-posix.c | 3 +++
util/oslib-win32.c | 4 +++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 0278902ee79..f7e22f4ff9b 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 05857414695..8c28d70904d 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;
--
2.25.1
- [PATCH v2 0/9] Cleanup of qemu_oom_check() and qemu_memalign(), Peter Maydell, 2022/03/04
- [PATCH v2 1/9] hw/usb/redirect.c: Stop using qemu_oom_check(), Peter Maydell, 2022/03/04
- [PATCH v2 2/9] util: Make qemu_oom_check() a static function, Peter Maydell, 2022/03/04
- [PATCH v2 3/9] util: Unify implementations of qemu_memalign(), Peter Maydell, 2022/03/04
- [PATCH v2 4/9] util: Return valid allocation for qemu_try_memalign() with zero size,
Peter Maydell <=
- [PATCH v2 5/9] meson.build: Don't misdetect posix_memalign() on Windows, Peter Maydell, 2022/03/04
- [PATCH v2 6/9] util: Share qemu_try_memalign() implementation between POSIX and Windows, Peter Maydell, 2022/03/04
- [PATCH v2 7/9] util: Use meson checks for valloc() and memalign() presence, Peter Maydell, 2022/03/04
- [PATCH v2 8/9] util: Put qemu_vfree() in memalign.c, Peter Maydell, 2022/03/04