diff --git a/src/ocsp.c b/src/ocsp.c index 216ed23bc..c9dbaea18 100644 --- a/src/ocsp.c +++ b/src/ocsp.c @@ -75,7 +75,7 @@ static void FreeOcspEntry(OcspEntry* entry, void* heap) { CertStatus *status, *next; - if (entry == NULL) + if (entry == NULL || !entry->ownStatus) return; WOLFSSL_ENTER("FreeOcspEntry"); @@ -799,6 +799,7 @@ OcspResponse* wolfSSL_d2i_OCSP_RESPONSE(OcspResponse** response, XMEMSET(resp->single, 0, sizeof(OcspEntry)); resp->single->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL, DYNAMIC_TYPE_OCSP_STATUS); + resp->single->ownStatus = 1; if (resp->single->status == NULL) { XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST); @@ -878,6 +879,7 @@ WOLFSSL_OCSP_BASICRESP* wolfSSL_OCSP_response_get1_basic(OcspResponse* response) else { XMEMCPY(bs->single, response->single, sizeof(OcspEntry)); XMEMCPY(bs->source, response->source, response->maxIdx); + bs->single->ownStatus = 0; } return bs; } @@ -914,11 +916,19 @@ int wolfSSL_i2d_OCSP_REQUEST(OcspRequest* request, unsigned char** data) WOLFSSL_OCSP_ONEREQ* wolfSSL_OCSP_request_add0_id(OcspRequest *req, WOLFSSL_OCSP_CERTID *cid) { - if (req == NULL || cid == NULL) + if (req == NULL || cid == NULL || cid->status == NULL) return NULL; XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE); XMEMCPY(req->issuerKeyHash, cid->issuerKeyHash, KEYID_SIZE); + if (cid->status->serialSz > req->serialSz) { + if (req->serial != NULL) + XFREE(req->serial, req->heap, DYNAMIC_TYPE_OCSP); + req->serial = (byte*)XMALLOC(cid->status->serialSz, + req->heap, DYNAMIC_TYPE_OCSP_REQUEST); + if (req->serial == NULL) + return NULL; + } XMEMCPY(req->serial, cid->status->serial, cid->status->serialSz); req->serialSz = cid->status->serialSz; diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index e412c1d06..2ea5761c1 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -1390,6 +1390,8 @@ struct OcspEntry byte* rawCertId; /* raw bytes of the CertID */ int rawCertIdSize; /* num bytes in raw CertID */ /* option bits - using 32-bit for alignment */ + word32 ownStatus:1; /* do we need to free the status + * response list */ word32 isDynamic:1; /* was dynamically allocated */ };