Skip to content

Commit d1a3646

Browse files
committed
add heap hint support for a few of the x509 functions
1 parent 089468f commit d1a3646

5 files changed

Lines changed: 49 additions & 27 deletions

File tree

src/ssl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18758,13 +18758,13 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
1875818758
WOLFSSL_ENTER("wolfSSL_get_peer_certificate");
1875918759
if (ssl != NULL) {
1876018760
if (ssl->peerCert.issuer.sz)
18761-
ret = wolfSSL_X509_dup(&ssl->peerCert);
18761+
ret = wolfSSL_X509_dup_ex(&ssl->peerCert, ssl->heap);
1876218762
#ifdef SESSION_CERTS
1876318763
else if (ssl->session->chain.count > 0) {
1876418764
if (DecodeToX509(&ssl->peerCert,
1876518765
ssl->session->chain.certs[0].buffer,
1876618766
ssl->session->chain.certs[0].length) == 0) {
18767-
ret = wolfSSL_X509_dup(&ssl->peerCert);
18767+
ret = wolfSSL_X509_dup_ex(&ssl->peerCert, ssl->heap);
1876818768
}
1876918769
}
1877018770
#endif

src/ssl_certman.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,33 +42,33 @@
4242
* @return A TLS method on success.
4343
* @return NULL when no TLS method built into wolfSSL.
4444
*/
45-
static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
45+
static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void* heap)
4646
{
4747
#ifndef NO_WOLFSSL_CLIENT
4848
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
49-
return wolfSSLv3_client_method();
49+
return wolfSSLv3_client_method_ex(heap);
5050
#elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
51-
return wolfTLSv1_client_method();
51+
return wolfTLSv1_client_method_ex(heap);
5252
#elif !defined(NO_OLD_TLS)
53-
return wolfTLSv1_1_client_method();
53+
return wolfTLSv1_1_client_method_ex(heap);
5454
#elif !defined(WOLFSSL_NO_TLS12)
55-
return wolfTLSv1_2_client_method();
55+
return wolfTLSv1_2_client_method_ex(heap);
5656
#elif defined(WOLFSSL_TLS13)
57-
return wolfTLSv1_3_client_method();
57+
return wolfTLSv1_3_client_method_ex(heap);
5858
#else
5959
return NULL;
6060
#endif
6161
#elif !defined(NO_WOLFSSL_SERVER)
6262
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
63-
return wolfSSLv3_server_method();
63+
return wolfSSLv3_server_method_ex(heap);
6464
#elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
65-
return wolfTLSv1_server_method();
65+
return wolfTLSv1_server_method_ex(heap);
6666
#elif !defined(NO_OLD_TLS)
67-
return wolfTLSv1_1_server_method();
67+
return wolfTLSv1_1_server_method_ex(heap);
6868
#elif !defined(WOLFSSL_NO_TLS12)
69-
return wolfTLSv1_2_server_method();
69+
return wolfTLSv1_2_server_method_ex(heap);
7070
#elif defined(WOLFSSL_TLS13)
71-
return wolfTLSv1_3_server_method();
71+
return wolfTLSv1_3_server_method_ex(heap);
7272
#else
7373
return NULL;
7474
#endif
@@ -513,8 +513,8 @@ int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm,
513513
ret = WOLFSSL_FATAL_ERROR;
514514
}
515515
/* Allocate a temporary WOLFSSL_CTX to load with. */
516-
if ((ret == WOLFSSL_SUCCESS) && ((tmp = wolfSSL_CTX_new(cm_pick_method()))
517-
== NULL)) {
516+
if ((ret == WOLFSSL_SUCCESS) && ((tmp =
517+
wolfSSL_CTX_new_ex(cm_pick_method(cm->heap), cm->heap)) == NULL)) {
518518
WOLFSSL_MSG("CTX new failed");
519519
ret = WOLFSSL_FATAL_ERROR;
520520
}
@@ -876,7 +876,7 @@ int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
876876
ret = WOLFSSL_FATAL_ERROR;
877877
}
878878
/* Create temporary WOLFSSL_CTX. */
879-
if ((ret == WOLFSSL_SUCCESS) && ((tmp = wolfSSL_CTX_new(cm_pick_method()))
879+
if ((ret == WOLFSSL_SUCCESS) && ((tmp = wolfSSL_CTX_new(cm_pick_method(cm->heap)))
880880
== NULL)) {
881881
WOLFSSL_MSG("CTX new failed");
882882
ret = WOLFSSL_FATAL_ERROR;

src/x509.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3593,7 +3593,7 @@ WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
35933593
}
35943594

35953595
static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
3596-
const byte* in, int len, int req)
3596+
const byte* in, int len, int req, void* heap)
35973597
{
35983598
WOLFSSL_X509 *newX509 = NULL;
35993599
int type = req ? CERTREQ_TYPE : CERT_TYPE;
@@ -3620,12 +3620,12 @@ static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
36203620
return NULL;
36213621
#endif
36223622

3623-
InitDecodedCert(cert, (byte*)in, len, NULL);
3623+
InitDecodedCert(cert, (byte*)in, len, heap);
36243624
#ifdef WOLFSSL_CERT_REQ
36253625
cert->isCSR = (byte)req;
36263626
#endif
36273627
if (ParseCertRelative(cert, type, 0, NULL) == 0) {
3628-
newX509 = wolfSSL_X509_new();
3628+
newX509 = wolfSSL_X509_new_ex(heap);
36293629
if (newX509 != NULL) {
36303630
if (CopyDecodedToX509(newX509, cert) != 0) {
36313631
wolfSSL_X509_free(newX509);
@@ -3659,16 +3659,22 @@ int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
36593659
return isCA;
36603660
}
36613661

3662+
WOLFSSL_X509* wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const byte* in, int len,
3663+
void* heap)
3664+
{
3665+
return d2i_X509orX509REQ(x509, in, len, 0, heap);
3666+
}
3667+
36623668
WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
36633669
{
3664-
return d2i_X509orX509REQ(x509, in, len, 0);
3670+
return wolfSSL_X509_d2i_ex(x509, in, len, NULL);
36653671
}
36663672

36673673
#ifdef WOLFSSL_CERT_REQ
36683674
WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
36693675
const unsigned char* in, int len)
36703676
{
3671-
return d2i_X509orX509REQ(x509, in, len, 1);
3677+
return d2i_X509orX509REQ(x509, in, len, 1, NULL);
36723678
}
36733679
#endif
36743680

@@ -5319,19 +5325,24 @@ WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
53195325
/* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
53205326
* fail
53215327
*/
5322-
WOLFSSL_X509* wolfSSL_X509_new(void)
5328+
WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap)
53235329
{
53245330
WOLFSSL_X509* x509;
53255331

5326-
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
5332+
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
53275333
DYNAMIC_TYPE_X509);
53285334
if (x509 != NULL) {
5329-
InitX509(x509, 1, NULL);
5335+
InitX509(x509, 1, heap);
53305336
}
53315337

