aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCory Fields <cory-nospam-@coryfields.com>2015-01-22 15:02:44 -0500
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-20 12:23:44 +0100
commitd7d187e8a451ae946fa14cead7962edbe0046f12 (patch)
treecaf6765dd0a9455891f14d2df42f164b56cfba13 /src
parentc7abfa595dda5b74b0386532dc6a685ab1c7f009 (diff)
downloadbitcoin-d7d187e8a451ae946fa14cead7962edbe0046f12.tar.xz
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.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am6
-rw-r--r--src/base58.h1
-rw-r--r--src/crypter.h2
-rw-r--r--src/key.h2
-rw-r--r--src/qt/askpassphrasedialog.cpp2
-rw-r--r--src/qt/walletmodel.h2
-rw-r--r--src/streams.h2
-rw-r--r--src/support/allocators/secure.h62
-rw-r--r--src/support/allocators/zeroafterfree.h48
-rw-r--r--src/support/pagelocker.cpp (renamed from src/allocators.cpp)6
-rw-r--r--src/support/pagelocker.h (renamed from src/allocators.h)96
-rw-r--r--src/test/allocator_tests.cpp2
12 files changed, 129 insertions, 102 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index da65efa713..4cefc541d0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -72,7 +72,6 @@ endif
BITCOIN_CORE_H = \
addrman.h \
alert.h \
- allocators.h \
amount.h \
arith_uint256.h \
base58.h \
@@ -123,7 +122,10 @@ BITCOIN_CORE_H = \
script/standard.h \
serialize.h \
streams.h \
+ support/allocators/secure.h \
+ support/allocators/zeroafterfree.h \
support/cleanse.h \
+ support/pagelocker.h \
sync.h \
threadsafety.h \
timedata.h \
@@ -233,7 +235,6 @@ univalue_libbitcoin_univalue_a_SOURCES = \
# common: shared between bitcoind, and bitcoin-qt and non-server tools
libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES)
libbitcoin_common_a_SOURCES = \
- allocators.cpp \
arith_uint256.cpp \
amount.cpp \
base58.cpp \
@@ -264,6 +265,7 @@ libbitcoin_common_a_SOURCES = \
# backward-compatibility objects and their sanity checks are linked.
libbitcoin_util_a_CPPFLAGS = $(BITCOIN_INCLUDES)
libbitcoin_util_a_SOURCES = \
+ support/pagelocker.cpp \
chainparamsbase.cpp \
clientversion.cpp \
compat/glibc_sanity.cpp \
diff --git a/src/base58.h b/src/base58.h
index ed134e6e77..8de90046a9 100644
--- a/src/base58.h
+++ b/src/base58.h
@@ -19,6 +19,7 @@
#include "pubkey.h"
#include "script/script.h"
#include "script/standard.h"
+#include "support/allocators/zeroafterfree.h"
#include <string>
#include <vector>
diff --git a/src/crypter.h b/src/crypter.h
index 8a91498e2e..32746b00df 100644
--- a/src/crypter.h
+++ b/src/crypter.h
@@ -5,9 +5,9 @@
#ifndef BITCOIN_CRYPTER_H
#define BITCOIN_CRYPTER_H
-#include "allocators.h"
#include "keystore.h"
#include "serialize.h"
+#include "support/allocators/secure.h"
class uint256;
diff --git a/src/key.h b/src/key.h
index 85cc1e55db..1f1d142887 100644
--- a/src/key.h
+++ b/src/key.h
@@ -6,8 +6,8 @@
#ifndef BITCOIN_KEY_H
#define BITCOIN_KEY_H
-#include "allocators.h"
#include "serialize.h"
+#include "support/allocators/secure.h"
#include "uint256.h"
#include <stdexcept>
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 9b7b59c0db..229139e65c 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -8,7 +8,7 @@
#include "guiconstants.h"
#include "walletmodel.h"
-#include "allocators.h"
+#include "support/allocators/secure.h"
#include <QKeyEvent>
#include <QMessageBox>
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index de915165f9..e263438880 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -8,7 +8,7 @@
#include "paymentrequestplus.h"
#include "walletmodeltransaction.h"
-#include "allocators.h" /* for SecureString */
+#include "support/allocators/secure.h"
#include <map>
#include <vector>
diff --git a/src/streams.h b/src/streams.h
index 9999c2341f..fa1e18defe 100644
--- a/src/streams.h
+++ b/src/streams.h
@@ -6,7 +6,7 @@
#ifndef BITCOIN_STREAMS_H
#define BITCOIN_STREAMS_H
-#include "allocators.h"
+#include "support/allocators/zeroafterfree.h"
#include "serialize.h"
#include <algorithm>
diff --git a/src/support/allocators/secure.h b/src/support/allocators/secure.h
new file mode 100644
index 0000000000..7a74d87bb4
--- /dev/null
+++ b/src/support/allocators/secure.h
@@ -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
diff --git a/src/support/allocators/zeroafterfree.h b/src/support/allocators/zeroafterfree.h
new file mode 100644
index 0000000000..b01fcd088b
--- /dev/null
+++ b/src/support/allocators/zeroafterfree.h
@@ -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
diff --git a/src/allocators.cpp b/src/support/pagelocker.cpp
index d3958aa4d7..440e0a5193 100644
--- a/src/allocators.cpp
+++ b/src/support/pagelocker.cpp
@@ -2,7 +2,11 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include "allocators.h"
+#include "support/pagelocker.h"
+
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
#ifdef WIN32
#ifdef _WIN32_WINNT
diff --git a/src/allocators.h b/src/support/pagelocker.h
index 8ffe015b9e..964be1aec4 100644
--- a/src/allocators.h
+++ b/src/support/pagelocker.h
@@ -3,15 +3,12 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_ALLOCATORS_H
-#define BITCOIN_ALLOCATORS_H
+#ifndef BITCOIN_ALLOCATORS_PAGELOCKER_H
+#define BITCOIN_ALLOCATORS_PAGELOCKER_H
#include "support/cleanse.h"
#include <map>
-#include <string>
-#include <string.h>
-#include <vector>
#include <boost/thread/mutex.hpp>
#include <boost/thread/once.hpp>
@@ -178,91 +175,4 @@ void UnlockObject(const T& t)
LockedPageManager::Instance().UnlockRange((void*)(&t), sizeof(T));
}
-//
-// 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);
- }
-};
-
-
-//
-// Allocator that clears its contents before deletion.
-//
-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);
- }
-};
-
-// This is exactly like std::string, but with a custom allocator.
-typedef std::basic_string<char, std::char_traits<char>, secure_allocator<char> > SecureString;
-
-// Byte-vector that clears its contents before deletion.
-typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData;
-
-#endif // BITCOIN_ALLOCATORS_H
+#endif // BITCOIN_ALLOCATORS_PAGELOCKER_H
diff --git a/src/test/allocator_tests.cpp b/src/test/allocator_tests.cpp
index d4df7b5415..2108efece5 100644
--- a/src/test/allocator_tests.cpp
+++ b/src/test/allocator_tests.cpp
@@ -4,7 +4,7 @@
#include "util.h"
-#include "allocators.h"
+#include "support/allocators/secure.h"
#include "test/test_bitcoin.h"
#include <boost/test/unit_test.hpp>