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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy