Skip to content

Commit 2ebb45d

Browse files
authored
Merge pull request #7043 from jepler/picow-socket-bugfixes
Pico W: a number of socketpool and ssl bugfixes
2 parents 8acef79 + 874ddd6 commit 2ebb45d

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,16 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
821821

822822
MICROPY_PY_LWIP_EXIT
823823

824+
DEBUG_printf("registering socket in socketpool_socket_accept()\n");
825+
if (!register_open_socket(socket2)) {
826+
DEBUG_printf("collecting garbage to open socket\n");
827+
gc_collect();
828+
if (!register_open_socket(socket2)) {
829+
mp_raise_RuntimeError(translate("Out of sockets"));
830+
}
831+
}
832+
mark_user_socket(socket2);
833+
824834
// output values
825835
memcpy(ip, &(socket2->pcb.tcp->remote_ip), NETUTILS_IPV4ADDR_BUFSIZE);
826836
*port = (mp_uint_t)socket2->pcb.tcp->remote_port;
@@ -1070,6 +1080,9 @@ int socketpool_socket_recv_into(socketpool_socket_obj_t *socket,
10701080
ret = lwip_raw_udp_receive(socket, (byte *)buf, len, NULL, NULL, &_errno);
10711081
break;
10721082
}
1083+
if (ret < 0) {
1084+
return -_errno;
1085+
}
10731086
return ret;
10741087
}
10751088

ports/raspberrypi/common-hal/ssl/SSLContext.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void common_hal_ssl_sslcontext_load_verify_locations(ssl_sslcontext_obj_t *self,
4242
self->crt_bundle_attach = NULL;
4343
self->use_global_ca_store = false;
4444
self->cacert_buf = (const unsigned char *)cadata;
45-
self->cacert_bytes = strlen(cadata) + 1;
45+
self->cacert_bytes = *cadata ? strlen(cadata) + 1 : 0;
4646
}
4747

4848
void common_hal_ssl_sslcontext_set_default_verify_paths(ssl_sslcontext_obj_t *self) {

ports/raspberrypi/common-hal/ssl/SSLSocket.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ STATIC int _mbedtls_ssl_send(void *ctx, const byte *buf, size_t len) {
100100
mp_obj_t sock = *(mp_obj_t *)ctx;
101101

102102
// mp_uint_t out_sz = sock_stream->write(sock, buf, len, &err);
103-
mp_int_t out_sz = common_hal_socketpool_socket_send(sock, buf, len);
103+
mp_int_t out_sz = socketpool_socket_send(sock, buf, len);
104104
DEBUG("socket_send() -> %d", out_sz);
105105
if (out_sz < 0) {
106106
int err = -out_sz;
@@ -118,7 +118,7 @@ STATIC int _mbedtls_ssl_send(void *ctx, const byte *buf, size_t len) {
118118
STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
119119
mp_obj_t sock = *(mp_obj_t *)ctx;
120120

121-
mp_int_t out_sz = common_hal_socketpool_socket_recv_into(sock, buf, len);
121+
mp_int_t out_sz = socketpool_socket_recv_into(sock, buf, len);
122122
DEBUG("socket_recv() -> %d", out_sz);
123123
if (out_sz < 0) {
124124
int err = -out_sz;
@@ -230,7 +230,7 @@ ssl_sslsocket_obj_t *common_hal_ssl_sslcontext_wrap_socket(ssl_sslcontext_obj_t
230230
mbedtls_entropy_free(&o->entropy);
231231

232232
if (ret == MBEDTLS_ERR_SSL_ALLOC_FAILED) {
233-
mp_raise_OSError(MP_ENOMEM);
233+
mp_raise_type(&mp_type_MemoryError);
234234
} else if (ret == MBEDTLS_ERR_PK_BAD_INPUT_DATA) {
235235
mp_raise_ValueError(MP_ERROR_TEXT("invalid key"));
236236
} else if (ret == MBEDTLS_ERR_X509_BAD_INPUT_DATA) {
@@ -299,8 +299,7 @@ void common_hal_ssl_sslsocket_close(ssl_sslsocket_obj_t *self) {
299299
mbedtls_entropy_free(&self->entropy);
300300
}
301301

302-
void common_hal_ssl_sslsocket_connect(ssl_sslsocket_obj_t *self, const char *host, size_t hostlen, uint32_t port) {
303-
common_hal_socketpool_socket_connect(self->sock, host, hostlen, port);
302+
STATIC void do_handshake(ssl_sslsocket_obj_t *self) {
304303
int ret;
305304
while ((ret = mbedtls_ssl_handshake(&self->ssl)) != 0) {
306305
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
@@ -326,7 +325,7 @@ void common_hal_ssl_sslsocket_connect(ssl_sslsocket_obj_t *self, const char *hos
326325
mbedtls_entropy_free(&self->entropy);
327326

328327
if (ret == MBEDTLS_ERR_SSL_ALLOC_FAILED) {
329-
mp_raise_OSError(MP_ENOMEM);
328+
mp_raise_type(&mp_type_MemoryError);
330329
} else if (ret == MBEDTLS_ERR_PK_BAD_INPUT_DATA) {
331330
mp_raise_ValueError(MP_ERROR_TEXT("invalid key"));
332331
} else if (ret == MBEDTLS_ERR_X509_BAD_INPUT_DATA) {
@@ -336,6 +335,11 @@ void common_hal_ssl_sslsocket_connect(ssl_sslsocket_obj_t *self, const char *hos
336335
}
337336
}
338337

338+
void common_hal_ssl_sslsocket_connect(ssl_sslsocket_obj_t *self, const char *host, size_t hostlen, uint32_t port) {
339+
common_hal_socketpool_socket_connect(self->sock, host, hostlen, port);
340+
do_handshake(self);
341+
}
342+
339343
bool common_hal_ssl_sslsocket_get_closed(ssl_sslsocket_obj_t *self) {
340344
return self->closed;
341345
}

0 commit comments

Comments
 (0)