Skip to content

Commit c1c5686

Browse files
mxindengretchenfrage
authored andcommitted
fix(udp/unix): don't panic on unknown address family
We have reports that on some MacOS 10.15 systems, recvmsg can return a non IPv4 or IPv4 `RecvMeta`, potentially due to uninitialized memory. Instead of panicking on an unknown address family, simply return an IO error. Fixes #2383.
1 parent 7468052 commit c1c5686

1 file changed

Lines changed: 11 additions & 7 deletions

File tree

quinn-udp/src/unix.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ fn recv(io: SockRef<'_>, bufs: &mut [IoSliceMut<'_>], meta: &mut [RecvMeta]) ->
498498
}
499499
};
500500
for i in 0..(msg_count as usize) {
501-
meta[i] = decode_recv(&names[i], &hdrs[i].msg_hdr, hdrs[i].msg_len as usize);
501+
meta[i] = decode_recv(&names[i], &hdrs[i].msg_hdr, hdrs[i].msg_len as usize)?;
502502
}
503503
Ok(msg_count as usize)
504504
}
@@ -533,7 +533,7 @@ fn recv(io: SockRef<'_>, bufs: &mut [IoSliceMut<'_>], meta: &mut [RecvMeta]) ->
533533
}
534534
};
535535
for i in 0..(msg_count as usize) {
536-
meta[i] = decode_recv(&names[i], &hdrs[i], hdrs[i].msg_datalen as usize);
536+
meta[i] = decode_recv(&names[i], &hdrs[i], hdrs[i].msg_datalen as usize)?;
537537
}
538538
Ok(msg_count as usize)
539539
}
@@ -562,7 +562,7 @@ fn recv(io: SockRef<'_>, bufs: &mut [IoSliceMut<'_>], meta: &mut [RecvMeta]) ->
562562
_ => return Err(e),
563563
}
564564
};
565-
meta[0] = decode_recv(&name, &hdr, n as usize);
565+
meta[0] = decode_recv(&name, &hdr, n as usize)?;
566566
Ok(1)
567567
}
568568

@@ -700,7 +700,7 @@ fn decode_recv(
700700
#[cfg(not(apple_fast))] hdr: &libc::msghdr,
701701
#[cfg(apple_fast)] hdr: &msghdr_x,
702702
len: usize,
703-
) -> RecvMeta {
703+
) -> io::Result<RecvMeta> {
704704
let name = unsafe { name.assume_init() };
705705
let mut ecn_bits = 0;
706706
let mut dst_ip = None;
@@ -778,17 +778,21 @@ fn decode_recv(
778778
addr.sin6_scope_id,
779779
))
780780
}
781-
_ => unreachable!(),
781+
f => {
782+
return Err(io::Error::other(format!(
783+
"expected AF_INET or AF_INET6, got {f} in decode_recv"
784+
)));
785+
}
782786
};
783787

784-
RecvMeta {
788+
Ok(RecvMeta {
785789
len,
786790
stride,
787791
addr,
788792
ecn: EcnCodepoint::from_bits(ecn_bits),
789793
dst_ip,
790794
interface_index,
791-
}
795+
})
792796
}
793797

794798
#[cfg(not(apple_slow))]

0 commit comments

Comments
 (0)