]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
mbedtls: fix CURLOPT_SSLCERT_BLOB
authorDaniel Stenberg <daniel@haxx.se>
Tue, 14 Dec 2021 09:00:34 +0000 (10:00 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 14 Dec 2021 14:35:54 +0000 (15:35 +0100)
The memory passed to mbedTLS for this needs to be null terminated.

Reported-by: Florian Van Heghe
Closes #8146

lib/vtls/mbedtls.c

index 113eb9196c3886d863f4d52fecff1871e858bd08..ac791e80937671505e2c21d7b6ceb76b490fe25d 100644 (file)
@@ -379,10 +379,17 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
   }
 
   if(ssl_cert_blob) {
-    const unsigned char *blob_data =
-      (const unsigned char *)ssl_cert_blob->data;
-    ret = mbedtls_x509_crt_parse(&backend->clicert, blob_data,
+    /* Unfortunately, mbedtls_x509_crt_parse() requires the data to be null
+       terminated even when provided the exact length, forcing us to waste
+       extra memory here. */
+    unsigned char *newblob = malloc(ssl_cert_blob->len + 1);
+    if(!newblob)
+      return CURLE_OUT_OF_MEMORY;
+    memcpy(newblob, ssl_cert_blob->data, ssl_cert_blob->len);
+    newblob[ssl_cert_blob->len] = 0; /* null terminate */
+    ret = mbedtls_x509_crt_parse(&backend->clicert, newblob,
                                  ssl_cert_blob->len);
+    free(newblob);
 
     if(ret) {
       mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));