8000 Require explicit socket port reuse · adafruit/circuitpython@9f3987a · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9f3987a

Browse files
committed
Require explicit socket port reuse
Doing it implicitly can lead to mistaken socket leaks and reuse. It now matches CPython. Fixes #8443
1 parent 02a4886 commit 9f3987a

File tree

7 files changed

+40
-27
lines changed

7 files changed

+40
-27
lines changed

ports/espressif/common-hal/socketpool/Socket.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
334334
}
335335
}
336336

337-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
337+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
338338
const char *host, size_t hostlen, uint32_t port) {
339339
struct sockaddr_in bind_addr;
340340
const char *broadcast = "<broadcast>";
@@ -351,13 +351,11 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
351351
bind_addr.sin_family = AF_INET;
352352
bind_addr.sin_port = htons(port);
353353

354-
int opt = 1;
355-
int err = lwip_setsockopt(self->num, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
356-
if (err != 0) {
357-
mp_raise_RuntimeError(MP_ERROR_TEXT("Cannot set socket options"));
358-
}
359354
int result = lwip_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
360-
return result == 0;
355+
if (result == 0) {
356+
return 0;
357+
}
358+
return errno;
361359
}
362360

363361
void socketpool_socket_close(socketpool_socket_obj_t *self) {

ports/raspberrypi/common-hal/socketpool/Socket.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
865865
return MP_OBJ_FROM_PTR(accepted);
866866
}
867867

868-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
868+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
869869
const char *host, size_t hostlen, uint32_t port) {
870870

871871
// get address
@@ -876,7 +876,6 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
876876
} else {
877877
bind_addr_ptr = IP_ANY_TYPE;
878878
}
879-
ip_set_option(socket->pcb.ip, SOF_REUSEADDR);
880879

881880
err_t err = ERR_ARG;
882881
switch (socket->type) {
@@ -891,10 +890,10 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
891890
}
892891

893892
if (err != ERR_OK) {
894-
mp_raise_OSError(error_lookup_table[-err]);
893+
return error_lookup_table[-err];
895894
}
896895

897-
return mp_const_none;
896+
return 0;
898897
}
899898

900899
STATIC err_t _lwip_tcp_close_poll(void *arg, struct tcp_pcb *pcb) {

shared-bindings/socketpool/Socket.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ STATIC mp_obj_t socketpool_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
106106
mp_raise_ValueError(MP_ERROR_TEXT("port must be >= 0"));
107107
}
108108

109-
bool ok = common_hal_socketpool_socket_bind(self, host, hostlen, (uint32_t)port);
110-
if (!ok) {
111-
mp_raise_ValueError(MP_ERROR_TEXT("Error: Failure to bind"));
109+
size_t error = common_hal_socketpool_socket_bind(self, host, hostlen, (uint32_t)port);
110+
if (error != 0) {
111+
mp_raise_OSError(error);
112112
}
113113

114114
return mp_const_none;

shared-bindings/socketpool/Socket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
extern const mp_obj_type_t socketpool_socket_type;
3333

3434
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port);
35-
bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
35+
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
3636
void common_hal_socketpool_socket_close(socketpool_socket_obj_t *self);
3737
void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
3838
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t *self);

shared-bindings/socketpool/SocketPool.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ MP_DEFINE_EXCEPTION(gaierror, OSError)
7979
//| SOCK_RAW: int
8080
//| EAI_NONAME: int
8181
//|
82+
//| SOL_SOCKET: int
83+
//|
84+
//| SO_REUSEADDR: int
85+
//|
8286
//| TCP_NODELAY: int
8387
//|
8488
//| IPPROTO_IP: int
@@ -196,6 +200,10 @@ STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = {
196200
{ MP_ROM_QSTR(MP_QSTR_SOCK_DGRAM), MP_ROM_INT(SOCKETPOOL_SOCK_DGRAM) },
197201
{ MP_ROM_QSTR(MP_QSTR_SOCK_RAW), MP_ROM_INT(SOCKETPOOL_SOCK_RAW) },
198202

203+
{ MP_ROM_QSTR(MP_QSTR_SOL_SOCKET), MP_ROM_INT(SOCKETPOOL_SOL_SOCKET) },
204+
205+
{ MP_ROM_QSTR(MP_QSTR_SO_REUSEADDR), MP_ROM_INT(SOCKETPOOL_SO_REUSEADDR) },
206+
199207
{ MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(SOCKETPOOL_TCP_NODELAY) },
200208

201209
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(SOCKETPOOL_IPPROTO_IP) },

shared-bindings/socketpool/SocketPool.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ typedef enum {
5757
SOCKETPOOL_TCP_NODELAY = 1,
5858
} socketpool_socketpool_tcpopt_t;
5959

