From: Simon Josefsson Date: Wed, 3 Jun 2009 02:54:43 +0000 (+0200) Subject: Reduce stack usage. X-Git-Tag: gnutls_2_9_1~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f42117a3ac5f3ff54997aeb2b3a01a8f7833faa7;p=thirdparty%2Fgnutls.git Reduce stack usage. --- diff --git a/lib/x509/x509_write.c b/lib/x509/x509_write.c index 76933c4493..dd07444f43 100644 --- a/lib/x509/x509_write.c +++ b/lib/x509/x509_write.c @@ -304,13 +304,7 @@ int gnutls_x509_crt_set_crq_extensions (gnutls_x509_crt_t crt, gnutls_x509_crq_t crq) { - int result, i; - char oid[MAX_OID_SIZE]; - size_t oid_size; - opaque extensions[MAX_CRQ_EXTENSIONS_SIZE]; - size_t extensions_size = sizeof (extensions); - unsigned int critical; - gnutls_datum ext; + size_t i; if (crt == NULL || crq == NULL) { @@ -320,10 +314,17 @@ gnutls_x509_crt_set_crq_extensions (gnutls_x509_crt_t crt, for (i = 0;; i++) { + int result; + char oid[MAX_OID_SIZE]; + size_t oid_size; + opaque *extensions; + size_t extensions_size; + unsigned int critical; + gnutls_datum ext; + oid_size = sizeof (oid); - result = - gnutls_x509_crq_get_extension_info (crq, i, oid, &oid_size, - &critical); + result = gnutls_x509_crq_get_extension_info (crq, i, oid, + &oid_size, &critical); if (result < 0) { if (result == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) @@ -333,14 +334,28 @@ gnutls_x509_crt_set_crq_extensions (gnutls_x509_crt_t crt, return result; } - extensions_size = sizeof (extensions); - result = - gnutls_x509_crq_get_extension_data (crq, i, extensions, - &extensions_size); + extensions_size = 0; + result = gnutls_x509_crq_get_extension_data (crq, i, NULL, + &extensions_size); + if (result < 0) + { + gnutls_assert (); + return result; + } + + extensions = gnutls_malloc (extensions_size); + if (extensions == NULL) + { + gnutls_assert (); + return GNUTLS_E_MEMORY_ERROR; + } + result = gnutls_x509_crq_get_extension_data (crq, i, extensions, + &extensions_size); if (result < 0) { gnutls_assert (); + gnutls_free (extensions); return result; } @@ -348,12 +363,12 @@ gnutls_x509_crt_set_crq_extensions (gnutls_x509_crt_t crt, ext.size = extensions_size; result = _gnutls_x509_crt_set_extension (crt, oid, &ext, critical); + gnutls_free (extensions); if (result < 0) { gnutls_assert (); return result; } - } if (i > 0)