diff options
| author | Luke Dashjr <[email protected]> | 2012-01-05 18:17:58 -0500 |
|---|---|---|
| committer | Luke Dashjr <[email protected]> | 2012-01-05 18:17:58 -0500 |
| commit | 780a1823177e851f75b6f22e7f7bfe49b7938862 (patch) | |
| tree | be80fefe4505c3c1bc85544b0cf9d3da642eaa1c /src/serialize.h | |
| parent | Fix transaction type in UI: not all tx'es with "from"/"to" field are necessar... (diff) | |
| parent | Fix horrific performance found by gmaxwell. (diff) | |
| download | discoin-780a1823177e851f75b6f22e7f7bfe49b7938862.tar.xz discoin-780a1823177e851f75b6f22e7f7bfe49b7938862.zip | |
Merge branch '0.4.x' into 0.5.0.x
Diffstat (limited to 'src/serialize.h')
| -rw-r--r-- | src/serialize.h | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/serialize.h b/src/serialize.h index fdfd6346e..0f075a5bf 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -829,6 +829,38 @@ struct secure_allocator : public std::allocator<T> }; +// +// 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) + memset(p, 0, sizeof(T) * n); + std::allocator<T>::deallocate(p, n); + } +}; + + // // Double ended buffer combining vector and stream-like interfaces. @@ -838,7 +870,7 @@ struct secure_allocator : public std::allocator<T> class CDataStream { protected: - typedef std::vector<char, secure_allocator<char> > vector_type; + typedef std::vector<char, zero_after_free_allocator<char> > vector_type; vector_type vch; unsigned int nReadPos; short state; |