@@ -142,24 +142,23 @@ impl Socket {
142
142
}
143
143
}
144
144
145
- async fn recvfrom ( & self , buffer : & mut [ u8 ] ) -> io:: Result < ( usize , Endpoint ) > {
145
+ async fn recvfrom ( & self , buffer : & mut [ MaybeUninit < u8 > ] ) -> io:: Result < ( usize , Endpoint ) > {
146
146
future:: poll_fn ( |cx| {
147
147
self . with ( |socket| {
148
148
if socket. is_open ( ) {
149
149
if socket. can_recv ( ) {
150
- match socket. recv_slice ( buffer ) {
151
- Ok ( ( len , meta ) ) => match self . endpoint {
152
- Some ( ep ) => {
153
- if meta. endpoint == ep {
154
- Poll :: Ready ( Ok ( ( len , meta. endpoint ) ) )
155
- } else {
156
- buffer [ .. len] . iter_mut ( ) . for_each ( |x| * x = 0 ) ;
157
- socket . register_recv_waker ( cx . waker ( ) ) ;
158
- Poll :: Pending
159
- }
150
+ match socket. recv ( ) {
151
+ // Drop the packet when the provided buffer cannot
152
+ // fit the payload.
153
+ Ok ( ( data , meta) ) if data . len ( ) <= buffer . len ( ) => {
154
+ if self . endpoint . is_none_or ( |ep| meta. endpoint == ep ) {
155
+ buffer [ ..data . len ( ) ] . write_copy_of_slice ( data ) ;
156
+ Poll :: Ready ( Ok ( ( data . len ( ) , meta . endpoint ) ) )
157
+ } else {
158
+ socket . register_recv_waker ( cx . waker ( ) ) ;
159
+ Poll :: Pending
160
160
}
161
- None => Poll :: Ready ( Ok ( ( len, meta. endpoint ) ) ) ,
162
- } ,
161
+ }
163
162
_ => Poll :: Ready ( Err ( io:: Error :: EIO ) ) ,
164
163
}
165
164
} else {
@@ -175,24 +174,23 @@ impl Socket {
175
174
. map ( |( len, endpoint) | ( len, Endpoint :: Ip ( endpoint) ) )
176
175
}
177
176
178
- async fn read ( & self , buffer : & mut [ u8 ] ) -> io:: Result < usize > {
177
+ async fn read ( & self , buffer : & mut [ MaybeUninit < u8 > ] ) -> io:: Result < usize > {
179
178
future:: poll_fn ( |cx| {
180
179
self . with ( |socket| {
181
180
if socket. is_open ( ) {
182
181
if socket. can_recv ( ) {
183
- match socket. recv_slice ( buffer ) {
184
- Ok ( ( len , meta ) ) => match self . endpoint {
185
- Some ( ep ) => {
186
- if meta. endpoint == ep {
187
- Poll :: Ready ( Ok ( len ) )
188
- } else {
189
- buffer [ .. len] . iter_mut ( ) . for_each ( |x| * x = 0 ) ;
190
- socket . register_recv_waker ( cx . waker ( ) ) ;
191
- Poll :: Pending
192
- }
182
+ match socket. recv ( ) {
183
+ // Drop the packet when the provided buffer cannot
184
+ // fit the payload.
185
+ Ok ( ( data , meta) ) if data . len ( ) <= buffer . len ( ) => {
186
+ if self . endpoint . is_none_or ( |ep| meta . endpoint == ep ) {
187
+ buffer [ ..data . len ( ) ] . write_copy_of_slice ( data ) ;
188
+ Poll :: Ready ( Ok ( data . len ( ) ) )
189
+ } else {
190
+ socket . register_recv_waker ( cx . waker ( ) ) ;
191
+ Poll :: Pending
193
192
}
194
- None => Poll :: Ready ( Ok ( len) ) ,
195
- } ,
193
+ }
196
194
_ => Poll :: Ready ( Err ( io:: Error :: EIO ) ) ,
197
195
}
198
196
} else {
@@ -258,14 +256,11 @@ impl ObjectInterface for async_lock::RwLock<Socket> {
258
256
self . read ( ) . await . sendto ( buffer, endpoint) . await
259
257
}
260
258
261
- async fn recvfrom ( & self , buffer : & mut [ u8 ] ) -> io:: Result < ( usize , Endpoint ) > {
259
+ async fn recvfrom ( & self , buffer : & mut [ MaybeUninit < u8 > ] ) -> io:: Result < ( usize , Endpoint ) > {
262
260
self . read ( ) . await . recvfrom ( buffer) . await
263
261
}
264
262
265
263
async fn read ( & self , buffer : & mut [ MaybeUninit < u8 > ] ) -> io:: Result < usize > {
266
- // FIXME
267
- let buffer =
268
- unsafe { core:: slice:: from_raw_parts_mut ( buffer. as_mut_ptr ( ) . cast ( ) , buffer. len ( ) ) } ;
269
264
self . read ( ) . await . read ( buffer) . await
270
265
}
271
266
0 commit comments