Skip to content

Commit 44af052

Browse files
authored
Merge pull request #7291 from jepler/issue6502
Ensure orderly shutdown of ssl socket
2 parents 676e40d + 2326b49 commit 44af052

File tree

4 files changed

+23
-13
lines changed

4 files changed

+23
-13
lines changed

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "py/mperrno.h"
3232
#include "py/runtime.h"
3333
#include "shared-bindings/socketpool/SocketPool.h"
34+
#include "shared-bindings/ssl/SSLSocket.h"
35+
#include "common-hal/ssl/SSLSocket.h"
3436
#include "supervisor/port.h"
3537
#include "supervisor/shared/tick.h"
3638
#include "supervisor/workflow.h"
@@ -44,7 +46,7 @@
4446
StackType_t socket_select_stack[2 * configMINIMAL_STACK_SIZE];
4547

4648
STATIC int open_socket_fds[CONFIG_LWIP_MAX_SOCKETS];
47-
STATIC bool user_socket[CONFIG_LWIP_MAX_SOCKETS];
49+
STATIC socketpool_socket_obj_t *user_socket[CONFIG_LWIP_MAX_SOCKETS];
4850
StaticTask_t socket_select_task_handle;
4951
STATIC int socket_change_fd = -1;
5052

@@ -117,7 +119,7 @@ void socket_user_reset(void) {
117119

118120
for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) {
119121
open_socket_fds[i] = -1;
120-
user_socket[i] = false;
122+
user_socket[i] = NULL;
121123
}
122124
socket_change_fd = eventfd(0, 0);
123125
// Run this at the same priority as CP so that the web workflow background task can be
@@ -134,12 +136,13 @@ void socket_user_reset(void) {
134136

135137
for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) {
136138
if (open_socket_fds[i] >= 0 && user_socket[i]) {
139+
common_hal_socketpool_socket_close(user_socket[i]);
137140
int num = open_socket_fds[i];
138141
// Close automatically clears socket handle
139142
lwip_shutdown(num, SHUT_RDWR);
140143
lwip_close(num);
141144
open_socket_fds[i] = -1;
142-
user_socket[i] = false;
145+
user_socket[i] = NULL;
143146
}
144147
}
145148
}
@@ -171,10 +174,10 @@ STATIC void unregister_open_socket(int fd) {
171174
}
172175
}
173176

174-
STATIC void mark_user_socket(int fd) {
177+
STATIC void mark_user_socket(int fd, socketpool_socket_obj_t *obj) {
175178
for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) {
176179
if (open_socket_fds[i] == fd) {
177-
user_socket[i] = true;
180+
user_socket[i] = obj;
178181
return;
179182
}
180183
}
@@ -236,7 +239,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
236239
if (!socketpool_socket(self, family, type, sock)) {
237240
mp_raise_RuntimeError(translate("Out of sockets"));
238241
}
239-
mark_user_socket(sock->num);
242+
mark_user_socket(sock->num, sock);
240243
return sock;
241244
}
242245

@@ -293,12 +296,12 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
293296

294297
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self,
295298
uint8_t *ip, uint32_t *port) {
299+
socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t);
296300
int newsoc = socketpool_socket_accept(self, ip, port, NULL);
297301

298302
if (newsoc > 0) {
299-
mark_user_socket(newsoc);
300303
// Create the socket
301-
socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t);
304+
mark_user_socket(newsoc, sock);
302305
sock->base.type = &socketpool_socket_type;
303306
sock->num = newsoc;
304307
sock->pool = self->pool;
@@ -338,6 +341,12 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
338341
}
339342

340343
void socketpool_socket_close(socketpool_socket_obj_t *self) {
344+
if (self->ssl_socket) {
345+
ssl_sslsocket_obj_t *ssl_socket = self->ssl_socket;
346+
self->ssl_socket = NULL;
347+
common_hal_ssl_sslsocket_close(ssl_socket);
348+
return;
349+
}
341350
self->connected = false;
342351
if (self->num >= 0) {
343352
lwip_shutdown(self->num, SHUT_RDWR);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H
28-
#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H
27+
#pragma once
2928

3029
#include "py/obj.h"
3130

@@ -34,6 +33,8 @@
3433

3534
#include "components/esp-tls/esp_tls.h"
3635

36+
typedef struct ssl_sslsocket_obj ssl_sslsocket_obj_t;
37+
3738
typedef struct {
3839
mp_obj_base_t base;
3940
int num;
@@ -42,9 +43,8 @@ typedef struct {
4243
int ipproto;
4344
bool connected;
4445
socketpool_socketpool_obj_t *pool;
46+
ssl_sslsocket_obj_t *ssl_socket;
4547
mp_uint_t timeout_ms;
4648
} socketpool_socket_obj_t;
4749

4850
void socket_user_reset(void);
49-
50-
#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ ssl_sslsocket_obj_t *common_hal_ssl_sslcontext_wrap_socket(ssl_sslcontext_obj_t
4848
sock->base.type = &ssl_sslsocket_type;
4949
sock->ssl_context = self;
5050
sock->sock = socket;
51+
socket->ssl_socket = sock;
5152

5253
// Create a copy of the ESP-TLS config object and store the server hostname
5354
// Note that ESP-TLS will use common_name for both SNI and verification

ports/espressif/common-hal/ssl/SSLSocket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
#include "components/esp-tls/esp_tls.h"
3636

37-
typedef struct {
37+
typedef struct ssl_sslsocket_obj {
3838
mp_obj_base_t base;
3939
socketpool_socket_obj_t *sock;
4040
esp_tls_t *tls;

0 commit comments

Comments
 (0)