summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Josefsson <simon@josefsson.org>2009-06-03 05:20:59 +0200
committerSimon Josefsson <simon@josefsson.org>2009-06-03 05:20:59 +0200
commit19a6656e9f691f0d635cf9dfa96819530690e637 (patch)
tree2775ce5a76f81faf7002f103dea7b18ee90be866
parent15fed28cfb0e4870aa23210b7428ce778c9ffb6b (diff)
downloadgnutls-19a6656e9f691f0d635cf9dfa96819530690e637.tar.gz
Reduce stack usage.
-rw-r--r--lib/x509/crq.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/lib/x509/crq.c b/lib/x509/crq.c
index e04df2b766..9fc12d11fc 100644
--- a/lib/x509/crq.c
+++ b/lib/x509/crq.c
@@ -1866,10 +1866,8 @@ gnutls_x509_crq_set_subject_alt_name (gnutls_x509_crq_t crq,
unsigned int flags)
{
int result = 0;
- opaque tmp[MAX_CRQ_EXTENSIONS_SIZE];
- size_t tmp_size = 0;
gnutls_datum_t der_data = { NULL, 0 };
- gnutls_datum_t prev_der_data;
+ gnutls_datum_t prev_der_data = { NULL, 0 };
unsigned int critical = 0;
if (crq == NULL)
@@ -1880,15 +1878,38 @@ gnutls_x509_crq_set_subject_alt_name (gnutls_x509_crq_t crq,
/* Check if the extension already exists.
*/
-
if (flags == GNUTLS_FSAN_APPEND)
{
- tmp_size = sizeof (tmp);
result = gnutls_x509_crq_get_extension_by_oid (crq, "2.5.29.17", 0,
- tmp, &tmp_size,
+ NULL, &prev_der_data.size,
&critical);
- if (result < 0 && result != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+ switch (result)
{
+ case GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE:
+ /* Replacing non-existing data means the same as set data. */
+ break;
+
+ case GNUTLS_E_SUCCESS:
+ prev_der_data.data = gnutls_malloc (prev_der_data.size);
+ if (prev_der_data.data == NULL)
+ {
+ gnutls_assert ();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+
+ result = gnutls_x509_crq_get_extension_by_oid (crq, "2.5.29.17", 0,
+ prev_der_data.data,
+ &prev_der_data.size,
+ &critical);
+ if (result < 0)
+ {
+ gnutls_assert ();
+ gnutls_free (prev_der_data.data);
+ return result;
+ }
+ break;
+
+ default:
gnutls_assert ();
return result;
}
@@ -1896,20 +1917,9 @@ gnutls_x509_crq_set_subject_alt_name (gnutls_x509_crq_t crq,
/* generate the extension.
*/
- if (result < 0)
- {
- prev_der_data.data = NULL;
- prev_der_data.size = 0;
- }
- else
- {
- prev_der_data.data = tmp;
- prev_der_data.size = tmp_size;
- }
-
result = _gnutls_x509_ext_gen_subject_alt_name (nt, data, data_size,
&prev_der_data, &der_data);
-
+ gnutls_free (prev_der_data.data);
if (result < 0)
{
gnutls_assert ();