Skip to content

Commit 14697fa

Browse files
committed
feat(driver): check control buffer alignment in RecvMsg/SendMsg
1 parent 10da37e commit 14697fa

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

compio-driver/src/iocp/op.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ use windows_sys::{
2727
},
2828
Networking::WinSock::{
2929
closesocket, setsockopt, shutdown, socklen_t, WSAIoctl, WSARecv, WSARecvFrom, WSASend,
30-
WSASendMsg, WSASendTo, LPFN_ACCEPTEX, LPFN_CONNECTEX, LPFN_GETACCEPTEXSOCKADDRS,
31-
LPFN_WSARECVMSG, SD_BOTH, SD_RECEIVE, SD_SEND, SIO_GET_EXTENSION_FUNCTION_POINTER,
32-
SOCKADDR, SOCKADDR_STORAGE, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
33-
SO_UPDATE_CONNECT_CONTEXT, WSABUF, WSAID_ACCEPTEX, WSAID_CONNECTEX,
34-
WSAID_GETACCEPTEXSOCKADDRS, WSAID_WSARECVMSG, WSAMSG,
30+
WSASendMsg, WSASendTo, CMSGHDR, LPFN_ACCEPTEX, LPFN_CONNECTEX,
31+
LPFN_GETACCEPTEXSOCKADDRS, LPFN_WSARECVMSG, SD_BOTH, SD_RECEIVE, SD_SEND,
32+
SIO_GET_EXTENSION_FUNCTION_POINTER, SOCKADDR, SOCKADDR_STORAGE, SOL_SOCKET,
33+
SO_UPDATE_ACCEPT_CONTEXT, SO_UPDATE_CONNECT_CONTEXT, WSABUF, WSAID_ACCEPTEX,
34+
WSAID_CONNECTEX, WSAID_GETACCEPTEXSOCKADDRS, WSAID_WSARECVMSG, WSAMSG,
3535
},
3636
Storage::FileSystem::{FlushFileBuffers, ReadFile, WriteFile},
3737
System::{
@@ -792,6 +792,10 @@ pub struct RecvMsg<T: IoVectoredBufMut, C: IoBufMut, S> {
792792
impl<T: IoVectoredBufMut, C: IoBufMut, S> RecvMsg<T, C, S> {
793793
/// Create [`RecvMsgVectored`].
794794
pub fn new(fd: SharedFd<S>, buffer: T, control: C) -> Self {
795+
assert!(
796+
control.as_buf_ptr().cast::<CMSGHDR>().is_aligned(),
797+
"misaligned control message buffer"
798+
);
795799
Self {
796800
addr: unsafe { std::mem::zeroed() },
797801
addr_len: std::mem::size_of::<SOCKADDR_STORAGE>() as _,
@@ -859,6 +863,10 @@ pub struct SendMsg<T: IoVectoredBuf, C: IoBuf, S> {
859863
impl<T: IoVectoredBuf, C: IoBuf, S> SendMsg<T, C, S> {
860864
/// Create [`SendMsgVectored`].
861865
pub fn new(fd: SharedFd<S>, buffer: T, control: C, addr: SockAddr) -> Self {
866+
assert!(
867+
control.as_buf_ptr().cast::<CMSGHDR>().is_aligned(),
868+
"misaligned control message buffer"
869+
);
862870
Self {
863871
fd,
864872
buffer,

compio-driver/src/unix/op.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,10 @@ pub struct RecvMsg<T: IoVectoredBufMut, C: IoBufMut, S> {
384384
impl<T: IoVectoredBufMut, C: IoBufMut, S> RecvMsg<T, C, S> {
385385
/// Create [`RecvMsgVectored`].
386386
pub fn new(fd: SharedFd<S>, buffer: T, control: C) -> Self {
387+
assert!(
388+
control.as_buf_ptr().cast::<libc::cmsghdr>().is_aligned(),
389+
"misaligned control message buffer"
390+
);
387391
Self {
388392
addr: unsafe { std::mem::zeroed() },
389393
msg: unsafe { std::mem::zeroed() },
@@ -430,6 +434,10 @@ pub struct SendMsg<T: IoVectoredBuf, C: IoBuf, S> {
430434
impl<T: IoVectoredBuf, C: IoBuf, S> SendMsg<T, C, S> {
431435
/// Create [`SendMsgVectored`].
432436
pub fn new(fd: SharedFd<S>, buffer: T, control: C, addr: SockAddr) -> Self {
437+
assert!(
438+
control.as_buf_ptr().cast::<libc::cmsghdr>().is_aligned(),
439+
"misaligned control message buffer"
440+
);
433441
Self {
434442
msg: unsafe { std::mem::zeroed() },
435443
fd,

0 commit comments

Comments
 (0)