mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 10:47:28 +02:00
Free OcspEntry.status only when the struct owns the pointer
This commit is contained in:
14
src/ocsp.c
14
src/ocsp.c
@ -75,7 +75,7 @@ static void FreeOcspEntry(OcspEntry* entry, void* heap)
|
|||||||
{
|
{
|
||||||
CertStatus *status, *next;
|
CertStatus *status, *next;
|
||||||
|
|
||||||
if (entry == NULL)
|
if (entry == NULL || !entry->ownStatus)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
WOLFSSL_ENTER("FreeOcspEntry");
|
WOLFSSL_ENTER("FreeOcspEntry");
|
||||||
@ -799,6 +799,7 @@ OcspResponse* wolfSSL_d2i_OCSP_RESPONSE(OcspResponse** response,
|
|||||||
XMEMSET(resp->single, 0, sizeof(OcspEntry));
|
XMEMSET(resp->single, 0, sizeof(OcspEntry));
|
||||||
resp->single->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
|
resp->single->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
|
||||||
DYNAMIC_TYPE_OCSP_STATUS);
|
DYNAMIC_TYPE_OCSP_STATUS);
|
||||||
|
resp->single->ownStatus = 1;
|
||||||
if (resp->single->status == NULL) {
|
if (resp->single->status == NULL) {
|
||||||
XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
|
XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
|
||||||
@ -878,6 +879,7 @@ WOLFSSL_OCSP_BASICRESP* wolfSSL_OCSP_response_get1_basic(OcspResponse* response)
|
|||||||
else {
|
else {
|
||||||
XMEMCPY(bs->single, response->single, sizeof(OcspEntry));
|
XMEMCPY(bs->single, response->single, sizeof(OcspEntry));
|
||||||
XMEMCPY(bs->source, response->source, response->maxIdx);
|
XMEMCPY(bs->source, response->source, response->maxIdx);
|
||||||
|
bs->single->ownStatus = 0;
|
||||||
}
|
}
|
||||||
return bs;
|
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_ONEREQ* wolfSSL_OCSP_request_add0_id(OcspRequest *req,
|
||||||
WOLFSSL_OCSP_CERTID *cid)
|
WOLFSSL_OCSP_CERTID *cid)
|
||||||
{
|
{
|
||||||
if (req == NULL || cid == NULL)
|
if (req == NULL || cid == NULL || cid->status == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE);
|
XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE);
|
||||||
XMEMCPY(req->issuerKeyHash, cid->issuerKeyHash, 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);
|
XMEMCPY(req->serial, cid->status->serial, cid->status->serialSz);
|
||||||
req->serialSz = cid->status->serialSz;
|
req->serialSz = cid->status->serialSz;
|
||||||
|
|
||||||
|
@ -1390,6 +1390,8 @@ struct OcspEntry
|
|||||||
byte* rawCertId; /* raw bytes of the CertID */
|
byte* rawCertId; /* raw bytes of the CertID */
|
||||||
int rawCertIdSize; /* num bytes in raw CertID */
|
int rawCertIdSize; /* num bytes in raw CertID */
|
||||||
/* option bits - using 32-bit for alignment */
|
/* 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 */
|
word32 isDynamic:1; /* was dynamically allocated */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user