diff options
author | Simon Josefsson <simon@josefsson.org> | 2009-06-03 05:20:59 +0200 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2009-06-03 05:20:59 +0200 |
commit | 19a6656e9f691f0d635cf9dfa96819530690e637 (patch) | |
tree | 2775ce5a76f81faf7002f103dea7b18ee90be866 | |
parent | 15fed28cfb0e4870aa23210b7428ce778c9ffb6b (diff) | |
download | gnutls-19a6656e9f691f0d635cf9dfa96819530690e637.tar.gz |
Reduce stack usage.
-rw-r--r-- | lib/x509/crq.c | 48 |
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 (); |