Content-Length: 14396 | pFad | http://github.com/RustPython/RustPython/pull/632.patch

thub.com From 40c10ab70a7341a9d7c551176f3cff5fa00bfb62 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 8 Mar 2019 16:16:59 +0200 Subject: [PATCH 1/5] Handle unknown address family --- tests/snippets/stdlib_socket.py | 4 ++++ vm/src/builtins.rs | 1 + vm/src/stdlib/socket.rs | 13 +++++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index f984515ea6..7fb936e3c0 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -73,3 +73,7 @@ assert recv_b == MESSAGE_B sock1.close() sock3.close() + +### Errors +with assertRaises(OSError): + socket.socket(100, socket.SOCK_STREAM) 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..93a13c1003 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))), } } } @@ -146,7 +146,8 @@ fn socket_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { ] ); - let address_family = AddressFamily::from_i32(objint::get_value(family_int).to_i32().unwrap()); + let address_family = + AddressFamily::from_i32(vm, objint::get_value(family_int).to_i32().unwrap())?; let kind = SocketKind::from_i32(objint::get_value(kind_int).to_i32().unwrap()); let socket = RefCell::new(Socket::new(address_family, kind)); From 3fae8ccfbcc57735407e051786545f7f44429852 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 8 Mar 2019 16:19:26 +0200 Subject: [PATCH 2/5] Handle unknown socket kind --- tests/snippets/stdlib_socket.py | 3 +++ vm/src/stdlib/socket.rs | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index 7fb936e3c0..6428f52570 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -77,3 +77,6 @@ ### Errors with assertRaises(OSError): socket.socket(100, socket.SOCK_STREAM) + +with assertRaises(OSError): + socket.socket(socket.AF_INET, 1000) diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 93a13c1003..6c2fae51a3 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -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))), } } } @@ -148,7 +148,7 @@ fn socket_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let address_family = AddressFamily::from_i32(vm, objint::get_value(family_int).to_i32().unwrap())?; - let kind = SocketKind::from_i32(objint::get_value(kind_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)); From de0e76baf8890d42a97e7b2bb1e6fb9db1e62df8 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 8 Mar 2019 16:33:22 +0200 Subject: [PATCH 3/5] socket connect and bind throws OSError with indicative error message --- tests/snippets/stdlib_socket.py | 12 ++++++++++++ vm/src/stdlib/socket.rs | 33 +++++++++++++-------------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index 6428f52570..d0e2bd6356 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -29,9 +29,17 @@ 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)) @@ -74,6 +82,10 @@ sock1.close() sock3.close() +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +with assertRaises(OSError): + s.bind(("1.2.3.4", 888)) + ### Errors with assertRaises(OSError): socket.socket(100, socket.SOCK_STREAM) diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 6c2fae51a3..60c1ccf5c8 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -172,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())) @@ -207,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())), + }, } } From 76c43457b5859d084805dfbb66489c7b1cd4d0f3 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 8 Mar 2019 17:02:49 +0200 Subject: [PATCH 4/5] Add more OSError exceptions to socket --- tests/snippets/stdlib_socket.py | 12 ++++++++++ vm/src/stdlib/socket.rs | 42 ++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index d0e2bd6356..01000ccd9a 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -43,6 +43,13 @@ with assertRaises(TypeError): s.bind((888, 8888)) +s.bind(("127.0.0.1", 0)) +with assertRaises(OSError): + s.recv(100) + +with assertRaises(OSError): + s.send(MESSAGE_A) + s.close() # UDP @@ -86,6 +93,11 @@ with assertRaises(OSError): s.bind(("1.2.3.4", 888)) +s.bind(("127.0.0.1", 0)) +with assertRaises(OSError): + s.sendto(MESSAGE_A, ("1.2.3.4", 888)) + +s.close() ### Errors with assertRaises(OSError): socket.socket(100, socket.SOCK_STREAM) diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 60c1ccf5c8..99bd19aba4 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -266,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 { @@ -297,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)) @@ -320,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)?; @@ -337,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()) @@ -360,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())) } } } @@ -402,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())), } } From 8df0e46c322fc76b4095f3393fc90a646f744e0a Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Sat, 9 Mar 2019 09:29:33 +0200 Subject: [PATCH 5/5] Try to fix windows CI errors --- tests/snippets/stdlib_socket.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index 01000ccd9a..79efaa3639 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -43,6 +43,8 @@ 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) @@ -93,10 +95,6 @@ with assertRaises(OSError): s.bind(("1.2.3.4", 888)) -s.bind(("127.0.0.1", 0)) -with assertRaises(OSError): - s.sendto(MESSAGE_A, ("1.2.3.4", 888)) - s.close() ### Errors with assertRaises(OSError):








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.patch

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy