8000 Refactor so that all sites of name lookup failure result in gaierror by jepler · Pull Request #7344 · adafruit/circuitpython · GitHub
[go: up one dir, main page]

Skip to content

Refactor so that all sites of name lookup failure result in gaierror #7344

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ports/espressif/common-hal/socketpool/Socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self,
struct addrinfo *result_i;
int error = lwip_getaddrinfo(host, NULL, &hints, &result_i);
if (error != 0 || result_i == NULL) {
mp_raise_OSError(EHOSTUNREACH);
common_hal_socketpool_socketpool_raise_gaierror(SOCKETPOOL_EAI_NONAME, MP_QSTR_Name_space_or_space_service_space_not_space_known);
}

// Set parameters
Expand Down Expand Up @@ -550,7 +550,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self,
struct addrinfo *result_i;
int error = lwip_getaddrinfo(host, NULL, &hints, &result_i);
if (error != 0 || result_i == NULL) {
mp_raise_OSError(EHOSTUNREACH);
common_hal_socketpool_socketpool_raise_gaierror(SOCKETPOOL_EAI_NONAME, MP_QSTR_Name_space_or_space_service_space_not_space_known);
}

// Set parameters
Expand Down
16 changes: 3 additions & 13 deletions ports/raspberrypi/common-hal/socketpool/Socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -872,11 +872,7 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
ip_addr_t bind_addr;
const ip_addr_t *bind_addr_ptr = &bind_addr;
if (hostlen > 0) {
int error = socketpool_resolve_host(socket->pool, host, &bind_addr);
if (error != 0) {
mp_raise_OSError(EHOSTUNREACH);
}

socketpool_resolve_host_raise(socket->pool, host, &bind_addr);
} else {
bind_addr_ptr = IP_ANY_TYPE;
}
Expand Down Expand Up @@ -965,10 +961,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket,

// get address
ip_addr_t dest;
int error = socketpool_resolve_host(socket->pool, host, &dest);
if (error != 0) {
mp_raise_OSError(EHOSTUNREACH);
}
socketpool_resolve_host_raise(socket->pool, host, &dest);

err_t err = ERR_ARG;
switch (socket->type) {
Expand Down Expand Up @@ -1163,10 +1156,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *socket,
const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len) {
int _errno;
ip_addr_t ip;
int error = socketpool_resolve_host(socket->pool, host, &ip);
if (error != 0) {
mp_raise_OSError(EHOSTUNREACH);
}
socketpool_resolve_host_raise(socket->pool, host, &ip);

mp_uint_t ret = 0;
switch (socket->type) {
Expand Down
21 changes: 15 additions & 6 deletions ports/raspberrypi/common-hal/socketpool/SocketPool.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ STATIC void lwip_getaddrinfo_cb(const char *name, const ip_addr_t *ipaddr, void
}
}

int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) {
STATIC int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) {

getaddrinfo_state_t state;
state.status = 0;
Expand Down Expand Up @@ -94,17 +94,26 @@ int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host,
return 0;
}

mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self,
const char *host) {

ip_addr_t addr;
int result = socketpool_resolve_host(self, host, &addr);
void socketpool_resolve_host_raise(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) {
int result = socketpool_resolve_host(self, host, addr);
if (result < 0) {
printf("socket_resolve_host() returned %d\n", result);
common_hal_socketpool_socketpool_raise_gaierror(SOCKETPOOL_EAI_NONAME, MP_QSTR_Name_space_or_space_service_space_not_space_known);
mp_raise_OSError(-result);
}
}

mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self, const char *host) {

ip_addr_t addr;
socketpool_resolve_host_raise(self, host, &addr);

char ip_str[IP4ADDR_STRLEN_MAX];
inet_ntoa_r(addr, ip_str, IP4ADDR_STRLEN_MAX);
mp_obj_t ip_obj = mp_obj_new_str(ip_str, strlen(ip_str));
return ip_obj;
}

mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self, const char *host) {
return common_hal_socketpool_socketpool_gethostbyname(self, host);
}
2 changes: 1 addition & 1 deletion ports/raspberrypi/common-hal/socketpool/SocketPool.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ typedef struct {
mp_obj_base_t base;
} socketpool_socketpool_obj_t;

int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr);
void socketpool_resolve_host_raise(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr);
30 changes: 19 additions & 11 deletions shared-bindings/socketpool/SocketPool.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
#include "shared-bindings/socketpool/Socket.h"
#include "shared-bindings/socketpool/SocketPool.h"

#define SOCKETPOOL_EAI_NONAME (-2)

//| class SocketPool:
//| """A pool of socket resources available for the given radio. Only one
//| SocketPool can be created for each radio.
Expand Down Expand Up @@ -151,15 +149,7 @@ STATIC mp_obj_t socketpool_socketpool_getaddrinfo(size_t n_args, const mp_obj_t
}

if (ip_str == mp_const_none) {
ip_str = common_hal_socketpool_socketpool_gethostbyname(self, host);
}

if (ip_str == mp_const_none) {
mp_obj_t exc_args[2] = {
MP_OBJ_NEW_SMALL_INT(SOCKETPOOL_EAI_NONAME),
MP_OBJ_NEW_QSTR(MP_QSTR_Name_space_or_space_service_space_not_space_known),
};
nlr_raise(mp_obj_new_exception_args(&mp_type_gaierror, 2, exc_args));
ip_str = common_hal_socketpool_socketpool_gethostbyname_raise(self, host);
}

mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL));
Expand Down Expand Up @@ -203,3 +193,21 @@ const mp_obj_type_t socketpool_socketpool_type = {
.make_new = socketpool_socketpool_make_new,
.locals_dict = (mp_obj_dict_t *)&socketpool_socketpool_locals_dict,
};

MP_WEAK
mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self, const char *host) {
mp_obj_t ip_str = common_hal_socketpool_socketpool_gethostbyname(self, host);
if (ip_str == mp_const_none) {
common_hal_socketpool_socketpool_raise_gaierror(SOCKETPOOL_EAI_NONAME, MP_QSTR_Name_space_or_space_service_space_not_space_known);
}
return ip_str;
}

MP_WEAK NORETURN
void common_hal_socketpool_socketpool_raise_gaierror(int value, qstr name) {
mp_obj_t exc_args[2] = {
MP_OBJ_NEW_SMALL_INT(value),
MP_OBJ_NEW_QSTR(name),
};
nlr_raise(mp_obj_new_exception_args(&mp_type_gaierror, 2, exc_args));
}
9 changes: 9 additions & 0 deletions shared-bindings/socketpool/SocketPool.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,27 @@ typedef enum {
SOCKETPOOL_TCP_NODELAY = 1,
} socketpool_socketpool_tcpopt_t;

typedef enum {
SOCKETPOOL_EAI_NONAME = -2,
} socketpool_eai_t;

void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *self, mp_obj_t radio);

socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_t *self,
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type);

mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self,
const char *host);
// raises an exception instead of returning mp_const_none in the case of error
mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self,
const char *host);

// Non-allocating version for internal use. These sockets are not registered and, therefore, not
// closed automatically.
bool socketpool_socket(socketpool_socketpool_obj_t *self,
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type,
socketpool_socket_obj_t *sock);

NORETURN void common_hal_socketpool_socketpool_raise_gaierror(int value, qstr name);

#endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKETPOOL_H
0