]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
guile: Remove unbounded uses of 'alloca'.
authorLudovic Courtès <ludo@gnu.org>
Fri, 7 Jun 2019 08:16:02 +0000 (10:16 +0200)
committerLudovic Courtès <ludo@gnu.org>
Fri, 7 Jun 2019 12:22:55 +0000 (14:22 +0200)
* guile/src/core.c (ALLOCA_MAX_SIZE, FAST_ALLOC): New macros.
(set_certificate_file):
(scm_gnutls_set_certificate_credentials_x509_key_files_x)
(scm_gnutls_set_srp_server_credentials_files_x)
(scm_gnutls_set_srp_client_credentials_x)
(scm_gnutls_srp_base64_encode, scm_gnutls_srp_base64_decode)
(scm_gnutls_set_psk_server_credentials_file_x)
(scm_gnutls_pkcs8_import_x509_private_key)
(scm_gnutls_x509_certificate_matches_hostname_p)
(scm_gnutls_import_openpgp_private_key): Use 'FAST_ALLOC' instead of
'alloca'.
* guile/src/utils.c: Remove unneeded <alloca.h> include.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
guile/src/core.c
guile/src/utils.c

index 3187792e92321475ed2961304e9b0b26f5827bde..0fb24e815ea69ef14bdafb61600ac08b8e3a3f85 100644 (file)
 # define scm_gc_malloc_pointerless scm_gc_malloc
 #endif
 
+/* Maximum size allowed for 'alloca'.  */
+#define ALLOCA_MAX_SIZE  1024U
+
+/* Allocate SIZE bytes, either on the C stack or on the GC-managed heap.  */
+#define FAST_ALLOC(size)                                       \
+  (((size) <= ALLOCA_MAX_SIZE)                                 \
+   ? alloca (size)                                             \
+   : scm_gc_malloc_pointerless ((size), "gnutls-alloc"))
 
 /* SMOB and enums type definitions.  */
 #include "enum-map.i.c"