60+
typedef enum {
61+
SOCKETPOOL_SOL_SOCKET = 0xfff,
62+
} socketpool_socketpool_optlevel_t;
63+
64+
typedef enum {
65+
SOCKETPOOL_SO_REUSEADDR = 0x0004,
66+
} socketpool_socketpool_socketopt_t;
67+
6068
typedef enum {
6169
SOCKETPOOL_IP_MULTICAST_TTL = 5,
6270
} socketpool_socketpool_ipopt_t;

shared-module/ssl/SSLSocket.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ STATIC void mbedtls_debug(void *ctx, int level, const char *file, int line, cons
5757
(void)level;
5858
mp_printf(&mp_plat_print, "DBG:%s:%04d: %s\n", file, line, str);
5959
}
60-
#define DEBUG(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__)
60+
#define DEBUG_PRINT(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__)
6161
#else
62-
#define DEBUG(...) do {} while (0)
62+
#define DEBUG_PRINT(...) do {} while (0)
6363
#endif
6464

6565
STATIC NORETURN void mbedtls_raise_error(int err) {
@@ -107,10 +107,10 @@ STATIC int _mbedtls_ssl_send(void *ctx, const byte *buf, size_t len) {
107107

108108
// mp_uint_t out_sz = sock_stream->write(sock, buf, len, &err);
109109
mp_int_t out_sz = socketpool_socket_send(sock, buf, len);
110-
DEBUG("socket_send() -> %d", out_sz);
110+
DEBUG_PRINT("socket_send() -> %d", out_sz);
111111
if (out_sz < 0) {
112112
int err = -out_sz;
113-
DEBUG("sock_stream->write() -> %d nonblocking? %d", out_sz, mp_is_nonblocking_error(err));
113+
DEBUG_PRINT("sock_stream->write() -> %d nonblocking? %d", out_sz, mp_is_nonblocking_error(err));
114114
if (mp_is_nonblocking_error(err)) {
115115
return MBEDTLS_ERR_SSL_WANT_WRITE;
116116
}
@@ -125,7 +125,7 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
125125
mp_obj_t sock = *(mp_obj_t *)ctx;
126126

127127
mp_int_t out_sz = socketpool_socket_recv_into(sock, buf, len);
128-
DEBUG("socket_recv() -> %d", out_sz);
128+
DEBUG_PRINT("socket_recv() -> %d", out_sz);
129129
if (out_sz < 0) {
130130
int err = -out_sz;
131131
if (mp_is_nonblocking_error(err)) {
@@ -261,14 +261,14 @@ ssl_sslsocket_obj_t *common_hal_ssl_sslcontext_wrap_socket(ssl_sslcontext_obj_t
261261

262262
mp_uint_t common_hal_ssl_sslsocket_recv_into(ssl_sslsocket_obj_t *self, uint8_t *buf, uint32_t len) {
263263
int ret = mbedtls_ssl_read(&self->ssl, buf, len);
264-
DEBUG("recv_into mbedtls_ssl_read() -> %d\n", ret);
264+
DEBUG_PRINT("recv_into mbedtls_ssl_read() -> %d\n", ret);
265265
if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
266-
DEBUG("returning %d\n", 0);
266+
DEBUG_PRINT("returning %d\n", 0);
267267
// end of stream
268268
return 0;
269269
}
270270
if (ret >= 0) {
271-
DEBUG("returning %d\n", ret);
271+
DEBUG_PRINT("returning %d\n", ret);
272272
return ret;
273273
}
274274
if (ret == MBEDTLS_ERR_SSL_WANT_READ) {
@@ -279,15 +279,15 @@ mp_uint_t common_hal_ssl_sslsocket_recv_into(ssl_sslsocket_obj_t *self, uint8_t
279279
// renegotiation.
280280
ret = MP_EWOULDBLOCK;
281281
}
282-
DEBUG("raising errno [error case] %d\n", ret);
282+
DEBUG_PRINT("raising errno [error case] %d\n", ret);
283283
mp_raise_OSError(ret);
284284
}
285285

286286
mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t *buf, uint32_t len) {
287287
int ret = mbedtls_ssl_write(&self->ssl, buf, len);
288-
DEBUG("send mbedtls_ssl_write() -> %d\n", ret);
288+
DEBUG_PRINT("send mbedtls_ssl_write() -> %d\n", ret);
289289
if (ret >= 0) {
290-
DEBUG("returning %d\n", ret);
290+
DEBUG_PRINT("returning %d\n", ret);
291291
return ret;
292292
}
293293
if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
@@ -298,7 +298,7 @@ mp_uint_t common_hal_ssl_sslsocket_send(ssl_sslsocket_obj_t *self, const uint8_t
298298
// renegotiation.
299299
ret = MP_EWOULDBLOCK;
300300
}
301-
DEBUG("raising errno [error case] %d\n", ret);
301+
DEBUG_PRINT("raising errno [error case] %d\n", ret);
302302
mp_raise_OSError(ret);
303303
}
304304

0 commit comments

Comments
 (0)
0