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:
parent
3fdd80eb0d
commit
918f6a96e0
1 changed files with 10 additions and 11 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue