ngtcp2: free used resources on disconnect

Fixes #4614
Closes #4615
This commit is contained in:
Daniel Stenberg 2019-11-18 11:27:30 +01:00
parent a72b6b9606
commit 82e4d029c5
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
2 changed files with 17 additions and 7 deletions

View File

@ -199,11 +199,12 @@ static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level); ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
int rv; int rv;
crypto_data = &qs->client_crypto_data[level]; crypto_data = &qs->crypto_data[level];
if(crypto_data->buf == NULL) { if(crypto_data->buf == NULL) {
crypto_data->buf = malloc(4096); crypto_data->buf = malloc(4096);
if(!crypto_data->buf)
return 0;
crypto_data->alloclen = 4096; crypto_data->alloclen = 4096;
/* TODO Explode if malloc failed */
} }
/* TODO Just pretend that handshake does not grow more than 4KiB for /* TODO Just pretend that handshake does not grow more than 4KiB for
@ -214,8 +215,8 @@ static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
crypto_data->len += len; crypto_data->len += len;
rv = ngtcp2_conn_submit_crypto_data( rv = ngtcp2_conn_submit_crypto_data(
qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len), qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
len); len);
if(rv) { if(rv) {
H3BUGF(fprintf(stderr, "write_client_handshake failed\n")); H3BUGF(fprintf(stderr, "write_client_handshake failed\n"));
} }
@ -316,7 +317,7 @@ static int cb_initial(ngtcp2_conn *quic, void *user_data)
struct quicsocket *qs = (struct quicsocket *)user_data; struct quicsocket *qs = (struct quicsocket *)user_data;
if(ngtcp2_crypto_read_write_crypto_data( if(ngtcp2_crypto_read_write_crypto_data(
quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0) quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
return NGTCP2_ERR_CALLBACK_FAILURE; return NGTCP2_ERR_CALLBACK_FAILURE;
return 0; return 0;
@ -696,8 +697,17 @@ static int ng_perform_getsock(const struct connectdata *conn,
static CURLcode ng_disconnect(struct connectdata *conn, static CURLcode ng_disconnect(struct connectdata *conn,
bool dead_connection) bool dead_connection)
{ {
(void)conn; int i;
struct quicsocket *qs = &conn->hequic[0];
(void)dead_connection; (void)dead_connection;
free(qs->rx_secret);
if(qs->ssl)
SSL_free(qs->ssl);
for(i = 0; i < 3; i++)
free(qs->crypto_data[i].buf);
nghttp3_conn_del(qs->h3conn);
ngtcp2_conn_del(qs->qconn);
SSL_CTX_free(qs->sslctx);
return CURLE_OK; return CURLE_OK;
} }

View File

@ -49,7 +49,7 @@ struct quicsocket {
uint8_t *rx_secret; /* malloced */ uint8_t *rx_secret; /* malloced */
uint8_t *tx_secret; /* points into the above buffer */ uint8_t *tx_secret; /* points into the above buffer */
size_t rx_secretlen; size_t rx_secretlen;
struct quic_handshake client_crypto_data[3]; struct quic_handshake crypto_data[3];
/* the last TLS alert description generated by the local endpoint */ /* the last TLS alert description generated by the local endpoint */
uint8_t tls_alert; uint8_t tls_alert;
struct sockaddr_storage local_addr; struct sockaddr_storage local_addr;