Skip to content

Commit 76c4345

Browse files
committed
Add more OSError exceptions to socket
1 parent de0e76b commit 76c4345

File tree

2 files changed

+37
-17
lines changed

2 files changed

+37
-17
lines changed

tests/snippets/stdlib_socket.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@
4343
with assertRaises(TypeError):
4444
s.bind((888, 8888))
4545

46+
s.bind(("127.0.0.1", 0))
47+
with assertRaises(OSError):
48+
s.recv(100)
49+
50+
with assertRaises(OSError):
51+
s.send(MESSAGE_A)
52+
4653
s.close()
4754

4855
# UDP
@@ -86,6 +93,11 @@
8693
with assertRaises(OSError):
8794
s.bind(("1.2.3.4", 888))
8895

96+
s.bind(("127.0.0.1", 0))
97+
with assertRaises(OSError):
98+
s.sendto(MESSAGE_A, ("1.2.3.4", 888))
99+
100+
s.close()
89101
### Errors
90102
with assertRaises(OSError):
91103
socket.socket(100, socket.SOCK_STREAM)

vm/src/stdlib/socket.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ fn socket_accept(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
266266

267267
let (tcp_stream, addr) = match ret {
268268
Ok((socket, addr)) => (socket, addr),
269-
_ => return Err(vm.new_type_error("".to_string())),
269+
Err(s) => return Err(vm.new_os_error(s.to_string())),
270270
};
271271

272272
let socket = RefCell::new(Socket {
@@ -297,7 +297,10 @@ fn socket_recv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
297297

298298
let mut buffer = vec![0u8; objint::get_value(bufsize).to_usize().unwrap()];
299299
match socket.con {
300-
Some(ref mut v) => v.read_exact(&mut buffer).unwrap(),
300+
Some(ref mut v) => match v.read_exact(&mut buffer) {
301+
Ok(_) => (),
302+
Err(s) => return Err(vm.new_os_error(s.to_string())),
303+
},
301304
None => return Err(vm.new_type_error("".to_string())),
302305
};
303306
Ok(vm.ctx.new_bytes(buffer))
@@ -320,7 +323,7 @@ fn socket_recvfrom(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
320323

321324
let addr = match ret {
322325
Ok((_size, addr)) => addr,
323-
_ => return Err(vm.new_type_error("".to_string())),
326+
Err(s) => return Err(vm.new_os_error(s.to_string())),
324327
};
325328

326329
let addr_tuple = get_addr_tuple(vm, addr)?;
@@ -337,7 +340,10 @@ fn socket_send(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
337340
let mut socket = get_socket(zelf);
338341

339342
match socket.con {
340-
Some(ref mut v) => v.write(&objbytes::get_value(&bytes)).unwrap(),
343+
Some(ref mut v) => match v.write(&objbytes::get_value(&bytes)) {
344+
Ok(_) => (),
345+
Err(s) => return Err(vm.new_os_error(s.to_string())),
346+
},
341347
None => return Err(vm.new_type_error("".to_string())),
342348
};
343349
Ok(vm.get_none())
@@ -360,22 +366,24 @@ fn socket_sendto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
360366
match socket.socket_kind {
361367
SocketKind::Dgram => {
362368
match socket.con {
363-
Some(ref mut v) => {
364-
if let Ok(_) = v.send_to(&objbytes::get_value(&bytes), address_string) {
365-
Ok(vm.get_none())
366-
} else {
367-
Err(vm.new_type_error("socket failed".to_string()))
368-
}
369-
}
369+
Some(ref mut v) => match v.send_to(&objbytes::get_value(&bytes), address_string) {
370+
Ok(_) => Ok(vm.get_none()),
371+
Err(s) => Err(vm.new_os_error(s.to_string())),
372+
},
370373
None => {
371374
// Doing implicit bind
372-
if let Ok(dgram) = UdpSocket::bind("0.0.0.0:0") {
373-
if let Ok(_) = dgram.send_to(&objbytes::get_value(&bytes), address_string) {
374-
socket.con = Some(Connection::UdpSocket(dgram));
375-
return Ok(vm.get_none());
375+
match UdpSocket::bind("0.0.0.0:0") {
376+
Ok(dgram) => {
377+
match dgram.send_to(&objbytes::get_value(&bytes), address_string) {
378+
Ok(_) => {
379+
socket.con = Some(Connection::UdpSocket(dgram));
380+
Ok(vm.get_none())
381+
}
382+
Err(s) => Err(vm.new_os_error(s.to_string())),
383+
}
376384
}
385+
Err(s) => Err(vm.new_os_error(s.to_string())),
377386
}
378-
Err(vm.new_type_error("socket failed".to_string()))
379387
}
380388
}
381389
}
@@ -402,7 +410,7 @@ fn socket_getsockname(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
402410

403411
match addr {
404412
Ok(addr) => get_addr_tuple(vm, addr),
405-
_ => Err(vm.new_type_error("".to_string())),
413+
Err(s) => Err(vm.new_os_error(s.to_string())),
406414
}
407415
}
408416

0 commit comments

Comments
 (0)