openssl: Add mutex for data_index 47/259847/1 accepted/tizen/6.5/unified/20211029.012952 accepted/tizen/unified/20210618.120859 submit/tizen/20210616.111527 submit/tizen_6.5/20211028.163401 tizen_6.5.m2_release
authorSeonah Moon <seonah1.moon@samsung.com>
Wed, 2 Jun 2021 10:40:16 +0000 (19:40 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Wed, 16 Jun 2021 02:13:43 +0000 (11:13 +0900)
Change-Id: Id2bc95af9ae6b7d3572f1600f85dc955ec337329

tls/openssl/gtlsclientconnection-openssl.c

index 3c189c1..19ac307 100644 (file)
@@ -322,6 +322,14 @@ g_tls_client_connection_openssl_client_connection_interface_init (GTlsClientConn
 }
 
 static int data_index = -1;
+#ifdef TIZEN_EXT
+G_LOCK_DEFINE_STATIC(data_index);
+#define DATA_INDEX_LOCK(m) G_LOCK(m)
+#define DATA_INDEX_UNLOCK(m) G_UNLOCK(m)
+#else
+#define DATA_INDEX_LOCK(m)
+#define DATA_INDEX_UNLOCK(m)
+#endif
 
 static int
 retrieve_certificate (SSL       *ssl,
@@ -335,14 +343,23 @@ retrieve_certificate (SSL       *ssl,
   GTlsCertificate *cert;
   gboolean set_certificate = FALSE;
 
+  DATA_INDEX_LOCK(data_index);
+  int idx = data_index;
   client = SSL_get_ex_data (ssl, data_index);
+  DATA_INDEX_UNLOCK(data_index);
+  if (!client)
+    {
+      TIZEN_LOGE("SSL_get_ex_data(%p) returns NULL.", ssl);
+      return 0;
+    }
+
   tls = G_TLS_CONNECTION_BASE (client);
   openssl = G_TLS_CONNECTION_OPENSSL (client);
 
   priv = g_tls_client_connection_openssl_get_instance_private (client);
 
   TIZEN_LOGI("ssl[%p] client[%p] tls[%p] openssl[%p] priv[%p] data_index[%d]",
-        ssl, client, tls, openssl, priv, data_index);
+        ssl, client, tls, openssl, priv, idx);
 
   tls->certificate_requested = TRUE;
 
@@ -392,11 +409,14 @@ generate_session_id (SSL           *ssl,
   GTlsClientConnectionOpensslPrivate *priv;
   int len;
 
+  DATA_INDEX_LOCK(data_index);
+  int idx = data_index;
   client = SSL_get_ex_data (ssl, data_index);
+  DATA_INDEX_UNLOCK(data_index);
   priv = g_tls_client_connection_openssl_get_instance_private (client);
 
   TIZEN_LOGI("ssl[%p] client[%p] priv[%p] data_index[%d]",
-                 ssl, client, priv, data_index);
+                 ssl, client, priv, idx);
 
   len = MIN (*id_len, g_bytes_get_size (priv->session_id));
   memcpy (id, g_bytes_get_data (priv->session_id, NULL), len);
@@ -543,7 +563,7 @@ g_tls_client_connection_openssl_initable_init (GInitable       *initable,
                    ERR_error_string (ERR_get_error (), NULL));
       return FALSE;
     }
-
+  DATA_INDEX_LOCK(data_index);
   if (data_index == -1) {
       data_index = SSL_get_ex_new_index (0, (void *)"gtlsclientconnection", NULL, NULL, NULL);
          TIZEN_LOGI("new data_index[%d]", data_index);
@@ -552,7 +572,7 @@ g_tls_client_connection_openssl_initable_init (GInitable       *initable,
   }
   SSL_set_ex_data (priv->ssl, data_index, client);
   TIZEN_LOGI("[SSL] set extra data: priv->ssl[%p] data_index[%d] client[%p]", priv->ssl, data_index, client);
-
+  DATA_INDEX_UNLOCK(data_index);
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
   if (hostname)
     SSL_set_tlsext_host_name (priv->ssl, hostname);