1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-20 13:16:53 +00:00

(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.
This commit is contained in:
Jordan Lee 2011-03-04 21:38:04 +00:00
parent 3fdd80eb0d
commit 918f6a96e0

View file

@ -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);