@@ -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 > {
0 commit comments