Content-Length: 10024 | pFad | http://github.com/RustPython/RustPython/pull/632.diff

thub.com diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index f984515ea6..79efaa3639 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -29,12 +29,29 @@ with assertRaises(TypeError): s.connect(("127.0.0.1", 8888, 8888)) +with assertRaises(OSError): + # Lets hope nobody is listening on port 1 + s.connect(("127.0.0.1", 1)) + with assertRaises(TypeError): s.bind(("127.0.0.1", 8888, 8888)) +with assertRaises(OSError): + # Lets hope nobody run this test on machine with ip 1.2.3.4 + s.bind(("1.2.3.4", 8888)) + with assertRaises(TypeError): s.bind((888, 8888)) +s.close() +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.bind(("127.0.0.1", 0)) +with assertRaises(OSError): + s.recv(100) + +with assertRaises(OSError): + s.send(MESSAGE_A) + s.close() # UDP @@ -73,3 +90,15 @@ assert recv_b == MESSAGE_B sock1.close() sock3.close() + +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +with assertRaises(OSError): + s.bind(("1.2.3.4", 888)) + +s.close() +### Errors +with assertRaises(OSError): + socket.socket(100, socket.SOCK_STREAM) + +with assertRaises(OSError): + socket.socket(socket.AF_INET, 1000) diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index 8f4347734e..ec79c55710 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -802,6 +802,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef { "StopIteration" => ctx.exceptions.stop_iteration.clone(), "ZeroDivisionError" => ctx.exceptions.zero_division_error.clone(), "KeyError" => ctx.exceptions.key_error.clone(), + "OSError" => ctx.exceptions.os_error.clone(), }); #[cfg(not(target_arch = "wasm32"))] diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 4afe7a372f..99bd19aba4 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -24,12 +24,12 @@ enum AddressFamily { } impl AddressFamily { - fn from_i32(value: i32) -> AddressFamily { + fn from_i32(vm: &mut VirtualMachine, value: i32) -> Result { match value { - 1 => AddressFamily::Unix, - 2 => AddressFamily::Inet, - 3 => AddressFamily::Inet6, - _ => panic!("Unknown value: {}", value), + 1 => Ok(AddressFamily::Unix), + 2 => Ok(AddressFamily::Inet), + 3 => Ok(AddressFamily::Inet6), + _ => Err(vm.new_os_error(format!("Unknown address family value: {}", value))), } } } @@ -41,11 +41,11 @@ enum SocketKind { } impl SocketKind { - fn from_i32(value: i32) -> SocketKind { + fn from_i32(vm: &mut VirtualMachine, value: i32) -> Result { match value { - 1 => SocketKind::Stream, - 2 => SocketKind::Dgram, - _ => panic!("Unknown value: {}", value), + 1 => Ok(SocketKind::Stream), + 2 => Ok(SocketKind::Dgram), + _ => Err(vm.new_os_error(format!("Unknown socket kind value: {}", value))), } } } @@ -146,8 +146,9 @@ fn socket_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { ] ); - let address_family = AddressFamily::from_i32(objint::get_value(family_int).to_i32().unwrap()); - let kind = SocketKind::from_i32(objint::get_value(kind_int).to_i32().unwrap()); + let address_family = + AddressFamily::from_i32(vm, objint::get_value(family_int).to_i32().unwrap())?; + let kind = SocketKind::from_i32(vm, objint::get_value(kind_int).to_i32().unwrap())?; let socket = RefCell::new(Socket::new(address_family, kind)); @@ -171,21 +172,18 @@ fn socket_connect(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let mut socket = get_socket(zelf); match socket.socket_kind { - SocketKind::Stream => { - if let Ok(stream) = TcpStream::connect(address_string) { + SocketKind::Stream => match TcpStream::connect(address_string) { + Ok(stream) => { socket.con = Some(Connection::TcpStream(stream)); Ok(vm.get_none()) - } else { - // TODO: Socket error - Err(vm.new_type_error("socket failed".to_string())) } - } + Err(s) => Err(vm.new_os_error(s.to_string())), + }, SocketKind::Dgram => { if let Some(Connection::UdpSocket(con)) = &socket.con { match con.connect(address_string) { Ok(_) => Ok(vm.get_none()), - // TODO: Socket error - Err(_) => Err(vm.new_type_error("socket failed".to_string())), + Err(s) => Err(vm.new_os_error(s.to_string())), } } else { Err(vm.new_type_error("".to_string())) @@ -206,24 +204,20 @@ fn socket_bind(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let mut socket = get_socket(zelf); match socket.socket_kind { - SocketKind::Stream => { - if let Ok(stream) = TcpListener::bind(address_string) { + SocketKind::Stream => match TcpListener::bind(address_string) { + Ok(stream) => { socket.con = Some(Connection::TcpListener(stream)); Ok(vm.get_none()) - } else { - // TODO: Socket error - Err(vm.new_type_error("socket failed".to_string())) } - } - SocketKind::Dgram => { - if let Ok(dgram) = UdpSocket::bind(address_string) { + Err(s) => Err(vm.new_os_error(s.to_string())), + }, + SocketKind::Dgram => match UdpSocket::bind(address_string) { + Ok(dgram) => { socket.con = Some(Connection::UdpSocket(dgram)); Ok(vm.get_none()) - } else { - // TODO: Socket error - Err(vm.new_type_error("socket failed".to_string())) } - } + Err(s) => Err(vm.new_os_error(s.to_string())), + }, } } @@ -272,7 +266,7 @@ fn socket_accept(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let (tcp_stream, addr) = match ret { Ok((socket, addr)) => (socket, addr), - _ => return Err(vm.new_type_error("".to_string())), + Err(s) => return Err(vm.new_os_error(s.to_string())), }; let socket = RefCell::new(Socket { @@ -303,7 +297,10 @@ fn socket_recv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let mut buffer = vec![0u8; objint::get_value(bufsize).to_usize().unwrap()]; match socket.con { - Some(ref mut v) => v.read_exact(&mut buffer).unwrap(), + Some(ref mut v) => match v.read_exact(&mut buffer) { + Ok(_) => (), + Err(s) => return Err(vm.new_os_error(s.to_string())), + }, None => return Err(vm.new_type_error("".to_string())), }; Ok(vm.ctx.new_bytes(buffer)) @@ -326,7 +323,7 @@ fn socket_recvfrom(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let addr = match ret { Ok((_size, addr)) => addr, - _ => return Err(vm.new_type_error("".to_string())), + Err(s) => return Err(vm.new_os_error(s.to_string())), }; let addr_tuple = get_addr_tuple(vm, addr)?; @@ -343,7 +340,10 @@ fn socket_send(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let mut socket = get_socket(zelf); match socket.con { - Some(ref mut v) => v.write(&objbytes::get_value(&bytes)).unwrap(), + Some(ref mut v) => match v.write(&objbytes::get_value(&bytes)) { + Ok(_) => (), + Err(s) => return Err(vm.new_os_error(s.to_string())), + }, None => return Err(vm.new_type_error("".to_string())), }; Ok(vm.get_none()) @@ -366,22 +366,24 @@ fn socket_sendto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { match socket.socket_kind { SocketKind::Dgram => { match socket.con { - Some(ref mut v) => { - if let Ok(_) = v.send_to(&objbytes::get_value(&bytes), address_string) { - Ok(vm.get_none()) - } else { - Err(vm.new_type_error("socket failed".to_string())) - } - } + Some(ref mut v) => match v.send_to(&objbytes::get_value(&bytes), address_string) { + Ok(_) => Ok(vm.get_none()), + Err(s) => Err(vm.new_os_error(s.to_string())), + }, None => { // Doing implicit bind - if let Ok(dgram) = UdpSocket::bind("0.0.0.0:0") { - if let Ok(_) = dgram.send_to(&objbytes::get_value(&bytes), address_string) { - socket.con = Some(Connection::UdpSocket(dgram)); - return Ok(vm.get_none()); + match UdpSocket::bind("0.0.0.0:0") { + Ok(dgram) => { + match dgram.send_to(&objbytes::get_value(&bytes), address_string) { + Ok(_) => { + socket.con = Some(Connection::UdpSocket(dgram)); + Ok(vm.get_none()) + } + Err(s) => Err(vm.new_os_error(s.to_string())), + } } + Err(s) => Err(vm.new_os_error(s.to_string())), } - Err(vm.new_type_error("socket failed".to_string())) } } } @@ -408,7 +410,7 @@ fn socket_getsockname(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { match addr { Ok(addr) => get_addr_tuple(vm, addr), - _ => Err(vm.new_type_error("".to_string())), + Err(s) => Err(vm.new_os_error(s.to_string())), } }








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/RustPython/RustPython/pull/632.diff

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy