Skip to content

Commit e9da4c9

Browse files
jeplerdpgeorge
authored andcommitted
unix/modsocket: Use type-checking mp_obj_get_int.
MP_OBJ_SMALL_INT_VALUE would give erroneous results, such as assertion failures in the coverage build and other oddities like: >>> s = socket.socket() >>> s.recv(3.14) MemoryError: memory allocation failed, allocating 4235896656 bytes Signed-off-by: Jeff Epler <jepler@gmail.com>
1 parent 6d640a1 commit e9da4c9

2 files changed

Lines changed: 37 additions & 18 deletions

File tree

ports/unix/modsocket.c

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,11 @@ static MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept);
280280
// these would be thrown as exceptions.
281281
static mp_obj_t socket_recv(size_t n_args, const mp_obj_t *args) {
282282
mp_obj_socket_t *self = MP_OBJ_TO_PTR(args[0]);
283-
int sz = MP_OBJ_SMALL_INT_VALUE(args[1]);
283+
int sz = mp_obj_get_int(args[1]);
284284
int flags = 0;
285285

286286
if (n_args > 2) {
287-
flags = MP_OBJ_SMALL_INT_VALUE(args[2]);
287+
flags = mp_obj_get_int(args[2]);
288288
}
289289

290290
byte *buf = m_new(byte, sz);
@@ -298,11 +298,11 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_recv_obj, 2, 3, socket_recv);
298298

299299
static mp_obj_t socket_recvfrom(size_t n_args, const mp_obj_t *args) {
300300
mp_obj_socket_t *self = MP_OBJ_TO_PTR(args[0]);
301-
int sz = MP_OBJ_SMALL_INT_VALUE(args[1]);
301+
int sz = mp_obj_get_int(args[1]);
302302
int flags = 0;
303303

304304
if (n_args > 2) {
305-
flags = MP_OBJ_SMALL_INT_VALUE(args[2]);
305+
flags = mp_obj_get_int(args[2]);
306306
}
307307

308308
struct sockaddr_storage addr;
@@ -331,7 +331,7 @@ static mp_obj_t socket_send(size_t n_args, const mp_obj_t *args) {
331331
int flags = 0;
332332

333333
if (n_args > 2) {
334-
flags = MP_OBJ_SMALL_INT_VALUE(args[2]);
334+
flags = mp_obj_get_int(args[2]);
335335
}
336336

337337
mp_buffer_info_t bufinfo;
@@ -349,7 +349,7 @@ static mp_obj_t socket_sendto(size_t n_args, const mp_obj_t *args) {
349349

350350
mp_obj_t dst_addr = args[2];
351351
if (n_args > 3) {
352-
flags = MP_OBJ_SMALL_INT_VALUE(args[2]);
352+
flags = mp_obj_get_int(args[2]);
353353
dst_addr = args[3];
354354
}
355355

@@ -366,7 +366,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_sendto_obj, 3, 4, socket_sendt
366366
static mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
367367
(void)n_args; // always 4
368368
mp_obj_socket_t *self = MP_OBJ_TO_PTR(args[0]);
369-
int level = MP_OBJ_SMALL_INT_VALUE(args[1]);
369+
int level = mp_obj_get_int(args[1]);
370370
int option = mp_obj_get_int(args[2]);
371371

372372
const void *optval;
@@ -478,14 +478,11 @@ static mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
478478
int proto = 0;
479479

480480
if (n_args > 0) {
481-
assert(mp_obj_is_small_int(args[0]));
482-
family = MP_OBJ_SMALL_INT_VALUE(args[0]);
481+
family = mp_obj_get_int(args[0]);
483482
if (n_args > 1) {
484-
assert(mp_obj_is_small_int(args[1]));
485-
type = MP_OBJ_SMALL_INT_VALUE(args[1]);
483+
type = mp_obj_get_int(args[1]);
486484
if (n_args > 2) {
487-
assert(mp_obj_is_small_int(args[2]));
488-
proto = MP_OBJ_SMALL_INT_VALUE(args[2]);
485+
proto = mp_obj_get_int(args[2]);
489486
}
490487
}
491488
}
@@ -582,7 +579,7 @@ static mp_obj_t mod_socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
582579
// getaddrinfo accepts port in string notation, so however
583580
// it may seem stupid, we need to convert int to str
584581
if (mp_obj_is_small_int(args[1])) {
585-
unsigned port = (unsigned short)MP_OBJ_SMALL_INT_VALUE(args[1]);
582+
unsigned port = (unsigned short)mp_obj_get_int(args[1]);
586583
snprintf(buf, sizeof(buf), "%u", port);
587584
serv = buf;
588585
hints.ai_flags = AI_NUMERICSERV;
@@ -605,13 +602,13 @@ static mp_obj_t mod_socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
605602
}
606603

607604
if (n_args > 2) {
608-
hints.ai_family = MP_OBJ_SMALL_INT_VALUE(args[2]);
605+
hints.ai_family = mp_obj_get_int(args[2]);
609606
if (n_args > 3) {
610-
hints.ai_socktype = MP_OBJ_SMALL_INT_VALUE(args[3]);
607+
hints.ai_socktype = mp_obj_get_int(args[3]);
611608
if (n_args > 4) {
612-
hints.ai_protocol = MP_OBJ_SMALL_INT_VALUE(args[4]);
609+
hints.ai_protocol = mp_obj_get_int(args[4]);
613610
if (n_args > 5) {
614-
hints.ai_flags = MP_OBJ_SMALL_INT_VALUE(args[5]);
611+
hints.ai_flags = mp_obj_get_int(args[5]);
615612
}
616613
}
617614
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Test passing in bad values to socket.socket constructor.
2+
3+
try:
4+
import socket
5+
except:
6+
print("SKIP")
7+
raise SystemExit
8+
9+
try:
10+
s = socket.socket(None)
11+
except TypeError:
12+
print("TypeError")
13+
14+
try:
15+
s = socket.socket(socket.AF_INET, None)
16+
except TypeError:
17+
print("TypeError")
18+
19+
try:
20+
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, None)
21+
except TypeError:
22+
print("TypeError")

0 commit comments

Comments
 (0)