53325338
return x509;
53335339
}
53345340

5341+
WOLFSSL_X509* wolfSSL_X509_new(void)
5342+
{
5343+
return wolfSSL_X509_new_ex(NULL);
5344+
}
5345+
53355346
WOLFSSL_ABI
53365347
WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
53375348
{
@@ -13408,7 +13419,7 @@ int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
1340813419

1340913420
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
1341013421
defined(KEEP_PEER_CERT)
13411-
WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
13422+
WOLFSSL_X509* wolfSSL_X509_dup_ex(WOLFSSL_X509 *x, void* heap)
1341213423
{
1341313424
WOLFSSL_ENTER("wolfSSL_X509_dup");
1341413425

@@ -13422,7 +13433,13 @@ WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
1342213433
return NULL;
1342313434
}
1342413435

13425-
return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
13436+
return wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer, x->derCert->length,
13437+
heap);
13438+
}
13439+
13440+
WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
13441+
{
13442+
return wolfSSL_X509_dup_ex(x, NULL);
1342613443
}
1342713444
#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
1342813445

src/x509_str.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
10351035
return WOLFSSL_FAILURE;
10361036

10371037
/* tmp ctx for setting our cert manager */
1038-
ctx = wolfSSL_CTX_new(cm_pick_method());
1038+
ctx = wolfSSL_CTX_new(cm_pick_method(NULL));
10391039
if (ctx == NULL)
10401040
return WOLFSSL_FAILURE;
10411041

wolfssl/ssl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,7 +1681,9 @@ WOLFSSL_API void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk);
16811681
WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl);
16821682

16831683
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new(void);
1684+
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap);
16841685
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509* x);
1686+
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_dup_ex(WOLFSSL_X509* x, void* heap);
16851687
#if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
16861688
WOLFSSL_API int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa);
16871689
WOLFSSL_API int wolfSSL_X509_up_ref(WOLFSSL_X509* x509);
@@ -2885,6 +2887,9 @@ WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509,
28852887
const unsigned char** in, int len);
28862888
WOLFSSL_API WOLFSSL_X509*
28872889
wolfSSL_X509_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len);
2890+
WOLFSSL_API WOLFSSL_X509*
2891+
wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const unsigned char* in, int len,
2892+
void* heap);
28882893
#ifdef WOLFSSL_CERT_REQ
28892894
WOLFSSL_API WOLFSSL_X509*
28902895
wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len);

0 commit comments

Comments
 (0)