|
10 | 10 |
|
11 | 11 | use prelude::v1::*; |
12 | 12 |
|
| 13 | +use cmp; |
13 | 14 | use ffi::{CStr, CString}; |
14 | 15 | use fmt; |
15 | 16 | use io::{self, Error, ErrorKind}; |
@@ -198,10 +199,11 @@ impl TcpStream { |
198 | 199 | } |
199 | 200 |
|
200 | 201 | pub fn write(&self, buf: &[u8]) -> io::Result<usize> { |
| 202 | + let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t; |
201 | 203 | let ret = try!(cvt(unsafe { |
202 | 204 | c::send(*self.inner.as_inner(), |
203 | 205 | buf.as_ptr() as *const c_void, |
204 | | - buf.len() as wrlen_t, |
| 206 | + len, |
205 | 207 | 0) |
206 | 208 | })); |
207 | 209 | Ok(ret as usize) |
@@ -358,21 +360,23 @@ impl UdpSocket { |
358 | 360 | pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { |
359 | 361 | let mut storage: c::sockaddr_storage = unsafe { mem::zeroed() }; |
360 | 362 | let mut addrlen = mem::size_of_val(&storage) as c::socklen_t; |
| 363 | + let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t; |
361 | 364 |
|
362 | 365 | let n = try!(cvt(unsafe { |
363 | 366 | c::recvfrom(*self.inner.as_inner(), |
364 | 367 | buf.as_mut_ptr() as *mut c_void, |
365 | | - buf.len() as wrlen_t, 0, |
| 368 | + len, 0, |
366 | 369 | &mut storage as *mut _ as *mut _, &mut addrlen) |
367 | 370 | })); |
368 | 371 | Ok((n as usize, try!(sockaddr_to_addr(&storage, addrlen as usize)))) |
369 | 372 | } |
370 | 373 |
|
371 | 374 | pub fn send_to(&self, buf: &[u8], dst: &SocketAddr) -> io::Result<usize> { |
| 375 | + let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t; |
372 | 376 | let (dstp, dstlen) = dst.into_inner(); |
373 | 377 | let ret = try!(cvt(unsafe { |
374 | 378 | c::sendto(*self.inner.as_inner(), |
375 | | - buf.as_ptr() as *const c_void, buf.len() as wrlen_t, |
| 379 | + buf.as_ptr() as *const c_void, len, |
376 | 380 | 0, dstp, dstlen) |
377 | 381 | })); |
378 | 382 | Ok(ret as usize) |
|
0 commit comments