Reported by Massimo Gaspari <massimo.gaspari@alice.it> in
<http://permalink.gmane.org/gmane.network.gnutls.general/1170>.
+** Remove all uses of gnutls_alloca/gnutls_afree.
+Use normal gnutls_malloc instead. One reason is increased portability
+to Windows, the other is that several of the uses may be unsafe
+because the size of data allocated could be large. Reported by
+Massimo Gaspari <massimo.gaspari@alice.it> in
+<http://permalink.gmane.org/gmane.network.gnutls.general/1170>.
+
** API and ABI modifications:
No changes since last version.
return 0;
}
- tmp_ciphers = gnutls_alloca (count * sizeof (cipher_suite_st));
+ tmp_ciphers = gnutls_malloc (count * sizeof (cipher_suite_st));
if (tmp_ciphers == NULL)
return GNUTLS_E_MEMORY_ERROR;
ciphers = gnutls_malloc (count * sizeof (cipher_suite_st));
if (ciphers == NULL)
{
- gnutls_afree (tmp_ciphers);
+ gnutls_free (tmp_ciphers);
return GNUTLS_E_MEMORY_ERROR;
}
}
#endif
- gnutls_afree (tmp_ciphers);
+ gnutls_free (tmp_ciphers);
/* This function can no longer return 0 cipher suites.
* It returns an error code instead.
/*
- * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation
+ * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation
*
* Author: Nikos Mavrogiannopoulos
*
if (session->internals.have_peeked_data == 0 || RCVLOWAT == 0)
return 0;
- peekdata = gnutls_alloca (RCVLOWAT);
+ peekdata = gnutls_malloc (RCVLOWAT);
if (peekdata == NULL)
{
gnutls_assert ();
while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN
|| sum < RCVLOWAT);
- gnutls_afree (peekdata);
+ gnutls_free (peekdata);
if (ret < 0)
{
/*
- * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation
+ * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation
*
* Author: Nikos Mavrogiannopoulos
*
}
else if (IV_size > 0 && export_flag != 0)
{
- opaque *iv_block = gnutls_alloca (IV_size * 2);
+ opaque *iv_block = gnutls_malloc (IV_size * 2);
if (iv_block == NULL)
{
gnutls_assert ();
{
gnutls_assert ();
gnutls_free (key_block);
- gnutls_afree (iv_block);
+ gnutls_free (iv_block);
return ret;
}
if (ret < 0)
{
gnutls_assert ();
- gnutls_afree (iv_block);
+ gnutls_free (iv_block);
gnutls_free (key_block);
return ret;
}
if (_gnutls_sset_datum
(&session->cipher_specs.client_write_IV, iv_block, IV_size) < 0)
{
- gnutls_afree (iv_block);
+ gnutls_free (iv_block);
gnutls_free (key_block);
return GNUTLS_E_MEMORY_ERROR;
}
(&session->cipher_specs.server_write_IV,
&iv_block[IV_size], IV_size) < 0)
{
- gnutls_afree (iv_block);
+ gnutls_free (iv_block);
gnutls_free (key_block);
return GNUTLS_E_MEMORY_ERROR;
}
- gnutls_afree (iv_block);
+ gnutls_free (iv_block);
}
gnutls_free (key_block);
/* first run */
datasize = i_datasize + HANDSHAKE_HEADER_SIZE;
- data = gnutls_alloca (datasize);
+ data = gnutls_malloc (datasize);
if (data == NULL)
{
gnutls_assert ();
_gnutls_handshake_hash_add_sent (session, type, data, datasize)) < 0)
{
gnutls_assert ();
- gnutls_afree (data);
+ gnutls_free (data);
return ret;
}
_gnutls_handshake_io_send_int (session, GNUTLS_HANDSHAKE, type,
data, datasize);
- gnutls_afree (data);
+ gnutls_free (data);
return ret;
}
return extdatalen;
}
- data = gnutls_alloca (datalen + extdatalen);
+ data = gnutls_malloc (datalen + extdatalen);
if (data == NULL)
{
gnutls_assert ();
ret =
_gnutls_send_handshake (session, data, datalen,
GNUTLS_HANDSHAKE_SERVER_HELLO);
- gnutls_afree (data);
+ gnutls_free (data);
return ret;
}
/*
- * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation
+ * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation
*
* Author: Nikos Mavrogiannopoulos
*
typedef void svoid; /* for functions that allocate using gnutls_secure_malloc */
-/* Use gnutls_afree() when calling alloca, or
- * memory leaks may occur in systems which do not
- * support alloca.
- */
-#ifdef USE_EFENCE
-# define gnutls_alloca gnutls_malloc
-# define gnutls_afree gnutls_free
-#endif
-
-#ifdef HAVE_ALLOCA
-# ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-# endif
-# ifndef gnutls_alloca
-# define gnutls_alloca alloca
-# define gnutls_afree(x)
-# endif
-#else
-# ifndef gnutls_alloca
-# define gnutls_alloca gnutls_malloc
-# define gnutls_afree gnutls_free
-# endif
-#endif /* HAVE_ALLOCA */
-
extern int (*_gnutls_is_secure_memory) (const void *);
/* this realloc function will return ptr if size==0, and
/*
- * Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation
+ * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation
*
* Author: Nikos Mavrogiannopoulos
*
return _gnutls_asn2err (result);
}
- tmpstr = gnutls_alloca (tmpstr_size);
+ tmpstr = gnutls_malloc (tmpstr_size);
if (tmpstr == NULL)
{
gnutls_assert ();
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return _gnutls_asn2err (result);
}
if (_gnutls_mpi_scan (ret_mpi, tmpstr, &s_len) != 0)
{
gnutls_assert ();
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return GNUTLS_E_MPI_SCAN_FAILED;
}
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return 0;
}
else
result = _gnutls_mpi_print (NULL, &s_len, mpi);
- tmpstr = gnutls_alloca (s_len);
+ tmpstr = gnutls_malloc (s_len);
if (tmpstr == NULL)
{
gnutls_assert ();
if (result != 0)
{
gnutls_assert ();
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return GNUTLS_E_MPI_PRINT_FAILED;
}
result = asn1_write_value (node, value, tmpstr, s_len);
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
if (result != ASN1_SUCCESS)
{
return GNUTLS_E_PK_ENCRYPTION_FAILED;
}
- edata = gnutls_alloca (k);
+ edata = gnutls_malloc (k);
if (edata == NULL)
{
gnutls_assert ();
if (params_len < RSA_PUBLIC_PARAMS)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_INTERNAL_ERROR;
}
if ( ret < 0)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return ret;
}
for (i = 0; i < psize; i++)
if (ret < 0)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return ret;
}
}
if (params_len < RSA_PRIVATE_PARAMS)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_INTERNAL_ERROR;
}
break;
default:
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_INTERNAL_ERROR;
}
if (_gnutls_mpi_scan_nz (&m, edata, &k) != 0)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_MPI_SCAN_FAILED;
}
- gnutls_afree (edata);
+ gnutls_free (edata);
if (btype == 2) /* encrypt */
ret = _gnutls_pk_encrypt (GCRY_PK_RSA, &res, m, params, params_len);
}
_gnutls_mpi_print (NULL, &esize, res);
- edata = gnutls_alloca (esize + 1);
+ edata = gnutls_malloc (esize + 1);
if (edata == NULL)
{
gnutls_assert ();
if (edata[0] != 0 || edata[1] != btype)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_DECRYPTION_FAILED;
}
break;
default:
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
break;
}
i++;
if (ret < 0)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_DECRYPTION_FAILED;
}
if (_gnutls_sset_datum (plaintext, &edata[i], esize - i) < 0)
{
gnutls_assert ();
- gnutls_afree (edata);
+ gnutls_free (edata);
return GNUTLS_E_MEMORY_ERROR;
}
- gnutls_afree (edata);
+ gnutls_free (edata);
return 0;
}
return ret;
}
- der = gnutls_alloca (der_size);
+ der = gnutls_malloc (der_size);
if (der == NULL)
{
gnutls_assert ();
if (ret < 0)
{
gnutls_assert ();
- gnutls_afree (der);
+ gnutls_free (der);
return ret;
}
tmp.size = der_size;
ret = gnutls_x509_crl_import (dest, &tmp, GNUTLS_X509_FMT_DER);
- gnutls_afree (der);
+ gnutls_free (der);
if (ret < 0)
{
return _gnutls_asn2err (result);
}
- tmpstr = gnutls_alloca (len);
+ tmpstr = gnutls_malloc (len);
if (tmpstr == NULL)
{
gnutls_assert ();
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return _gnutls_asn2err (result);
}
else
{
gnutls_assert ();
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return GNUTLS_E_INTERNAL_ERROR;
}
- gnutls_afree (tmpstr);
+ gnutls_free (tmpstr);
return 0;
}
else
key_size = kdf_params->key_size;
- key = gnutls_alloca (key_size);
+ key = gnutls_malloc (key_size);
if (key == NULL)
{
gnutls_assert ();
d_iv.size = enc_params->iv_size;
result = _gnutls_cipher_init (&ch, enc_params->cipher, &dkey, &d_iv);
- gnutls_afree (key);
+ gnutls_free (key);
key = NULL;
if (result < 0)
error:
gnutls_free (data);
- gnutls_afree (key);
+ gnutls_free (key);
if (ch_init != 0)
_gnutls_cipher_deinit (&ch);
return result;
buf_size = 0;
asn1_der_coding (cert, tbs_name, NULL, &buf_size, NULL);
- buf = gnutls_alloca (buf_size);
+ buf = gnutls_malloc (buf_size);
if (buf == NULL)
{
gnutls_assert ();
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
- gnutls_afree (buf);
+ gnutls_free (buf);
return _gnutls_asn2err (result);
}
tbs.size = buf_size;
result = _gnutls_x509_sign (&tbs, hash, signer, signature);
- gnutls_afree (buf);
+ gnutls_free (buf);
return result;
}
return ret;
}
- der = gnutls_alloca (der_size);
+ der = gnutls_malloc (der_size);
if (der == NULL)
{
gnutls_assert ();
if (ret < 0)
{
gnutls_assert ();
- gnutls_afree (der);
+ gnutls_free (der);
return ret;
}
tmp.size = der_size;
ret = gnutls_x509_crt_import (dest, &tmp, GNUTLS_X509_FMT_DER);
- gnutls_afree (der);
+ gnutls_free (der);
if (ret < 0)
{
cert_buf_size = 0;
asn1_der_coding (cert->cert, "", NULL, &cert_buf_size, NULL);
- cert_buf = gnutls_alloca (cert_buf_size);
+ cert_buf = gnutls_malloc (cert_buf_size);
if (cert_buf == NULL)
{
gnutls_assert ();
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
- gnutls_afree (cert_buf);
+ gnutls_free (cert_buf);
return _gnutls_asn2err (result);
}
tmp.size = cert_buf_size;
result = gnutls_fingerprint (algo, &tmp, buf, sizeof_buf);
- gnutls_afree (cert_buf);
+ gnutls_free (cert_buf);
return result;
}
return _gnutls_asn2err (result);
}
- pubkey.data = gnutls_alloca (pubkey.size);
+ pubkey.data = gnutls_malloc (pubkey.size);
if (pubkey.data == NULL)
{
gnutls_assert ();
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
- gnutls_afree (pubkey.data);
+ gnutls_free (pubkey.data);
return _gnutls_asn2err (result);
}
result = gnutls_fingerprint (GNUTLS_DIG_SHA1, &pubkey,
output_data, output_data_size);
- gnutls_afree (pubkey.data);
+ gnutls_free (pubkey.data);
return result;
}