Skip to content

Commit 982e676

Browse files
committed
zephyr/modusocket: getaddrinfo: Raise OSError on resolution timeout, etc.
1 parent 1c9ee49 commit 982e676

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

zephyr/modusocket.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,12 +533,18 @@ typedef struct _getaddrinfo_state_t {
533533
mp_obj_t result;
534534
struct k_sem sem;
535535
mp_obj_t port;
536+
int status;
536537
} getaddrinfo_state_t;
537538

538539
void dns_resolve_cb(enum dns_resolve_status status, struct dns_addrinfo *info, void *user_data) {
539540
getaddrinfo_state_t *state = user_data;
541+
DEBUG_printf("dns status: %d\n", status);
540542

541543
if (info == NULL) {
544+
if (status == DNS_EAI_ALLDONE) {
545+
status = 0;
546+
}
547+
state->status = status;
542548
k_sem_give(&state->sem);
543549
return;
544550
}
@@ -569,7 +575,6 @@ STATIC mp_obj_t mod_getaddrinfo(size_t n_args, const mp_obj_t *args) {
569575
state.result = mp_obj_new_list(0, NULL);
570576
k_sem_init(&state.sem, 0, UINT_MAX);
571577

572-
int status;
573578
for (int i = 2; i--;) {
574579
int type = (family != AF_INET6 ? DNS_QUERY_TYPE_A : DNS_QUERY_TYPE_AAAA);
575580
RAISE_ERRNO(dns_get_addr_info(host, type, NULL, dns_resolve_cb, &state, 3000));
@@ -580,6 +585,12 @@ STATIC mp_obj_t mod_getaddrinfo(size_t n_args, const mp_obj_t *args) {
580585
family = AF_INET6;
581586
}
582587

588+
// Raise error only if there's nothing to return, otherwise
589+
// it may be IPv4 vs IPv6 differences.
590+
if (state.status != 0 && mp_obj_len(state.result) == 0) {
591+
mp_raise_OSError(state.status);
592+
}
593+
583594
return state.result;
584595
}
585596
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_getaddrinfo_obj, 2, 3, mod_getaddrinfo);

0 commit comments

Comments
 (0)