mirror of
https://github.com/transmission/transmission.git
synced 2025-12-24 20:35:36 +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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user