summaryrefslogtreecommitdiff
path: root/lib/gnutls_handshake.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2004-03-26 22:52:09 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2004-03-26 22:52:09 +0000
commit3d9e793ed193c7722f31b177f0bfb4629662c663 (patch)
tree6b4f937e746fb4c7604db5c8817b0d39b00f2cff /lib/gnutls_handshake.c
parent64830e9769402b7e1b8bf0d94c42df4043be55dd (diff)
downloadgnutls-3d9e793ed193c7722f31b177f0bfb4629662c663.tar.gz
some improvements that lead to fewer calls to malloc().
Diffstat (limited to 'lib/gnutls_handshake.c')
-rw-r--r--lib/gnutls_handshake.c52
1 files changed, 22 insertions, 30 deletions
diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c
index 2d4019cde5..efdc9a09b3 100644
--- a/lib/gnutls_handshake.c
+++ b/lib/gnutls_handshake.c
@@ -1339,7 +1339,7 @@ static int _gnutls_read_server_hello(gnutls_session session, opaque *data,
* Needed in client hello messages. Returns the new data length.
*/
static int _gnutls_copy_ciphersuites(gnutls_session session,
- opaque ** ret_data)
+ opaque * ret_data, size_t ret_data_size)
{
int ret, i;
GNUTLS_CipherSuite *cipher_suites;
@@ -1381,21 +1381,18 @@ static int _gnutls_copy_ciphersuites(gnutls_session session,
datalen += sizeof(uint16) + cipher_num;
- *ret_data = gnutls_malloc(datalen);
- if (*ret_data == NULL) {
+ if (datalen > ret_data_size) {
gnutls_assert();
- gnutls_free(cipher_suites);
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_INTERNAL_ERROR;
}
-
- _gnutls_write_uint16(cipher_num, *ret_data);
+
+ _gnutls_write_uint16(cipher_num, ret_data);
pos += 2;
for (i = 0; i < (cipher_num / 2); i++) {
- memcpy( &(*ret_data)[pos], cipher_suites[i].CipherSuite, 2);
+ memcpy( &ret_data[pos], cipher_suites[i].CipherSuite, 2);
pos += 2;
}
-
gnutls_free(cipher_suites);
return datalen;
@@ -1406,7 +1403,7 @@ static int _gnutls_copy_ciphersuites(gnutls_session session,
* Needed in hello messages. Returns the new data length.
*/
static int _gnutls_copy_comp_methods(gnutls_session session,
- opaque ** ret_data)
+ opaque * ret_data, size_t ret_data_size)
{
int ret, i;
uint8 *compression_methods, comp_num;
@@ -1425,17 +1422,15 @@ static int _gnutls_copy_comp_methods(gnutls_session session,
datalen = pos = 0;
datalen += comp_num + 1;
- *ret_data = gnutls_malloc(datalen);
- if (*ret_data == NULL) {
+ if (datalen > ret_data_size) {
gnutls_assert();
- gnutls_free(compression_methods);
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_INTERNAL_ERROR;
}
- (*ret_data)[pos++] = comp_num; /* put the number of compression methods */
+ ret_data[pos++] = comp_num; /* put the number of compression methods */
for (i = 0; i < comp_num; i++) {
- (*ret_data)[pos++] = compression_methods[i];
+ ret_data[pos++] = compression_methods[i];
}
gnutls_free(compression_methods);
@@ -1443,17 +1438,22 @@ static int _gnutls_copy_comp_methods(gnutls_session session,
return datalen;
}
+/* This should be sufficient by now. It should hold all the extensions
+ * plus the headers in a hello message.
+ */
+#define MAX_EXT_DATA_LENGTH 1024
+
/* This function sends the client hello handshake message.
*/
static int _gnutls_send_client_hello(gnutls_session session, int again)
{
opaque *data = NULL;
- opaque *extdata = NULL;
int extdatalen;
int pos = 0;
int datalen = 0, ret = 0;
opaque random[TLS_RANDOM_SIZE];
gnutls_protocol_version hver;
+ opaque extdata[MAX_EXT_DATA_LENGTH];
opaque *SessionID =
session->internals.resumed_security_parameters.session_id;
@@ -1535,18 +1535,16 @@ static int _gnutls_send_client_hello(gnutls_session session, int again)
/* Copy the ciphersuites.
*/
- extdatalen = _gnutls_copy_ciphersuites(session, &extdata);
+ extdatalen = _gnutls_copy_ciphersuites(session, extdata, sizeof(extdata));
if (extdatalen > 0) {
datalen += extdatalen;
data = gnutls_realloc_fast(data, datalen);
if (data == NULL) {
gnutls_assert();
- gnutls_free(extdata);
return GNUTLS_E_MEMORY_ERROR;
}
memcpy(&data[pos], extdata, extdatalen);
- gnutls_free(extdata);
pos += extdatalen;
} else {
@@ -1560,18 +1558,16 @@ static int _gnutls_send_client_hello(gnutls_session session, int again)
/* Copy the compression methods.
*/
- extdatalen = _gnutls_copy_comp_methods(session, &extdata);
+ extdatalen = _gnutls_copy_comp_methods(session, extdata, sizeof(extdata));
if (extdatalen > 0) {
datalen += extdatalen;
data = gnutls_realloc_fast(data, datalen);
if (data == NULL) {
gnutls_assert();
- gnutls_free(extdata);
return GNUTLS_E_MEMORY_ERROR;
}
memcpy(&data[pos], extdata, extdatalen);
- gnutls_free(extdata);
pos += extdatalen;
} else {
@@ -1585,19 +1581,17 @@ static int _gnutls_send_client_hello(gnutls_session session, int again)
/* Generate and copy TLS extensions.
*/
if (hver >= GNUTLS_TLS1) {
- extdatalen = _gnutls_gen_extensions(session, &extdata);
+ extdatalen = _gnutls_gen_extensions(session, extdata, sizeof(extdata));
if (extdatalen > 0) {
datalen += extdatalen;
data = gnutls_realloc_fast(data, datalen);
if (data == NULL) {
gnutls_assert();
- gnutls_free(extdata);
return GNUTLS_E_MEMORY_ERROR;
}
memcpy(&data[pos], extdata, extdatalen);
- gnutls_free(extdata);
} else if (extdatalen < 0) {
gnutls_assert();
gnutls_free(data);
@@ -1617,7 +1611,7 @@ static int _gnutls_send_client_hello(gnutls_session session, int again)
static int _gnutls_send_server_hello(gnutls_session session, int again)
{
opaque *data = NULL;
- opaque *extdata = NULL;
+ opaque extdata[MAX_EXT_DATA_LENGTH];
int extdatalen;
int pos = 0;
int datalen, ret = 0;
@@ -1654,7 +1648,7 @@ static int _gnutls_send_server_hello(gnutls_session session, int again)
if (again == 0) {
datalen = 2 + session_id_len + 1 + TLS_RANDOM_SIZE + 3;
- extdatalen = _gnutls_gen_extensions(session, &extdata);
+ extdatalen = _gnutls_gen_extensions(session, extdata, sizeof(extdata));
if (extdatalen < 0) {
gnutls_assert();
@@ -1664,7 +1658,6 @@ static int _gnutls_send_server_hello(gnutls_session session, int again)
data = gnutls_alloca(datalen + extdatalen);
if (data == NULL) {
gnutls_assert();
- gnutls_free(extdata);
return GNUTLS_E_MEMORY_ERROR;
}
@@ -1705,7 +1698,6 @@ static int _gnutls_send_server_hello(gnutls_session session, int again)
datalen += extdatalen;
memcpy(&data[pos], extdata, extdatalen);
- gnutls_free(extdata);
}
}