Skip to content

Commit

Permalink
Cleanse data in send and receive ring buffers on release
Browse files Browse the repository at this point in the history
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from #21311)
  • Loading branch information
t8m authored and paulidale committed Jul 2, 2023
1 parent 6ba2edb commit 292c9df
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
14 changes: 9 additions & 5 deletions include/internal/ring_buf.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,12 @@ static ossl_inline int ring_buf_init(struct ring_buf *r)
return 1;
}

static ossl_inline void ring_buf_destroy(struct ring_buf *r)
static ossl_inline void ring_buf_destroy(struct ring_buf *r, int cleanse)
{
OPENSSL_free(r->start);
if (cleanse)
OPENSSL_clear_free(r->start, r->alloc);
else
OPENSSL_free(r->start);
r->start = NULL;
r->alloc = 0;
}
Expand Down Expand Up @@ -213,7 +216,8 @@ static ossl_inline void ring_buf_cpop_range(struct ring_buf *r,
r->head_offset = r->ctail_offset;
}

static ossl_inline int ring_buf_resize(struct ring_buf *r, size_t num_bytes)
static ossl_inline int ring_buf_resize(struct ring_buf *r, size_t num_bytes,
int cleanse)
{
struct ring_buf rnew = {0};
const unsigned char *src = NULL;
Expand Down Expand Up @@ -251,9 +255,9 @@ static ossl_inline int ring_buf_resize(struct ring_buf *r, size_t num_bytes)
}

assert(rnew.head_offset == r->head_offset);
rnew.ctail_offset = r->ctail_offset;
rnew.ctail_offset = r->ctail_offset;

OPENSSL_free(r->start);
ring_buf_destroy(r, cleanse);
memcpy(r, &rnew, sizeof(*r));
return 1;
}
Expand Down
9 changes: 6 additions & 3 deletions ssl/quic/quic_rstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ QUIC_RSTREAM *ossl_quic_rstream_new(QUIC_RXFC *rxfc,
return NULL;

ring_buf_init(&ret->rbuf);
if (!ring_buf_resize(&ret->rbuf, rbuf_size)) {
if (!ring_buf_resize(&ret->rbuf, rbuf_size, 0)) {
OPENSSL_free(ret);
return NULL;
}
Expand All @@ -43,11 +43,14 @@ QUIC_RSTREAM *ossl_quic_rstream_new(QUIC_RXFC *rxfc,

void ossl_quic_rstream_free(QUIC_RSTREAM *qrs)
{
int cleanse;

if (qrs == NULL)
return;

cleanse = qrs->fl.cleanse;
ossl_sframe_list_destroy(&qrs->fl);
ring_buf_destroy(&qrs->rbuf);
ring_buf_destroy(&qrs->rbuf, cleanse);
OPENSSL_free(qrs);
}

Expand Down Expand Up @@ -281,7 +284,7 @@ int ossl_quic_rstream_resize_rbuf(QUIC_RSTREAM *qrs, size_t rbuf_size)
if (ossl_sframe_list_is_head_locked(&qrs->fl))
return 0;

if (!ring_buf_resize(&qrs->rbuf, rbuf_size))
if (!ring_buf_resize(&qrs->rbuf, rbuf_size, qrs->fl.cleanse))
return 0;

return 1;
Expand Down
8 changes: 4 additions & 4 deletions ssl/quic/quic_sstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ QUIC_SSTREAM *ossl_quic_sstream_new(size_t init_buf_size)
return NULL;

ring_buf_init(&qss->ring_buf);
if (!ring_buf_resize(&qss->ring_buf, init_buf_size)) {
ring_buf_destroy(&qss->ring_buf);
if (!ring_buf_resize(&qss->ring_buf, init_buf_size, 0)) {
ring_buf_destroy(&qss->ring_buf, 0);
OPENSSL_free(qss);
return NULL;
}
Expand All @@ -84,7 +84,7 @@ void ossl_quic_sstream_free(QUIC_SSTREAM *qss)

ossl_uint_set_destroy(&qss->new_set);
ossl_uint_set_destroy(&qss->acked_set);
ring_buf_destroy(&qss->ring_buf);
ring_buf_destroy(&qss->ring_buf, qss->cleanse);
OPENSSL_free(qss);
}

Expand Down Expand Up @@ -356,7 +356,7 @@ static void qss_cull(QUIC_SSTREAM *qss)

int ossl_quic_sstream_set_buffer_size(QUIC_SSTREAM *qss, size_t num_bytes)
{
return ring_buf_resize(&qss->ring_buf, num_bytes);
return ring_buf_resize(&qss->ring_buf, num_bytes, qss->cleanse);
}

size_t ossl_quic_sstream_get_buffer_size(QUIC_SSTREAM *qss)
Expand Down

0 comments on commit 292c9df

Please sign in to comment.