Skip to content

Commit dbf88e4

Browse files
authored
Merge pull request #7779 from rizlik/ocsp-dfree-fix
ocsp: don't free ocsp request if saved in ssl->ctx->certOcspRequest
2 parents ad76038 + 31380ac commit dbf88e4

File tree

2 files changed

+73
-8
lines changed

2 files changed

+73
-8
lines changed

Diff for: src/internal.c

+18-8
Original file line numberDiff line numberDiff line change
@@ -23313,13 +23313,17 @@ int SendFinished(WOLFSSL* ssl)
2331323313
* Returns 0 on success
2331423314
*/
2331523315
static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
23316-
DecodedCert* cert, byte* certData, word32 length)
23316+
DecodedCert* cert, byte* certData, word32 length,
23317+
byte *ctxOwnsRequest)
2331723318
{
2331823319
int ret;
2331923320

2332023321
if (request != NULL)
2332123322
XMEMSET(request, 0, sizeof(OcspRequest));
2332223323

23324+
if (ctxOwnsRequest!= NULL)
23325+
*ctxOwnsRequest = 0;
23326+
2332323327
InitDecodedCert(cert, certData, length, ssl->heap);
2332423328
/* TODO: Setup async support here */
2332523329
ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl), NULL);
@@ -23333,8 +23337,11 @@ static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
2333323337
if (!ssl->buffers.weOwnCert) {
2333423338
wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
2333523339
if (wc_LockMutex(ocspLock) == 0) {
23336-
if (ssl->ctx->certOcspRequest == NULL)
23340+
if (ssl->ctx->certOcspRequest == NULL) {
2333723341
ssl->ctx->certOcspRequest = request;
23342+
if (ctxOwnsRequest!= NULL)
23343+
*ctxOwnsRequest = 1;
23344+
}
2333823345
wc_UnLockMutex(ocspLock);
2333923346
}
2334023347
}
@@ -23363,6 +23370,7 @@ int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
2336323370
int ret = 0;
2336423371
OcspRequest* request = NULL;
2336523372
byte createdRequest = 0;
23373+
byte ctxOwnsRequest = 0;
2336623374

2336723375
if (ssl == NULL || ocspRequest == NULL || response == NULL)
2336823376
return BAD_FUNC_ARG;
@@ -23400,7 +23408,7 @@ int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
2340023408
createdRequest = 1;
2340123409
if (ret == 0) {
2340223410
ret = CreateOcspRequest(ssl, request, cert, der->buffer,
23403-
der->length);
23411+
der->length, &ctxOwnsRequest);
2340423412
}
2340523413

2340623414
if (ret != 0) {
@@ -23427,7 +23435,7 @@ int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
2342723435
}
2342823436

2342923437
/* free request up if error case found otherwise return it */
23430-
if (ret != 0 && createdRequest) {
23438+
if (ret != 0 && createdRequest && !ctxOwnsRequest) {
2343123439
FreeOcspRequest(request);
2343223440
XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
2343323441
}
@@ -24122,6 +24130,7 @@ int SendCertificateStatus(WOLFSSL* ssl)
2412224130
{
2412324131
OcspRequest* request = ssl->ctx->certOcspRequest;
2412424132
buffer responses[1 + MAX_CHAIN_DEPTH];
24133+
byte ctxOwnsRequest = 0;
2412524134
int i = 0;
2412624135

2412724136
XMEMSET(responses, 0, sizeof(responses));
@@ -24180,7 +24189,7 @@ int SendCertificateStatus(WOLFSSL* ssl)
2418024189
break;
2418124190

2418224191
ret = CreateOcspRequest(ssl, request, cert, der.buffer,
24183-
der.length);
24192+
der.length, &ctxOwnsRequest);
2418424193
if (ret == 0) {
2418524194
request->ssl = ssl;
2418624195
ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
@@ -24195,12 +24204,13 @@ int SendCertificateStatus(WOLFSSL* ssl)
2419524204

2419624205

2419724206
i++;
24198-
FreeOcspRequest(request);
24207+
if (!ctxOwnsRequest)
24208+
FreeOcspRequest(request);
2419924209
}
2420024210
}
2420124211
}
24202-
24203-
XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
24212+
if (!ctxOwnsRequest)
24213+
XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
2420424214
#ifdef WOLFSSL_SMALL_STACK
2420524215
XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
2420624216
#endif

