[prev in list] [next in list] [prev in thread] [next in thread]
List: gnupg-commit-watchers
Subject: [gnutls-commits] cvs: gnutls /lib gnutls_extensions.c
From: "Nikos Mavroyanopoulos" <nmav () gnutls ! org>
Date: 2004-03-26 22:52:10
Message-ID: cvsnmav1080341529 () cvsserver
[Download RAW message or body]
This is a MIME encoded message
nmav Fri Mar 26 23:52:10 2004 EDT
Modified files:
/gnutls/lib gnutls_extensions.c gnutls_extensions.h
gnutls_handshake.c gnutls_x509.c
Log:
some improvements that lead to fewer calls to malloc().
["nmav-20040326235210.txt" (text/plain)]
Index: gnutls/lib/gnutls_extensions.c
diff -u gnutls/lib/gnutls_extensions.c:2.51 gnutls/lib/gnutls_extensions.c:2.52
--- gnutls/lib/gnutls_extensions.c:2.51 Tue Feb 10 22:08:08 2004
+++ gnutls/lib/gnutls_extensions.c Fri Mar 26 23:52:09 2004
@@ -174,20 +174,29 @@
}
}
-int _gnutls_gen_extensions( gnutls_session session, opaque** data) {
+int _gnutls_gen_extensions( gnutls_session session, opaque* data, size_t data_size)
+{
int next, size;
uint16 pos=0;
-opaque sdata[1024];
-int sdata_size = sizeof(sdata);
+opaque *sdata;
+int sdata_size;
ext_send_func ext_send;
- (*data) = gnutls_malloc(2); /* allocate size for size */
- if ((*data)==NULL) {
+ if (data_size < 2) {
gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_INTERNAL_ERROR;
}
+ /* allocate enough data for each extension.
+ */
+ sdata_size = data_size;
+ sdata = gnutls_malloc( sdata_size);
+ if (sdata == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+
pos+=2;
next = MAX_EXT_TYPES; /* maximum supported extensions */
do {
@@ -196,21 +205,21 @@
if (ext_send == NULL) continue;
size = ext_send( session, sdata, sdata_size);
if (size > 0) {
- (*data) = gnutls_realloc_fast( (*data), pos+size+4);
- if ((*data)==NULL) {
+ if (data_size < pos+(size_t)size+4) {
gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
+ gnutls_free(sdata);
+ return GNUTLS_E_INTERNAL_ERROR;
}
/* write extension type */
- _gnutls_write_uint16( next, &(*data)[pos]);
+ _gnutls_write_uint16( next, &data[pos]);
pos+=2;
/* write size */
- _gnutls_write_uint16( size, &(*data)[pos]);
+ _gnutls_write_uint16( size, &data[pos]);
pos+=2;
- memcpy( &(*data)[pos], sdata, size);
+ memcpy( &data[pos], sdata, size);
pos+=size;
/* add this extension to the extension list
@@ -221,7 +230,7 @@
_gnutls_extension_get_name(next));
} else if (size < 0) {
gnutls_assert();
- gnutls_free(*data); *data = NULL;
+ gnutls_free(sdata);
return size;
}
@@ -230,13 +239,13 @@
size = pos;
pos-=2; /* remove the size of the size header! */
- _gnutls_write_uint16( pos, (*data));
+ _gnutls_write_uint16( pos, data);
if (size==2) { /* empty */
size = 0;
- gnutls_free(*data);
- (*data) = NULL;
}
+
+ gnutls_free( sdata);
return size;
}
Index: gnutls/lib/gnutls_extensions.h
diff -u gnutls/lib/gnutls_extensions.h:2.8 gnutls/lib/gnutls_extensions.h:2.9
--- gnutls/lib/gnutls_extensions.h:2.8 Thu Nov 13 10:31:17 2003
+++ gnutls/lib/gnutls_extensions.h Fri Mar 26 23:52:09 2004
@@ -22,7 +22,7 @@
const char *_gnutls_extension_get_name(uint16 type);
int _gnutls_parse_extensions( gnutls_session, const opaque*, int);
-int _gnutls_gen_extensions( gnutls_session session, opaque** data);
+int _gnutls_gen_extensions( gnutls_session session, opaque* data, size_t data_size);
typedef int (*ext_recv_func)( gnutls_session, const opaque*, size_t); /* recv data */
typedef int (*ext_send_func)( gnutls_session, opaque*, size_t); /* send data */
Index: gnutls/lib/gnutls_handshake.c
diff -u gnutls/lib/gnutls_handshake.c:2.218 gnutls/lib/gnutls_handshake.c:2.219
--- gnutls/lib/gnutls_handshake.c:2.218 Sat Mar 13 02:06:16 2004
+++ gnutls/lib/gnutls_handshake.c Fri Mar 26 23:52:09 2004
@@ -1339,7 +1339,7 @@
* 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 @@
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 @@
* 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 @@
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 @@
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 @@
/* 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 @@
/* 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 @@
/* 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_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 @@
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 @@
data = gnutls_alloca(datalen + extdatalen);
if (data == NULL) {
gnutls_assert();
- gnutls_free(extdata);
return GNUTLS_E_MEMORY_ERROR;
}
@@ -1705,7 +1698,6 @@
datalen += extdatalen;
memcpy(&data[pos], extdata, extdatalen);
- gnutls_free(extdata);
}
}
Index: gnutls/lib/gnutls_x509.c
diff -u gnutls/lib/gnutls_x509.c:2.141 gnutls/lib/gnutls_x509.c:2.142
--- gnutls/lib/gnutls_x509.c:2.141 Mon Jan 5 12:09:12 2004
+++ gnutls/lib/gnutls_x509.c Fri Mar 26 23:52:09 2004
@@ -670,6 +670,10 @@
}
tot_size = stat_st.st_size;
+ if (tot_size == 0) {
+ gnutls_assert();
+ goto error;
+ }
#ifdef HAVE_MMAP
if ((tmp=mmap( NULL, tot_size, PROT_READ, MAP_SHARED, fd1, 0)) != MAP_FAILED) {
_______________________________________________
Gnutls-commits mailing list
Gnutls-commits@gnupg.org
http://lists.gnupg.org/mailman/listinfo/gnutls-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic