fix "leak" in Blob::recv_from (#1198)

* fix "leak" in Blob::recv_from

fixes #1199
This commit is contained in:
Rob Walker
2018-09-12 14:45:43 -07:00
committed by GitHub
parent e7a910b664
commit 9ab5692acf

View File

@ -441,6 +441,18 @@ impl Blob {
self.meta.size = new_size; self.meta.size = new_size;
self.set_data_size(new_size as u64).unwrap(); self.set_data_size(new_size as u64).unwrap();
} }
pub fn recv_blob(socket: &UdpSocket, r: &SharedBlob) -> io::Result<()> {
let mut p = r.write().expect("'r' write lock in pub fn recv_from");
trace!("receiving on {}", socket.local_addr().unwrap());
let (nrecv, from) = socket.recv_from(&mut p.data)?;
p.meta.size = nrecv;
p.meta.set_addr(&from);
trace!("got {} bytes from {}", nrecv, from);
Ok(())
}
pub fn recv_from(re: &BlobRecycler, socket: &UdpSocket) -> Result<SharedBlobs> { pub fn recv_from(re: &BlobRecycler, socket: &UdpSocket) -> Result<SharedBlobs> {
let mut v = Vec::new(); let mut v = Vec::new();
//DOCUMENTED SIDE-EFFECT //DOCUMENTED SIDE-EFFECT
@ -452,10 +464,8 @@ impl Blob {
socket.set_nonblocking(false)?; socket.set_nonblocking(false)?;
for i in 0..NUM_BLOBS { for i in 0..NUM_BLOBS {
let r = re.allocate(); let r = re.allocate();
{
let mut p = r.write().expect("'r' write lock in pub fn recv_from"); match Blob::recv_blob(socket, &r) {
trace!("receiving on {}", socket.local_addr().unwrap());
match socket.recv_from(&mut p.data) {
Err(_) if i > 0 => { Err(_) if i > 0 => {
trace!("got {:?} messages on {}", i, socket.local_addr().unwrap()); trace!("got {:?} messages on {}", i, socket.local_addr().unwrap());
break; break;
@ -464,17 +474,12 @@ impl Blob {
if e.kind() != io::ErrorKind::WouldBlock { if e.kind() != io::ErrorKind::WouldBlock {
info!("recv_from err {:?}", e); info!("recv_from err {:?}", e);
} }
re.recycle(r, "Blob::recv_from");
return Err(Error::IO(e)); return Err(Error::IO(e));
} }
Ok((nrecv, from)) => { Ok(()) => if i == 0 {
p.meta.size = nrecv;
p.meta.set_addr(&from);
trace!("got {} bytes from {}", nrecv, from);
if i == 0 {
socket.set_nonblocking(true)?; socket.set_nonblocking(true)?;
} },
}
}
} }
v.push(r); v.push(r);
} }