Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
allocators: split allocators and pagelocker
Pagelocker is only needed for secure (usually wallet) operations, so don't make the zero-after-free allocator depend on it.
- Loading branch information
Showing
12 changed files
with
129 additions
and
102 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2013 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_ALLOCATORS_SECURE_H | ||
#define BITCOIN_ALLOCATORS_SECURE_H | ||
|
||
#include "support/pagelocker.h" | ||
|
||
#include <string> | ||
|
||
// | ||
// Allocator that locks its contents from being paged | ||
// out of memory and clears its contents before deletion. | ||
// | ||
template <typename T> | ||
struct secure_allocator : public std::allocator<T> { | ||
// MSVC8 default copy constructor is broken | ||
typedef std::allocator<T> base; | ||
typedef typename base::size_type size_type; | ||
typedef typename base::difference_type difference_type; | ||
typedef typename base::pointer pointer; | ||
typedef typename base::const_pointer const_pointer; | ||
typedef typename base::reference reference; | ||
typedef typename base::const_reference const_reference; | ||
typedef typename base::value_type value_type; | ||
secure_allocator() throw() {} | ||
secure_allocator(const secure_allocator& a) throw() : base(a) {} | ||
template <typename U> | ||
secure_allocator(const secure_allocator<U>& a) throw() : base(a) | ||
{ | ||
} | ||
~secure_allocator() throw() {} | ||
template <typename _Other> | ||
struct rebind { | ||
typedef secure_allocator<_Other> other; | ||
}; | ||
|
||
T* allocate(std::size_t n, const void* hint = 0) | ||
{ | ||
T* p; | ||
p = std::allocator<T>::allocate(n, hint); | ||
if (p != NULL) | ||
LockedPageManager::Instance().LockRange(p, sizeof(T) * n); | ||
return p; | ||
} | ||
|
||
void deallocate(T* p, std::size_t n) | ||
{ | ||
if (p != NULL) { | ||
memory_cleanse(p, sizeof(T) * n); | ||
LockedPageManager::Instance().UnlockRange(p, sizeof(T) * n); | ||
} | ||
std::allocator<T>::deallocate(p, n); | ||
} | ||
}; | ||
|
||
// This is exactly like std::string, but with a custom allocator. | ||
typedef std::basic_string<char, std::char_traits<char>, secure_allocator<char> > SecureString; | ||
|
||
#endif // BITCOIN_ALLOCATORS_SECURE_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2013 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_ALLOCATORS_ZEROAFTERFREE_H | ||
#define BITCOIN_ALLOCATORS_ZEROAFTERFREE_H | ||
|
||
#include "support/cleanse.h" | ||
|
||
#include <memory> | ||
#include <vector> | ||
|
||
template <typename T> | ||
struct zero_after_free_allocator : public std::allocator<T> { | ||
// MSVC8 default copy constructor is broken | ||
typedef std::allocator<T> base; | ||
typedef typename base::size_type size_type; | ||
typedef typename base::difference_type difference_type; | ||
typedef typename base::pointer pointer; | ||
typedef typename base::const_pointer const_pointer; | ||
typedef typename base::reference reference; | ||
typedef typename base::const_reference const_reference; | ||
typedef typename base::value_type value_type; | ||
zero_after_free_allocator() throw() {} | ||
zero_after_free_allocator(const zero_after_free_allocator& a) throw() : base(a) {} | ||
template <typename U> | ||
zero_after_free_allocator(const zero_after_free_allocator<U>& a) throw() : base(a) | ||
{ | ||
} | ||
~zero_after_free_allocator() throw() {} | ||
template <typename _Other> | ||
struct rebind { | ||
typedef zero_after_free_allocator<_Other> other; | ||
}; | ||
|
||
void deallocate(T* p, std::size_t n) | ||
{ | ||
if (p != NULL) | ||
memory_cleanse(p, sizeof(T) * n); | ||
std::allocator<T>::deallocate(p, n); | ||
} | ||
}; | ||
|
||
// Byte-vector that clears its contents before deletion. | ||
typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData; | ||
|
||
#endif // BITCOIN_ALLOCATORS_ZEROAFTERFREE_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters