Some more info. This time I tried to run it under valgrind:
==30857== Invalid read of size 8
==30857== at 0x63F8E4A: RC4 (in /usr/lib/libcrypto.so.0.9.8)
==30857== by 0x60F1970: torrent::RC4::crypt(void*, unsigned) (rc4.h:55)
==30857== by 0x60F19C7: torrent::EncryptionInfo::decrypt(void*, unsigned)
(encryption_info.h:51)
==30857== by 0x60EEA36: torrent::Handshake::read_bitfield()
(handshake.cc:595)
==30857== by 0x60EFBEA: torrent::Handshake::event_read() (handshake.cc:734)
==30857== by 0x608CEAF: torrent::PollEPoll::perform() (poll_epoll.cc:135)
==30857== by 0x477054: (within /usr/bin/rtorrent)
==30857== by 0x432B05: (within /usr/bin/rtorrent)
==30857== by 0x78DCB43: (below main) (in /lib/libc-2.6.1.so)
==30857== Address 0xA4C0FE8 is 512 bytes inside a block of size 516 alloc'd
==30857== at 0x4C220C5: operator new[](unsigned long)
(vg_replace_malloc.c:199)
==30857== by 0x6085F9C: torrent::Bitfield::allocate() (bitfield.h:78)
==30857== by 0x60EE8CE: torrent::Handshake::read_bitfield()
(handshake.cc:582)
==30857== by 0x60EFBEA: torrent::Handshake::event_read() (handshake.cc:734)
==30857== by 0x608CEAF: torrent::PollEPoll::perform() (poll_epoll.cc:135)
==30857== by 0x477054: (within /usr/bin/rtorrent)
==30857== by 0x432B05: (within /usr/bin/rtorrent)
==30857== by 0x78DCB43: (below main) (in /lib/libc-2.6.1.so)
516 sounds alot like 512 + 4, and maybe it should have been + 8.
And:
==30857== Syscall param socketcall.recvfrom(buf) points to unaddressable
byte(s)==30857== at 0x7993645: recv (in /lib/libc-2.6.1.so)
==30857== by 0x60E847E: torrent::SocketStream::read_stream(void*, unsigned)
(socket_stream.h:86)
==30857== by 0x60E7FD1: torrent::SocketStream::read_stream_throws(void*,
unsigned) (socket_stream.cc:59)
==30857== by 0x60FE802: torrent::PeerConnectionSeed::event_read()
(peer_connection_seed.cc:234)
==30857== by 0x608CEAF: torrent::PollEPoll::perform() (poll_epoll.cc:135)
==30857== by 0x477054: (within /usr/bin/rtorrent)
==30857== by 0x432B05: (within /usr/bin/rtorrent)
==30857== by 0x78DCB43: (below main) (in /lib/libc-2.6.1.so)
==30857== Address 0xAEF0288 is 0 bytes after a block of size 536 alloc'd
==30857== at 0x4C22425: operator new(unsigned long)
(vg_replace_malloc.c:167)==30857== by 0x60F8977:
torrent::PeerConnectionBase::PeerConnectionBase() (peer_connection_base.cc:82)
==30857== by 0x60FF882: torrent::PeerConnectionSeed::PeerConnectionSeed()
(peer_connection_seed.h:46)
==30857== by 0x60FF810: torrent::createPeerConnectionSeed(bool)
(peer_factory.cc:58)
==30857== by 0x60CDB6A: torrent::ConnectionList::insert(torrent::PeerInfo*,
torrent::SocketFd const&, torrent::Bitfield*, torrent::EncryptionInfo*,
torrent::ProtocolExtension*) (connection_list.cc:63)
==30857== by 0x60F286A:
torrent::HandshakeManager::receive_succeeded(torrent::Handshake*)
(handshake_manager.cc:191)
==30857== by 0x60EFCE8: torrent::Handshake::event_read() (handshake.cc:749)
==30857== by 0x608CEAF: torrent::PollEPoll::perform() (poll_epoll.cc:135)
==30857== by 0x477054: (within /usr/bin/rtorrent)
==30857== by 0x432B05: (within /usr/bin/rtorrent)
==30857== by 0x78DCB43: (below main) (in /lib/libc-2.6.1.so)
So, at peer_connection_seed.cc:234 we see:
m_down->buffer()->move_end(m_download->download_throttle()->node_used_unthrottled(read_stream_throws(m_down->buffer()->end(),
read_size - m_down->buffer()->size_end())));
or:
read_stream_throws(m_down->buffer()->end(), read_size -
m_down->buffer()->size_end())
It's protected by an:
if (m_down->buffer()->size_end() == read_size)
throw internal_error("PeerConnectionSeed::event_read()
m_down->buffer()->size_end() == read_size.");
The buffer seems to be 512 bytes, read_size seems to be 64.
The check there seems wrong to me, it should probably check for
>= read_size, which seems to suggest that the bug is somewhere else.
Changing that makes it print out that error.
Kurt
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]