]> granicus.if.org Git - esp-idf/commitdiff
esp_tls: fix incorrect closing of fd 0 on connection failure
authorJitin George <jitin@espressif.com>
Mon, 8 Apr 2019 10:49:16 +0000 (16:19 +0530)
committerJitin George <jitin@espressif.com>
Mon, 15 Apr 2019 05:29:50 +0000 (10:59 +0530)
Closes https://github.com/espressif/esp-idf/issues/3149

components/esp-tls/esp_tls.c
components/esp-tls/esp_tls.h

index 861861d5dee8da5306422464c78070c887d30332..49505b0c9325d45609805732d38841af47a840e4 100644 (file)
@@ -95,7 +95,6 @@ static int esp_tcp_connect(const char *host, int hostlen, int port, int *sockfd,
         ESP_LOGE(TAG, "Failed to create socket (family %d socktype %d protocol %d)", res->ai_family, res->ai_socktype, res->ai_protocol);
         goto err_freeaddr;
     }
-    *sockfd = fd;
 
     void *addr_ptr;
     if (res->ai_family == AF_INET) {
@@ -125,12 +124,13 @@ static int esp_tcp_connect(const char *host, int hostlen, int port, int *sockfd,
     }
 
     ret = connect(fd, addr_ptr, res->ai_addrlen);
-    if (ret < 0 && !(errno == EINPROGRESS && cfg->non_block)) {
+    if (ret < 0 && !(errno == EINPROGRESS && cfg && cfg->non_block)) {
 
-        ESP_LOGE(TAG, "Failed to connnect to host (errno %d)", errno);
+        ESP_LOGE(TAG, "Failed to connect to host (errno %d)", errno);
         goto err_freesocket;
     }
 
+    *sockfd = fd;
     freeaddrinfo(res);
     return 0;
 
@@ -222,14 +222,12 @@ static void mbedtls_cleanup(esp_tls_t *tls)
     mbedtls_ssl_config_free(&tls->conf);
     mbedtls_ctr_drbg_free(&tls->ctr_drbg);
     mbedtls_ssl_free(&tls->ssl);
-    mbedtls_net_free(&tls->server_fd);
 }
 
 static int create_ssl_handle(esp_tls_t *tls, const char *hostname, size_t hostlen, const esp_tls_cfg_t *cfg)
 {
     int ret;
-    
-    mbedtls_net_init(&tls->server_fd);
+
     tls->server_fd.fd = tls->sockfd;
     mbedtls_ssl_init(&tls->ssl);
     mbedtls_ctr_drbg_init(&tls->ctr_drbg);
@@ -343,7 +341,9 @@ void esp_tls_conn_delete(esp_tls_t *tls)
 {
     if (tls != NULL) {
         mbedtls_cleanup(tls);
-        if (tls->sockfd) {
+        if (tls->is_tls) {
+            mbedtls_net_free(&tls->server_fd);
+        } else if (tls->sockfd >= 0) {
             close(tls->sockfd);
         }
         free(tls);
@@ -376,13 +376,15 @@ static int esp_tls_low_level_conn(const char *hostname, int hostlen, int port, c
     and in case of blocking connect these cases will get executed one after the other */
     switch (tls->conn_state) {
         case ESP_TLS_INIT:
-            ;
-            int sockfd;
-            int ret = esp_tcp_connect(hostname, hostlen, port, &sockfd, cfg);
+            tls->sockfd = -1;
+            if (cfg != NULL) {
+                mbedtls_net_init(&tls->server_fd);
+                tls->is_tls = true;
+            }
+            int ret = esp_tcp_connect(hostname, hostlen, port, &tls->sockfd, cfg);
             if (ret < 0) {
                 return -1;
             }
-            tls->sockfd = sockfd;
             if (!cfg) {
                 tls->read = tcp_read;
                 tls->write = tcp_write;
@@ -545,4 +547,4 @@ int esp_tls_conn_http_new_async(const char *url, const esp_tls_cfg_t *cfg, esp_t
     /* Connect to host */
     return esp_tls_conn_new_async(&url[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len,
                            get_port(url, &u), cfg, tls);
-}
+}
\ No newline at end of file
index 38538ed0a39674559b6e3350f59fa55de322af5b..df6bb365ca6aba1d9d90250b41abb625c4076737 100644 (file)
@@ -126,6 +126,8 @@ typedef struct esp_tls {
     fd_set rset;                                                                /*!< read file descriptors */
 
     fd_set wset;                                                                /*!< write file descriptors */
+
+    bool is_tls;                                                                /*!< indicates connection type (TLS or NON-TLS) */
 } esp_tls_t;
 
 /**