Description
Problem
Before call:
MultiHeaders { items: [mmsghdr { msg_hdr: msghdr { msg_name: 0x1, msg_namelen: 0, msg_iov: 0x5583b86edbe0, msg_iovlen: 1, msg_control: 0x5583b86edc30, msg_controllen: 32, msg_flags: 0 }, msg_len: 0 }], addresses: [core::mem::maybe_uninit::MaybeUninit<()>], _cmsg_buffers: Some([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), msg_controllen: 32 }
After call:
MultiHeaders { items: [mmsghdr { msg_hdr: msghdr { msg_name: 0x1, msg_namelen: 28, msg_iov: 0x5583b86edbe0, msg_iovlen: 1, msg_control: 0x5583b86edc30, msg_controllen: 32, msg_flags: 0 }, msg_len: 1200 }], addresses: [core::mem::maybe_uninit::MaybeUninit<()>], _cmsg_buffers: Some([32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 30, 33, 234, 102, 0, 0, 0, 0, 139, 247, 225, 58, 0, 0, 0, 0]), msg_controllen: 32 }
The main thing to call out is that the kernel set the msg_namelen
value to 28
. This makes re-using MultiHeader for subsequent reads impossible because the kernel will complain with err=Bad address (os error 14)
due to the fact we have a msg_name: NULL
and msg_namelen: 28
in the input.
I'd like to re-use MultiHeader
for subsequent reads and have confirmed it works if I instead use MultiHeaders<UnixAddr>
, as we now have space of the address to be written.
Potential Solution
Letting the caller set the msglen
would allow us to re-zero it so the kernel doesn't think we have space available for an address when we don't.
Side Question
Do you know why msg_name renders like this: msg_hdr.msg_name: 0x1
, I would have thought 0x0
for NULL
?