|
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