added asserts to catch broken peer allocations and frees as well as disk buffer corruption
This commit is contained in:
parent
f93960884c
commit
9baa280b52
|
@ -775,6 +775,7 @@ int main(int argc, char* argv[])
|
||||||
" -O Disallow disk job reordering\n"
|
" -O Disallow disk job reordering\n"
|
||||||
" -P <host:port> Use the specified SOCKS5 proxy\n"
|
" -P <host:port> Use the specified SOCKS5 proxy\n"
|
||||||
" -H Don't start DHT\n"
|
" -H Don't start DHT\n"
|
||||||
|
" -W <num peers> Set the max number of peers to keep in the peer list\n"
|
||||||
" "
|
" "
|
||||||
"\n\n"
|
"\n\n"
|
||||||
"TORRENT is a path to a .torrent file\n"
|
"TORRENT is a path to a .torrent file\n"
|
||||||
|
@ -895,6 +896,7 @@ int main(int argc, char* argv[])
|
||||||
case 't': poll_interval = atoi(arg); break;
|
case 't': poll_interval = atoi(arg); break;
|
||||||
case 'F': refresh_delay = atoi(arg); break;
|
case 'F': refresh_delay = atoi(arg); break;
|
||||||
case 'H': start_dht = false; --i; break;
|
case 'H': start_dht = false; --i; break;
|
||||||
|
case 'W': settings.max_peerlist_size = atoi(arg); break;
|
||||||
case 'x':
|
case 'x':
|
||||||
{
|
{
|
||||||
FILE* filter = fopen(arg, "r");
|
FILE* filter = fopen(arg, "r");
|
||||||
|
|
|
@ -310,6 +310,9 @@ namespace libtorrent
|
||||||
// this is set to true when this peer as been
|
// this is set to true when this peer as been
|
||||||
// pinged by the DHT
|
// pinged by the DHT
|
||||||
bool added_to_dht:1;
|
bool added_to_dht:1;
|
||||||
|
#endif
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
bool in_use:1;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/allocator.hpp"
|
#include "libtorrent/allocator.hpp"
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
|
#include "libtorrent/assert.hpp"
|
||||||
|
|
||||||
#ifdef TORRENT_WINDOWS
|
#ifdef TORRENT_WINDOWS
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
@ -47,6 +48,18 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <malloc.h> // memalign
|
#include <malloc.h> // memalign
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG_BUFFERS
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include "libtorrent/size_type.hpp"
|
||||||
|
|
||||||
|
struct alloc_header
|
||||||
|
{
|
||||||
|
libtorrent::size_type size;
|
||||||
|
int magic;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
int page_size()
|
int page_size()
|
||||||
|
@ -71,6 +84,21 @@ namespace libtorrent
|
||||||
|
|
||||||
char* page_aligned_allocator::malloc(const size_type bytes)
|
char* page_aligned_allocator::malloc(const size_type bytes)
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_DEBUG_BUFFERS
|
||||||
|
int page = page_size();
|
||||||
|
char* ret = (char*)valloc(bytes + 2 * page);
|
||||||
|
// make the two surrounding pages non-readable and -writable
|
||||||
|
TORRENT_ASSERT((bytes & (page-1)) == 0);
|
||||||
|
alloc_header* h = (alloc_header*)ret;
|
||||||
|
h->size = bytes;
|
||||||
|
h->magic = 0x1337;
|
||||||
|
mprotect(ret, page, PROT_READ);
|
||||||
|
mprotect(ret + page + bytes, page, PROT_READ);
|
||||||
|
// fprintf(stderr, "malloc: %p head: %p tail: %p size: %d\n", ret + page, ret, ret + page + bytes, int(bytes));
|
||||||
|
|
||||||
|
return ret + page;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TORRENT_USE_POSIX_MEMALIGN
|
#if TORRENT_USE_POSIX_MEMALIGN
|
||||||
void* ret;
|
void* ret;
|
||||||
if (posix_memalign(&ret, page_size(), bytes) != 0) ret = 0;
|
if (posix_memalign(&ret, page_size(), bytes) != 0) ret = 0;
|
||||||
|
@ -92,6 +120,22 @@ namespace libtorrent
|
||||||
|
|
||||||
void page_aligned_allocator::free(char* const block)
|
void page_aligned_allocator::free(char* const block)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG_BUFFERS
|
||||||
|
int page = page_size();
|
||||||
|
// make the two surrounding pages non-readable and -writable
|
||||||
|
mprotect(block - page, page, PROT_READ | PROT_WRITE);
|
||||||
|
alloc_header* h = (alloc_header*)(block - page);
|
||||||
|
TORRENT_ASSERT((h->size & (page-1)) == 0);
|
||||||
|
TORRENT_ASSERT(h->magic == 0x1337);
|
||||||
|
mprotect(block + h->size, page, PROT_READ | PROT_WRITE);
|
||||||
|
// fprintf(stderr, "free: %p head: %p tail: %p size: %d\n", block, block - page, block + h->size, int(h->size));
|
||||||
|
h->magic = 0;
|
||||||
|
|
||||||
|
::free(block - page);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TORRENT_WINDOWS
|
#ifdef TORRENT_WINDOWS
|
||||||
VirtualFree(block, 0, MEM_RELEASE);
|
VirtualFree(block, 0, MEM_RELEASE);
|
||||||
#elif defined TORRENT_BEOS
|
#elif defined TORRENT_BEOS
|
||||||
|
|
|
@ -385,6 +385,11 @@ namespace libtorrent
|
||||||
if (m_round_robin > i - m_peers.begin()) --m_round_robin;
|
if (m_round_robin > i - m_peers.begin()) --m_round_robin;
|
||||||
if (m_round_robin >= m_peers.size()) m_round_robin = 0;
|
if (m_round_robin >= m_peers.size()) m_round_robin = 0;
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
TORRENT_ASSERT((*i)->in_use);
|
||||||
|
(*i)->in_use = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TORRENT_USE_IPV6
|
#if TORRENT_USE_IPV6
|
||||||
if ((*i)->is_v6_addr)
|
if ((*i)->is_v6_addr)
|
||||||
{
|
{
|
||||||
|
@ -465,6 +470,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
if (erase_candidate > current) --erase_candidate;
|
if (erase_candidate > current) --erase_candidate;
|
||||||
TORRENT_ASSERT(current >= 0 && current < m_peers.size());
|
TORRENT_ASSERT(current >= 0 && current < m_peers.size());
|
||||||
|
--round_robin;
|
||||||
erase_peer(m_peers.begin() + current);
|
erase_peer(m_peers.begin() + current);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -601,6 +607,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
if (erase_candidate > current) --erase_candidate;
|
if (erase_candidate > current) --erase_candidate;
|
||||||
if (candidate > current) --candidate;
|
if (candidate > current) --candidate;
|
||||||
|
--m_round_robin;
|
||||||
erase_peer(m_peers.begin() + current);
|
erase_peer(m_peers.begin() + current);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -805,6 +812,9 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
(peer*)m_torrent->session().m_ipv4_peer_pool.malloc();
|
(peer*)m_torrent->session().m_ipv4_peer_pool.malloc();
|
||||||
if (p == 0) return false;
|
if (p == 0) return false;
|
||||||
|
|
||||||
|
// TORRENT_ASSERT(p->in_use == false);
|
||||||
|
|
||||||
#if TORRENT_USE_IPV6
|
#if TORRENT_USE_IPV6
|
||||||
if (is_v6)
|
if (is_v6)
|
||||||
m_torrent->session().m_ipv6_peer_pool.set_next_size(500);
|
m_torrent->session().m_ipv6_peer_pool.set_next_size(500);
|
||||||
|
@ -819,6 +829,10 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
new (p) ipv4_peer(c.remote(), false, 0);
|
new (p) ipv4_peer(c.remote(), false, 0);
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
p->in_use = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
iter = m_peers.insert(iter, p);
|
iter = m_peers.insert(iter, p);
|
||||||
|
|
||||||
if (m_round_robin >= iter - m_peers.begin()) ++m_round_robin;
|
if (m_round_robin >= iter - m_peers.begin()) ++m_round_robin;
|
||||||
|
@ -1085,8 +1099,17 @@ namespace libtorrent
|
||||||
if (p == 0) return 0;
|
if (p == 0) return 0;
|
||||||
m_torrent->session().m_i2p_peer_pool.set_next_size(500);
|
m_torrent->session().m_i2p_peer_pool.set_next_size(500);
|
||||||
new (p) i2p_peer(destination, true, src);
|
new (p) i2p_peer(destination, true, src);
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
p->in_use = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!insert_peer(p, iter, flags))
|
if (!insert_peer(p, iter, flags))
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
p->in_use = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
m_torrent->session().m_i2p_peer_pool.free((i2p_peer*)p);
|
m_torrent->session().m_i2p_peer_pool.free((i2p_peer*)p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1188,8 +1211,15 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
new (p) ipv4_peer(remote, true, src);
|
new (p) ipv4_peer(remote, true, src);
|
||||||
|
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
p->in_use = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!insert_peer(p, iter, flags))
|
if (!insert_peer(p, iter, flags))
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
p->in_use = false;
|
||||||
|
#endif
|
||||||
#if TORRENT_USE_IPV6
|
#if TORRENT_USE_IPV6
|
||||||
if (is_v6) m_torrent->session().m_ipv6_peer_pool.free((ipv6_peer*)p);
|
if (is_v6) m_torrent->session().m_ipv6_peer_pool.free((ipv6_peer*)p);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue