mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-12 04:42:36 -03:00
Fix out-of-bounds write in case of failing mmap(...) in PosixLockedPageAllocator::AllocateLocked
This commit is contained in:
parent
9c71998771
commit
ca126d490b
3 changed files with 9 additions and 2 deletions
|
@ -40,7 +40,11 @@ struct secure_allocator : public std::allocator<T> {
|
||||||
|
|
||||||
T* allocate(std::size_t n, const void* hint = 0)
|
T* allocate(std::size_t n, const void* hint = 0)
|
||||||
{
|
{
|
||||||
return static_cast<T*>(LockedPoolManager::Instance().alloc(sizeof(T) * n));
|
T* allocation = static_cast<T*>(LockedPoolManager::Instance().alloc(sizeof(T) * n));
|
||||||
|
if (!allocation) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
return allocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deallocate(T* p, std::size_t n)
|
void deallocate(T* p, std::size_t n)
|
||||||
|
|
|
@ -248,6 +248,9 @@ void *PosixLockedPageAllocator::AllocateLocked(size_t len, bool *lockingSuccess)
|
||||||
void *addr;
|
void *addr;
|
||||||
len = align_up(len, page_size);
|
len = align_up(len, page_size);
|
||||||
addr = mmap(nullptr, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
addr = mmap(nullptr, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
if (addr) {
|
if (addr) {
|
||||||
*lockingSuccess = mlock(addr, len) == 0;
|
*lockingSuccess = mlock(addr, len) == 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ public:
|
||||||
virtual ~LockedPageAllocator() {}
|
virtual ~LockedPageAllocator() {}
|
||||||
/** Allocate and lock memory pages.
|
/** Allocate and lock memory pages.
|
||||||
* If len is not a multiple of the system page size, it is rounded up.
|
* If len is not a multiple of the system page size, it is rounded up.
|
||||||
* Returns 0 in case of allocation failure.
|
* Returns nullptr in case of allocation failure.
|
||||||
*
|
*
|
||||||
* If locking the memory pages could not be accomplished it will still
|
* If locking the memory pages could not be accomplished it will still
|
||||||
* return the memory, however the lockingSuccess flag will be false.
|
* return the memory, however the lockingSuccess flag will be false.
|
||||||
|
|
Loading…
Reference in a new issue