summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extmod/modtls_mbedtls.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/extmod/modtls_mbedtls.c b/extmod/modtls_mbedtls.c
index 0a1b8828a..3fd416d72 100644
--- a/extmod/modtls_mbedtls.c
+++ b/extmod/modtls_mbedtls.c
@@ -37,6 +37,7 @@
#include "py/stream.h"
#include "py/objstr.h"
#include "py/reader.h"
+#include "py/gc.h"
#include "extmod/vfs.h"
// mbedtls_time_t
@@ -58,6 +59,10 @@
#include "mbedtls/asn1.h"
#endif
+#ifndef MICROPY_MBEDTLS_CONFIG_BARE_METAL
+#define MICROPY_MBEDTLS_CONFIG_BARE_METAL (0)
+#endif
+
#define MP_STREAM_POLL_RDWR (MP_STREAM_POLL_RD | MP_STREAM_POLL_WR)
// This corresponds to an SSLContext object.
@@ -545,6 +550,16 @@ static mp_obj_t ssl_socket_make_new(mp_obj_ssl_context_t *ssl_context, mp_obj_t
mbedtls_ssl_init(&o->ssl);
ret = mbedtls_ssl_setup(&o->ssl, &ssl_context->conf);
+ #if !MICROPY_MBEDTLS_CONFIG_BARE_METAL
+ if (ret == MBEDTLS_ERR_SSL_ALLOC_FAILED) {
+ // If mbedTLS relies on platform libc heap for buffers (i.e. esp32
+ // port), then run a GC pass and then try again. This is useful because
+ // it may free a Python object (like an old SSL socket) whose finaliser
+ // frees some platform-level heap.
+ gc_collect();
+ ret = mbedtls_ssl_setup(&o->ssl, &ssl_context->conf);
+ }
+ #endif
if (ret != 0) {
goto cleanup;
}