Skip to content

Commit a5feb1a

Browse files
committed
detect failed allocations from posix_memalign
- `posix_memalign` doesn't touch its pointer-to-pointer parameter when it fails, so `AlignedAlloc` ended up returning stack garbage in that case.
1 parent 6a80196 commit a5feb1a

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

include/swift/Basic/Malloc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ inline void *AlignedAlloc(size_t size, size_t align) {
3434
if (align < sizeof(void*))
3535
align = sizeof(void*);
3636

37-
void *r;
3837
#if defined(_WIN32)
39-
r = _aligned_malloc(size, align);
38+
void *r = _aligned_malloc(size, align);
4039
assert(r && "_aligned_malloc failed");
4140
#else
41+
void *r = nullptr;
4242
int res = posix_memalign(&r, align, size);
4343
assert(res == 0 && "posix_memalign failed");
4444
(void)res; // Silence the unused variable warning.

test/stdlib/UnsafeRawPointer.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,4 +229,18 @@ UnsafeMutableRawPointerExtraTestSuite.test("moveInitialize:from:") {
229229
check(Check.RightOverlap)
230230
}
231231

232+
UnsafeMutableRawPointerExtraTestSuite.test("absurd.allocation.misaligned") {
233+
expectCrashLater()
234+
let mustFail = UnsafeMutableRawPointer.allocate(byteCount: 1024,
235+
alignment: 19)
236+
expectUnreachable()
237+
}
238+
239+
UnsafeMutableRawPointerExtraTestSuite.test("absurd.allocation.gargantuan") {
240+
expectCrashLater()
241+
let mustFail = UnsafeMutableRawPointer.allocate(byteCount: 400000000000000000,
242+
alignment: 0)
243+
expectUnreachable()
244+
}
245+
232246
runAllTests()

0 commit comments

Comments
 (0)