MS CRT libraries (UCRT, msvcr70+ and os system msvcrt) for functions _aligned_malloc() and _aligned_offset_malloc() allocate the source buffer slightly smaller than the mingw-w64 functions in mingw-aligned-malloc.c. This is because the alignment gap can be used for the user data too.
Do exactly same math calculation in the mingw-w64 implementation as is UCRT doing. Same calculation is in msvcr70 and probably also in system msvcrt library (at least different _msize() tests confirms it). This will allow to call __mingw_aligned_msize() on buffer allocated by MS CRT _aligned_malloc() function from msvcrt.dll, msvcr70.dll and msvcrt71.dll CRT libraries. This is very useful because these CRT libraries do not have _aligned_msize() function and hence mingw-w64 could emulate it via __mingw_aligned_msize(). --- mingw-w64-crt/misc/mingw-aligned-malloc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mingw-w64-crt/misc/mingw-aligned-malloc.c b/mingw-w64-crt/misc/mingw-aligned-malloc.c index be07ed6bcfb1..02872c921a18 100644 --- a/mingw-w64-crt/misc/mingw-aligned-malloc.c +++ b/mingw-w64-crt/misc/mingw-aligned-malloc.c @@ -22,9 +22,10 @@ #define UI(p) ((uintptr_t) (p)) #define CP(p) ((char *) p) +#define GAP(offset) ((0 - offset) & (sizeof (void *) -1)) #define PTR_ALIGN(p0, alignment, offset) \ - ((void *) (((UI(p0) + (alignment + sizeof(void*)) + offset) \ - & (~UI(alignment - 1))) \ + ((void *) (((UI(p0) + (alignment + GAP(offset) + sizeof(void*)) + offset) \ + & (~UI(alignment))) \ - offset)) /* Pointer must sometimes be aligned; assume sizeof(void*) is a power of two. */ @@ -44,12 +45,13 @@ __mingw_aligned_offset_malloc (size_t size, size_t alignment, size_t offset) return ((void *) 0); if (alignment < sizeof (void *)) alignment = sizeof (void *); + alignment--; /* Including the extra sizeof(void*) is overkill on a 32-bit machine, since malloc is already 8-byte aligned, as long as we enforce alignment >= 8 ...but oh well. */ - p0 = malloc (size + (alignment + sizeof (void *))); + p0 = malloc (size + (alignment + GAP (offset) + sizeof (void *))); if (!p0) return ((void *) 0); p = PTR_ALIGN (p0, alignment, offset); @@ -88,6 +90,7 @@ __mingw_aligned_offset_realloc (void *memblock, size_t size, } if (alignment < sizeof (void *)) alignment = sizeof (void *); + alignment--; p0 = ORIG_PTR (memblock); /* It is an error for the alignment to change. */ @@ -95,7 +98,7 @@ __mingw_aligned_offset_realloc (void *memblock, size_t size, goto bad; shift = CP (memblock) - CP (p0); - p0 = realloc (p0, size + (alignment + sizeof (void *))); + p0 = realloc (p0, size + (alignment + GAP (offset) + sizeof (void *))); if (!p0) return ((void *) 0); p = PTR_ALIGN (p0, alignment, offset); @@ -131,6 +134,7 @@ __mingw_aligned_msize (void *memblock, size_t alignment, size_t offset) } if (alignment < sizeof (void *)) alignment = sizeof (void *); + alignment--; p0 = ORIG_PTR (memblock); @@ -141,5 +145,5 @@ __mingw_aligned_msize (void *memblock, size_t alignment, size_t offset) return (size_t)-1; } - return _msize (p0) - (alignment + sizeof (void *)); + return _msize (p0) - (alignment + GAP (offset) + sizeof (void *)); } -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public