From 4e969e9db74628cbbf38235592beea78b83d3840 Mon Sep 17 00:00:00 2001 From: lynskylate Date: Mon, 5 Aug 2019 07:10:28 +0800 Subject: [PATCH] Remove unsafe code --- tests/snippets/stdlib_socket.py | 2 +- vm/src/stdlib/socket.rs | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/tests/snippets/stdlib_socket.py b/tests/snippets/stdlib_socket.py index 1b9a2408b..8bd8bc204 100644 --- a/tests/snippets/stdlib_socket.py +++ b/tests/snippets/stdlib_socket.py @@ -120,4 +120,4 @@ with assertRaises(OSError) : socket.inet_aton("test") assert socket.inet_aton("127.0.0.1")==b"\x7f\x00\x00\x01" -assert socket.inet_aton("127.0.0.1")==b"\xff\xff\xff\xff" +assert socket.inet_aton("255.255.255.255")==b"\xff\xff\xff\xff" diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 8dc17f185..8775eb85d 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -2,7 +2,6 @@ use std::cell::RefCell; use std::io; use std::io::Read; use std::io::Write; -use std::mem::transmute; use std::net::{Ipv4Addr, SocketAddr, TcpListener, TcpStream, ToSocketAddrs, UdpSocket}; #[cfg(unix)] @@ -379,11 +378,11 @@ fn get_addr_tuple(vm: &VirtualMachine, addr: SocketAddr) -> PyResult { } #[cfg(unix)] -fn socket_gethostname(vm: &VirtualMachine) -> PyObjectRef { +fn socket_gethostname(vm: &VirtualMachine) -> PyResult { let mut buf = [0u8; 1024]; match gethostname(&mut buf) { - Ok(cstr) => vm.new_str(String::from(cstr.to_str().unwrap())), - Err(e) => convert_nix_error(vm, e), + Ok(cstr) => Ok(vm.new_str(String::from(cstr.to_str().unwrap()))), + Err(e) => Err(convert_nix_error(vm, e)), } } @@ -393,13 +392,11 @@ fn socket_sethostname(hostname: PyStringRef, vm: &VirtualMachine) -> PyResult<() } fn socket_inet_aton(ip_string: PyStringRef, vm: &VirtualMachine) -> PyResult { - match ip_string.as_str().parse::() { - Ok(ip_addr) => { - let out_bytes: [u8; 4] = unsafe { transmute(u32::from(ip_addr).to_be()) }; - Ok(vm.ctx.new_bytes(out_bytes.to_vec())) - } - Err(_) => Err(vm.new_os_error("illegal IP address string passed to inet_aton".to_string())), - } + ip_string + .as_str() + .parse::() + .map(|ip_addr| vm.ctx.new_bytes(ip_addr.octets().to_vec())) + .map_err(|_| vm.new_os_error("illegal IP address string passed to inet_aton".to_string())) } pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {