From 918f6a96e0a341800c37a69d5c87dbb3e91f7248 Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Fri, 4 Mar 2011 21:38:04 +0000 Subject: [PATCH] (trunk libT) fix possible memory leak in tr-udp's EV_READ handler. The EV_READ callback allocates a buffer, but then returns without freeing it if recvfrom() returns <= 0. This commit inverts the logic to avoid returning until the buffer's been free()d. --- libtransmission/tr-udp.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/libtransmission/tr-udp.c b/libtransmission/tr-udp.c index 730f28313..8dd5da7c5 100644 --- a/libtransmission/tr-udp.c +++ b/libtransmission/tr-udp.c @@ -204,17 +204,16 @@ event_callback(int s, short type UNUSED, void *sv) fromlen = sizeof(from); rc = recvfrom(s, buf, 4096 - 1, 0, (struct sockaddr*)&from, &fromlen); - if(rc <= 0) - return; - - if( buf[0] == 'd' ) { - /* DHT packet. */ - buf[rc] = '\0'; - tr_dhtCallback(buf, rc, (struct sockaddr*)&from, fromlen, sv); - } else { - rc = tr_utpPacket(buf, rc, (struct sockaddr*)&from, fromlen, ss); - if(!rc) - tr_ndbg("UDP", "Unexpected UDP packet"); + if(rc > 0) { + if( buf[0] == 'd' ) { + /* DHT packet. */ + buf[rc] = '\0'; + tr_dhtCallback(buf, rc, (struct sockaddr*)&from, fromlen, sv); + } else { + rc = tr_utpPacket(buf, rc, (struct sockaddr*)&from, fromlen, ss); + if(!rc) + tr_ndbg("UDP", "Unexpected UDP packet"); + } } free(buf);