fix memory leak in uTP

This commit is contained in:
Arvid Norberg 2014-01-18 08:15:13 +00:00
parent f28e6c8c81
commit 13b1628f7a
1 changed files with 33 additions and 1 deletions

View File

@ -1564,6 +1564,29 @@ void utp_socket_impl::remove_sack_header(packet* p)
p->size -= sack_size + 2;
}
struct holder
{
holder(char* buf = NULL): m_buf(buf) {}
~holder() { free(m_buf); }
void reset(char* buf)
{
free(m_buf);
m_buf = buf;
}
char* release()
{
char* ret = m_buf;
m_buf = NULL;
return ret;
}
private:
char* m_buf;
};
// sends a packet, pulls data from the write buffer (if there's any)
// if ack is true, we need to send a packet regardless of if there's
// any data. Returns true if we could send more data (i.e. call
@ -1676,6 +1699,10 @@ bool utp_socket_impl::send_pkt(int flags)
bool stack_alloced = false;
#endif
// used to free the packet buffer in case we exit the
// function early
holder buf_holder;
// payload size being zero means we're just sending
// an force. We should not pick up the nagle packet
if (!m_nagle_packet || (payload_size == 0 && force))
@ -1686,6 +1713,7 @@ bool utp_socket_impl::send_pkt(int flags)
{
p = (packet*)malloc(sizeof(packet) + m_mtu);
p->allocated = m_mtu;
buf_holder.reset((char*)p);
m_sm->inc_stats_counter(utp_socket_manager::payload_pkts_out);
}
@ -1805,6 +1833,7 @@ bool utp_socket_impl::send_pkt(int flags)
TORRENT_ASSERT(m_nagle_packet == NULL);
TORRENT_ASSERT(h->seq_nr == m_seq_nr);
m_nagle_packet = p;
buf_holder.release();
return false;
}
@ -1900,7 +1929,6 @@ bool utp_socket_impl::send_pkt(int flags)
else if (ec)
{
TORRENT_ASSERT(stack_alloced != bool(payload_size));
if (payload_size) free(p);
m_error = ec;
m_state = UTP_STATE_ERROR_WAIT;
test_socket_state();
@ -1925,6 +1953,10 @@ bool utp_socket_impl::send_pkt(int flags)
TORRENT_ASSERT(!m_outbuf.at(m_seq_nr));
#endif
TORRENT_ASSERT(h->seq_nr == m_seq_nr);
// release the buffer, we're saving it in the circular
// buffer of outgoing packets
buf_holder.release();
packet* old = (packet*)m_outbuf.insert(m_seq_nr, p);
if (old)
{