openssl/crypto/ocsp/ocsp_http.c
Tomas Mraz f99b34957f OCSP_sendreq_bio: Avoid doublefree of mem BIO
Reviewed-by: David von Oheimb <david.von.oheimb@siemens.com>
(Merged from https://github.com/openssl/openssl/pull/16886)
2021-10-25 11:43:10 +02:00

69 lines
2.2 KiB
C

/*
* Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/ocsp.h>
#include <openssl/http.h>
#ifndef OPENSSL_NO_OCSP
OSSL_HTTP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path,
const OCSP_REQUEST *req, int buf_size)
{
OSSL_HTTP_REQ_CTX *rctx = OSSL_HTTP_REQ_CTX_new(io, io, buf_size);
if (rctx == NULL)
return NULL;
/*-
* by default:
* no bio_update_fn (and consequently no arg)
* no ssl
* no proxy
* no timeout (blocking indefinitely)
* no expected content type
* max_resp_len = 100 KiB
*/
if (!OSSL_HTTP_REQ_CTX_set_request_line(rctx, 1 /* POST */,
NULL, NULL, path))
goto err;
/* by default, no extra headers */
if (!OSSL_HTTP_REQ_CTX_set_expected(rctx,
NULL /* content_type */, 1 /* asn1 */,
0 /* timeout */, 0 /* keep_alive */))
goto err;
if (req != NULL
&& !OSSL_HTTP_REQ_CTX_set1_req(rctx, "application/ocsp-request",
ASN1_ITEM_rptr(OCSP_REQUEST),
(const ASN1_VALUE *)req))
goto err;
return rctx;
err:
OSSL_HTTP_REQ_CTX_free(rctx);
return NULL;
}
OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req)
{
OCSP_RESPONSE *resp = NULL;
OSSL_HTTP_REQ_CTX *ctx;
BIO *mem;
ctx = OCSP_sendreq_new(b, path, req, 0 /* default buf_size */);
if (ctx == NULL)
return NULL;
mem = OSSL_HTTP_REQ_CTX_exchange(ctx);
/* ASN1_item_d2i_bio handles NULL bio gracefully */
resp = (OCSP_RESPONSE *)ASN1_item_d2i_bio(ASN1_ITEM_rptr(OCSP_RESPONSE),
mem, NULL);
OSSL_HTTP_REQ_CTX_free(ctx);
return resp;
}
#endif /* !defined(OPENSSL_NO_OCSP) */