From fc931ff19375e7a03b395cf3af792c2e9b56ef3f Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 13 Sep 2021 01:00:13 +0530 Subject: [PATCH] Fix esp_mbedtls_write API Fix esp_wolfssl_write API Closes https://github.com/espressif/esp-idf/issues/7461 --- components/esp-tls/esp_tls.h | 6 +++++- components/esp-tls/esp_tls_mbedtls.c | 4 ++-- components/esp-tls/esp_tls_wolfssl.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/components/esp-tls/esp_tls.h b/components/esp-tls/esp_tls.h index 311fdff645..7b565d6600 100644 --- a/components/esp-tls/esp_tls.h +++ b/components/esp-tls/esp_tls.h @@ -436,7 +436,11 @@ int esp_tls_conn_http_new_async(const char *url, const esp_tls_cfg_t *cfg, esp_t * - 0 if write operation was not successful. The underlying * connection was closed. * - <0 if write operation was not successful, because either an - * error occured or an action must be taken by the calling process. + * error occured or an action must be taken by the calling process. + * - ESP_TLS_ERR_SSL_WANT_READ/ + * ESP_TLS_ERR_SSL_WANT_WRITE. + * if the handshake is incomplete and waiting for data to be available for reading. + * In this case this functions needs to be called again when the underlying transport is ready for operation. */ static inline ssize_t esp_tls_conn_write(esp_tls_t *tls, const void *data, size_t datalen) { diff --git a/components/esp-tls/esp_tls_mbedtls.c b/components/esp-tls/esp_tls_mbedtls.c index bc05e836f6..dd3c327c41 100644 --- a/components/esp-tls/esp_tls_mbedtls.c +++ b/components/esp-tls/esp_tls_mbedtls.c @@ -161,9 +161,9 @@ ssize_t esp_mbedtls_write(esp_tls_t *tls, const char *data, size_t datalen) ESP_LOGE(TAG, "write error :%d:", ret); return ret; } else { - // Exitting the tls-write process as less than desired datalen are writable + // Exiting the tls-write process as less than desired datalen are writable ESP_LOGD(TAG, "mbedtls_ssl_write() returned %d, already written %d, exitting...", ret, written); - return written; + return (written > 0) ? written : ret; } } written += ret; diff --git a/components/esp-tls/esp_tls_wolfssl.c b/components/esp-tls/esp_tls_wolfssl.c index 4396784cc6..4ea819fd89 100644 --- a/components/esp-tls/esp_tls_wolfssl.c +++ b/components/esp-tls/esp_tls_wolfssl.c @@ -170,7 +170,7 @@ ssize_t esp_wolfssl_read(esp_tls_t *tls, char *data, size_t datalen) ssize_t esp_wolfssl_write(esp_tls_t *tls, const char *data, size_t datalen) { ssize_t ret = wolfSSL_write( (WOLFSSL *)tls->priv_ssl, (unsigned char *) data, datalen); - if (ret < 0) { + if (ret <= 0) { ret = wolfSSL_get_error( (WOLFSSL *)tls->priv_ssl, ret); if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) { ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);