Skip to content

Commit 8eb5e2d

Browse files
committed
implement MSG_TRUNC
1 parent e72117e commit 8eb5e2d

3 files changed

Lines changed: 30 additions & 15 deletions

File tree

tee/kernel/src/fs/fd/unix_socket/dgram.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,15 @@ impl OpenFileDescription for DgramUnixSocket {
406406
) -> Result<(usize, Option<SocketAddr>)> {
407407
let packet = self.recv_packet(flags)?;
408408

409-
let len = cmp::min(packet.data.len(), buf.buffer_len());
410-
buf.write(0, &packet.data[..len])?;
409+
let len = packet.data.len();
410+
let written = cmp::min(len, buf.buffer_len());
411+
buf.write(0, &packet.data[..written])?;
411412

413+
let len = if flags.contains(RecvFromFlags::TRUNC) {
414+
len
415+
} else {
416+
written
417+
};
412418
let addr = packet.sender_addr.lock().clone().map(SocketAddr::Unix);
413419

414420
Ok((len, addr))
@@ -429,9 +435,12 @@ impl OpenFileDescription for DgramUnixSocket {
429435
let mut packet = self.recv_packet(recv_from_flags)?;
430436

431437
let mut vectored_buf = VectoredUserBuf::new(vm, msg_hdr.iov, msg_hdr.iovlen, abi)?;
432-
let len = cmp::min(packet.data.len(), ReadBuf::buffer_len(&vectored_buf));
438+
let len = packet.data.len();
439+
let written = cmp::min(len, ReadBuf::buffer_len(&vectored_buf));
433440
vectored_buf.write(0, &packet.data[..len])?;
434441

442+
msg_hdr.flags.set(MsgHdrFlags::TRUNC, written < len);
443+
435444
if msg_hdr.namelen != 0 {
436445
let addr = packet.sender_addr.lock().clone().map(SocketAddr::Unix);
437446
if let Some(addr) = addr {

tee/kernel/src/net/udp.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,12 @@ impl UdpSocket {
274274
Ok(guard.socketname.unwrap())
275275
}
276276

277-
/// Returns a tuple of (size, truncated, sender, matching destination address)
277+
/// Returns a tuple of (written, len, sender, matching destination address)
278278
fn recv(
279279
&self,
280280
buf: &mut (impl ReadBuf + ?Sized),
281281
peek: bool,
282-
) -> Result<(usize, bool, net::SocketAddr, IpAddr)> {
282+
) -> Result<(usize, usize, net::SocketAddr, IpAddr)> {
283283
let mut guard = self.internal.lock();
284284
let packed_owned;
285285
let packet = if peek {
@@ -289,15 +289,15 @@ impl UdpSocket {
289289
&packed_owned
290290
};
291291

292-
let truncated = buf.buffer_len() < packet.bytes.len();
293-
let len = cmp::min(buf.buffer_len(), packet.bytes.len());
294-
buf.write(0, &packet.bytes[..len])?;
292+
let len = packet.bytes.len();
293+
let written = cmp::min(buf.buffer_len(), packet.bytes.len());
294+
buf.write(0, &packet.bytes[..written])?;
295295

296296
if guard.rx.is_empty() {
297297
self.rx_notify.notify();
298298
}
299299

300-
Ok((len, truncated, packet.source, packet.destination))
300+
Ok((written, len, packet.source, packet.destination))
301301
}
302302

303303
fn send(
@@ -827,8 +827,8 @@ impl OpenFileDescription for UdpSocket {
827827
}
828828

829829
fn read(&self, buf: &mut dyn ReadBuf, _: &FileAccessContext) -> Result<usize> {
830-
let (len, _, _, _) = self.recv(buf, false)?;
831-
Ok(len)
830+
let (written, _, _, _) = self.recv(buf, false)?;
831+
Ok(written)
832832
}
833833

834834
fn recv_from(
@@ -837,7 +837,12 @@ impl OpenFileDescription for UdpSocket {
837837
flags: RecvFromFlags,
838838
) -> Result<(usize, Option<SocketAddr>)> {
839839
let peek = flags.contains(RecvFromFlags::PEEK);
840-
let (len, _, source, _) = self.recv(buf, peek)?;
840+
let (written, len, source, _) = self.recv(buf, peek)?;
841+
let len = if flags.contains(RecvFromFlags::TRUNC) {
842+
len
843+
} else {
844+
written
845+
};
841846
Ok((len, Some(SocketAddr::from(source))))
842847
}
843848

@@ -852,9 +857,9 @@ impl OpenFileDescription for UdpSocket {
852857
) -> Result<usize> {
853858
let mut vectored_buf = VectoredUserBuf::new(vm, msg_hdr.iov, msg_hdr.iovlen, abi)?;
854859
let peek = flags.contains(RecvMsgFlags::PEEK);
855-
let (len, truncated, source, destination) = self.recv(&mut vectored_buf, peek)?;
860+
let (written, len, source, destination) = self.recv(&mut vectored_buf, peek)?;
856861

857-
msg_hdr.flags.set(MsgHdrFlags::TRUNC, truncated);
862+
msg_hdr.flags.set(MsgHdrFlags::TRUNC, written < len);
858863

859864
if msg_hdr.namelen != 0 {
860865
let source = SocketAddr::from(source);
@@ -911,7 +916,7 @@ impl OpenFileDescription for UdpSocket {
911916
}
912917
drop(cmsg_builder);
913918

914-
Ok(len)
919+
Ok(written)
915920
}
916921

917922
fn write(&self, buf: &dyn WriteBuf, ctx: &FileAccessContext) -> Result<usize> {

tee/kernel/src/user/syscall/args.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,6 +1886,7 @@ bitflags! {
18861886
pub struct RecvFromFlags {
18871887
const OOB = 1 << 0;
18881888
const PEEK = 1 << 1;
1889+
const TRUNC = 1 << 5;
18891890
const DONTWAIT = 1 << 6;
18901891
const WAITALL = 1 << 8;
18911892
}

0 commit comments

Comments
 (0)