@@ -1438,7 +1446,7 @@ set_certificate_file (certificate_set_file_function_t set_file,
   c_format = scm_to_gnutls_x509_certificate_format (format, 3, FUNC_NAME);
 
   c_file_len = scm_c_string_length (file);
-  c_file = alloca (c_file_len + 1);
+  c_file = FAST_ALLOC (c_file_len + 1);
 
   (void) scm_to_locale_stringbuf (file, c_file, c_file_len + 1);
   c_file[c_file_len] = '\0';
@@ -1550,10 +1558,10 @@ SCM_DEFINE (scm_gnutls_set_certificate_credentials_x509_key_files_x,
   c_format = scm_to_gnutls_x509_certificate_format (format, 2, FUNC_NAME);
 
   c_cert_file_len = scm_c_string_length (cert_file);
-  c_cert_file = alloca (c_cert_file_len + 1);
+  c_cert_file = FAST_ALLOC (c_cert_file_len + 1);
 
   c_key_file_len = scm_c_string_length (key_file);
-  c_key_file = alloca (c_key_file_len + 1);
+  c_key_file = FAST_ALLOC (c_key_file_len + 1);
 
   (void) scm_to_locale_stringbuf (cert_file, c_cert_file,
                                   c_cert_file_len + 1);
@@ -1713,7 +1721,7 @@ SCM_DEFINE (scm_gnutls_set_certificate_credentials_x509_keys_x,
   SCM_VALIDATE_LIST_COPYLEN (2, certs, c_cert_count);
   c_key = scm_to_gnutls_x509_private_key (privkey, 3, FUNC_NAME);
 
-  c_certs = alloca (c_cert_count * sizeof (*c_certs));
+  c_certs = FAST_ALLOC (c_cert_count * sizeof (*c_certs));
   for (i = 0; scm_is_pair (certs); certs = SCM_CDR (certs), i++)
     {
       c_certs[i] = scm_to_gnutls_x509_certificate (SCM_CAR (certs),
@@ -1872,8 +1880,8 @@ SCM_DEFINE (scm_gnutls_set_srp_server_credentials_files_x,
   c_password_file_len = scm_c_string_length (password_file);
   c_password_conf_file_len = scm_c_string_length (password_conf_file);
 
-  c_password_file = alloca (c_password_file_len + 1);
-  c_password_conf_file = alloca (c_password_conf_file_len + 1);
+  c_password_file = FAST_ALLOC (c_password_file_len + 1);
+  c_password_conf_file = FAST_ALLOC (c_password_conf_file_len + 1);
 
   (void) scm_to_locale_stringbuf (password_file, c_password_file,
                                   c_password_file_len + 1);
@@ -1930,8 +1938,8 @@ SCM_DEFINE (scm_gnutls_set_srp_client_credentials_x,
   c_username_len = scm_c_string_length (username);
   c_password_len = scm_c_string_length (password);
 
-  c_username = alloca (c_username_len + 1);
-  c_password = alloca (c_password_len + 1);
+  c_username = FAST_ALLOC (c_username_len + 1);
+  c_password = FAST_ALLOC (c_password_len + 1);
 
   (void) scm_to_locale_stringbuf (username, c_username, c_username_len + 1);
   c_username[c_username_len] = '\0';
@@ -1987,7 +1995,7 @@ SCM_DEFINE (scm_gnutls_srp_base64_encode, "srp-base64-encode",
   SCM_VALIDATE_STRING (1, str);
 
   c_str_len = scm_c_string_length (str);
-  c_str = alloca (c_str_len + 1);
+  c_str = FAST_ALLOC (c_str_len + 1);
   (void) scm_to_locale_stringbuf (str, c_str, c_str_len + 1);
   c_str[c_str_len] = '\0';
 
@@ -2050,14 +2058,14 @@ SCM_DEFINE (scm_gnutls_srp_base64_decode, "srp-base64-decode",
   SCM_VALIDATE_STRING (1, str);
 
   c_str_len = scm_c_string_length (str);
-  c_str = alloca (c_str_len + 1);
+  c_str = FAST_ALLOC (c_str_len + 1);
   (void) scm_to_locale_stringbuf (str, c_str, c_str_len + 1);
   c_str[c_str_len] = '\0';
 
   /* We assume that the decoded string is smaller than the encoded
      string.  */
   c_result_len = c_str_len;
-  c_result = alloca (c_result_len + 1);
+  c_result = FAST_ALLOC (c_result_len + 1);
 
   c_str_d.data = (unsigned char *) c_str;
   c_str_d.size = c_str_len;
@@ -2112,7 +2120,7 @@ SCM_DEFINE (scm_gnutls_set_psk_server_credentials_file_x,
   SCM_VALIDATE_STRING (2, file);
 
   c_file_len = scm_c_string_length (file);
-  c_file = alloca (c_file_len + 1);
+  c_file = FAST_ALLOC (c_file_len + 1);
 
   (void) scm_to_locale_stringbuf (file, c_file, c_file_len + 1);
   c_file[c_file_len] = '\0';
@@ -2166,7 +2174,7 @@ SCM_DEFINE (scm_gnutls_set_psk_client_credentials_x,
   c_key_format = scm_to_gnutls_psk_key_format (key_format, 4, FUNC_NAME);
 
   c_username_len = scm_c_string_length (username);
-  c_username = alloca (c_username_len + 1);
+  c_username = FAST_ALLOC (c_username_len + 1);
 
   (void) scm_to_locale_stringbuf (username, c_username, c_username_len + 1);
   c_username[c_username_len] = '\0';
@@ -2334,7 +2342,7 @@ SCM_DEFINE (scm_gnutls_pkcs8_import_x509_private_key,
   else
     {
       c_pass_len = scm_c_string_length (pass);
-      c_pass = alloca (c_pass_len + 1);
+      c_pass = FAST_ALLOC (c_pass_len + 1);
       (void) scm_to_locale_stringbuf (pass, c_pass, c_pass_len + 1);
       c_pass[c_pass_len] = '\0';
     }
@@ -2390,7 +2398,7 @@ SCM_DEFINE (scm_gnutls_pkcs8_import_x509_private_key,
   (void) get_the_dn (c_cert, NULL, &c_dn_len);                 \
                                                                \
   /* Get the DN itself.  */                                    \
-  c_dn = alloca (c_dn_len);                                    \
+  c_dn = FAST_ALLOC (c_dn_len);                                        \
   err = get_the_dn (c_cert, c_dn, &c_dn_len);                  \
                                                                \
   if (EXPECT_FALSE (err))                                      \
@@ -2523,7 +2531,7 @@ SCM_DEFINE (scm_gnutls_x509_certificate_matches_hostname_p,
   SCM_VALIDATE_STRING (2, hostname);
 
   c_hostname_len = scm_c_string_length (hostname);
-  c_hostname = alloca (c_hostname_len + 1);
+  c_hostname = FAST_ALLOC (c_hostname_len + 1);
 
   (void) scm_to_locale_stringbuf (hostname, c_hostname, c_hostname_len + 1);
   c_hostname[c_hostname_len] = '\0';
@@ -2864,7 +2872,7 @@ SCM_DEFINE (scm_gnutls_import_openpgp_private_key,
   else
     {
       c_pass_len = scm_c_string_length (pass);
-      c_pass = alloca (c_pass_len + 1);
+      c_pass = FAST_ALLOC (c_pass_len + 1);
       (void) scm_to_locale_stringbuf (pass, c_pass, c_pass_len + 1);
       c_pass[c_pass_len] = '\0';
     }
index d4ca3b9f0f75a4f3d06e23f51832bc8f1eac2e5b..88db96386b7d4d0deba7b52f8a23cb6776c726d2 100644 (file)
@@ -1,5 +1,5 @@
 /* GnuTLS --- Guile bindings for GnuTLS.
-   Copyright (C) 2007-2012 Free Software Foundation, Inc.
+   Copyright (C) 2007-2012, 2019 Free Software Foundation, Inc.
 
    GnuTLS is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -26,8 +26,6 @@
 #include <gnutls/gnutls.h>
 #include <libguile.h>
 
-#include <alloca.h>
-
 #include "enums.h"
 #include "errors.h"