Diff for: tests/api.c

+55
Original file line numberDiff line numberDiff line change
@@ -84316,6 +84316,60 @@ static int test_wolfSSL_SendUserCanceled(void)
8431684316
#endif
8431784317
return EXPECT_RESULT();
8431884318
}
84319+
#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && \
84320+
defined(HAVE_OCSP) && \
84321+
defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \
84322+
!defined(WOLFSSL_NO_TLS12)
84323+
static int test_ocsp_callback_fails_cb(void* ctx, const char* url, int urlSz,
84324+
byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf)
84325+
{
84326+
(void)ctx;
84327+
(void)url;
84328+
(void)urlSz;
84329+
(void)ocspReqBuf;
84330+
(void)ocspReqSz;
84331+
(void)ocspRespBuf;
84332+
return -1;
84333+
}
84334+
static int test_ocsp_callback_fails(void)
84335+
{
84336+
WOLFSSL_CTX *ctx_c = NULL;
84337+
WOLFSSL_CTX *ctx_s = NULL;
84338+
WOLFSSL *ssl_c = NULL;
84339+
WOLFSSL *ssl_s = NULL;
84340+
struct test_memio_ctx test_ctx;
84341+
EXPECT_DECLS;
84342+
84343+
XMEMSET(&test_ctx, 0, sizeof(test_ctx));
84344+
ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
84345+
wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0);
84346+
ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx_c), WOLFSSL_SUCCESS);
84347+
ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx_s), WOLFSSL_SUCCESS);
84348+
ExpectIntEQ(wolfSSL_UseOCSPStapling(ssl_c, WOLFSSL_CSR_OCSP,0), WOLFSSL_SUCCESS);
84349+
/* override URL to avoid exing from SendCertificateStatus because of no AuthInfo on the certificate */
84350+
ExpectIntEQ(wolfSSL_CTX_SetOCSP_OverrideURL(ctx_s, "http://dummy.test"), WOLFSSL_SUCCESS);
84351+
ExpectIntEQ(wolfSSL_CTX_EnableOCSP(ctx_s, WOLFSSL_OCSP_NO_NONCE | WOLFSSL_OCSP_URL_OVERRIDE), WOLFSSL_SUCCESS);
84352+
ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx_s, caCertFile, 0), WOLFSSL_SUCCESS);
84353+
ExpectIntEQ(wolfSSL_SetOCSP_Cb(ssl_s, test_ocsp_callback_fails_cb, NULL, NULL), WOLFSSL_SUCCESS);
84354+
ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), -1);
84355+
ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), OCSP_INVALID_STATUS);
84356+
84357+
wolfSSL_free(ssl_c);
84358+
wolfSSL_free(ssl_s);
84359+
wolfSSL_CTX_free(ctx_c);
84360+
wolfSSL_CTX_free(ctx_s);
84361+
84362+
return EXPECT_RESULT();
84363+
}
84364+
#else
84365+
static int test_ocsp_callback_fails(void)
84366+
{
84367+
return TEST_SKIPPED;
84368+
}
84369+
#endif /* defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && \
84370+
defined(HAVE_OCSP) && \
84371+
defined(HAVE_CERTIFICATE_STATUS_REQUEST) */
84372+
8431984373

8432084374
/*----------------------------------------------------------------------------*
8432184375
| Main
@@ -85556,6 +85610,7 @@ TEST_CASE testCases[] = {
8555685610
TEST_DECL(test_wolfSSL_UseOCSPStapling),
8555785611
TEST_DECL(test_wolfSSL_UseOCSPStaplingV2),
8555885612
TEST_DECL(test_self_signed_stapling),
85613+
TEST_DECL(test_ocsp_callback_fails),
8555985614

8556085615
/* Multicast */
8556185616
TEST_DECL(test_wolfSSL_mcast),

0 commit comments

Comments
 (0)