提交 24a1e2f2 编写于 作者: M Matt Caswell

Move buffered_app_data from s->d1 to s->rlayer.d

Reviewed-by: NRichard Levitte <levitte@openssl.org>
上级 c661ac16
...@@ -138,7 +138,6 @@ int dtls1_new(SSL *s) ...@@ -138,7 +138,6 @@ int dtls1_new(SSL *s)
d1->buffered_messages = pqueue_new(); d1->buffered_messages = pqueue_new();
d1->sent_messages = pqueue_new(); d1->sent_messages = pqueue_new();
d1->buffered_app_data.q = pqueue_new();
if (s->server) { if (s->server) {
d1->cookie_len = sizeof(s->d1->cookie); d1->cookie_len = sizeof(s->d1->cookie);
...@@ -147,14 +146,11 @@ int dtls1_new(SSL *s) ...@@ -147,14 +146,11 @@ int dtls1_new(SSL *s)
d1->link_mtu = 0; d1->link_mtu = 0;
d1->mtu = 0; d1->mtu = 0;
if (!d1->buffered_messages || !d1->sent_messages if (!d1->buffered_messages || !d1->sent_messages) {
|| !d1->buffered_app_data.q) {
if (d1->buffered_messages) if (d1->buffered_messages)
pqueue_free(d1->buffered_messages); pqueue_free(d1->buffered_messages);
if (d1->sent_messages) if (d1->sent_messages)
pqueue_free(d1->sent_messages); pqueue_free(d1->sent_messages);
if (d1->buffered_app_data.q)
pqueue_free(d1->buffered_app_data.q);
OPENSSL_free(d1); OPENSSL_free(d1);
ssl3_free(s); ssl3_free(s);
return (0); return (0);
...@@ -169,7 +165,6 @@ static void dtls1_clear_queues(SSL *s) ...@@ -169,7 +165,6 @@ static void dtls1_clear_queues(SSL *s)
{ {
pitem *item = NULL; pitem *item = NULL;
hm_fragment *frag = NULL; hm_fragment *frag = NULL;
DTLS1_RECORD_DATA *rdata;
while ((item = pqueue_pop(s->d1->buffered_messages)) != NULL) { while ((item = pqueue_pop(s->d1->buffered_messages)) != NULL) {
frag = (hm_fragment *)item->data; frag = (hm_fragment *)item->data;
...@@ -182,15 +177,6 @@ static void dtls1_clear_queues(SSL *s) ...@@ -182,15 +177,6 @@ static void dtls1_clear_queues(SSL *s)
dtls1_hm_fragment_free(frag); dtls1_hm_fragment_free(frag);
pitem_free(item); pitem_free(item);
} }
while ((item = pqueue_pop(s->d1->buffered_app_data.q)) != NULL) {
rdata = (DTLS1_RECORD_DATA *)item->data;
if (rdata->rbuf.buf) {
OPENSSL_free(rdata->rbuf.buf);
}
OPENSSL_free(item->data);
pitem_free(item);
}
} }
void dtls1_free(SSL *s) void dtls1_free(SSL *s)
...@@ -203,7 +189,6 @@ void dtls1_free(SSL *s) ...@@ -203,7 +189,6 @@ void dtls1_free(SSL *s)
pqueue_free(s->d1->buffered_messages); pqueue_free(s->d1->buffered_messages);
pqueue_free(s->d1->sent_messages); pqueue_free(s->d1->sent_messages);
pqueue_free(s->d1->buffered_app_data.q);
OPENSSL_free(s->d1); OPENSSL_free(s->d1);
s->d1 = NULL; s->d1 = NULL;
...@@ -213,7 +198,6 @@ void dtls1_clear(SSL *s) ...@@ -213,7 +198,6 @@ void dtls1_clear(SSL *s)
{ {
pqueue buffered_messages; pqueue buffered_messages;
pqueue sent_messages; pqueue sent_messages;
pqueue buffered_app_data;
unsigned int mtu; unsigned int mtu;
unsigned int link_mtu; unsigned int link_mtu;
...@@ -222,7 +206,6 @@ void dtls1_clear(SSL *s) ...@@ -222,7 +206,6 @@ void dtls1_clear(SSL *s)
if (s->d1) { if (s->d1) {
buffered_messages = s->d1->buffered_messages; buffered_messages = s->d1->buffered_messages;
sent_messages = s->d1->sent_messages; sent_messages = s->d1->sent_messages;
buffered_app_data = s->d1->buffered_app_data.q;
mtu = s->d1->mtu; mtu = s->d1->mtu;
link_mtu = s->d1->link_mtu; link_mtu = s->d1->link_mtu;
...@@ -241,7 +224,6 @@ void dtls1_clear(SSL *s) ...@@ -241,7 +224,6 @@ void dtls1_clear(SSL *s)
s->d1->buffered_messages = buffered_messages; s->d1->buffered_messages = buffered_messages;
s->d1->sent_messages = sent_messages; s->d1->sent_messages = sent_messages;
s->d1->buffered_app_data.q = buffered_app_data;
} }
ssl3_clear(s); ssl3_clear(s);
......
...@@ -136,12 +136,16 @@ int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl) ...@@ -136,12 +136,16 @@ int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl)
d->unprocessed_rcds.q = pqueue_new(); d->unprocessed_rcds.q = pqueue_new();
d->processed_rcds.q = pqueue_new(); d->processed_rcds.q = pqueue_new();
d->buffered_app_data.q = pqueue_new();
if (!d->unprocessed_rcds.q || !d->processed_rcds.q) { if (!d->unprocessed_rcds.q || !d->processed_rcds.q
|| !d->buffered_app_data.q) {
if (d->unprocessed_rcds.q) if (d->unprocessed_rcds.q)
pqueue_free(d->unprocessed_rcds.q); pqueue_free(d->unprocessed_rcds.q);
if (d->processed_rcds.q) if (d->processed_rcds.q)
pqueue_free(d->processed_rcds.q); pqueue_free(d->processed_rcds.q);
if (d->buffered_app_data.q)
pqueue_free(d->buffered_app_data.q);
OPENSSL_free(d); OPENSSL_free(d);
rl->d = NULL; rl->d = NULL;
return (0); return (0);
...@@ -155,6 +159,7 @@ void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl) ...@@ -155,6 +159,7 @@ void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl)
DTLS_RECORD_LAYER_clear(rl); DTLS_RECORD_LAYER_clear(rl);
pqueue_free(rl->d->unprocessed_rcds.q); pqueue_free(rl->d->unprocessed_rcds.q);
pqueue_free(rl->d->processed_rcds.q); pqueue_free(rl->d->processed_rcds.q);
pqueue_free(rl->d->buffered_app_data.q);
OPENSSL_free(rl->d); OPENSSL_free(rl->d);
rl->d = NULL; rl->d = NULL;
} }
...@@ -166,6 +171,7 @@ void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl) ...@@ -166,6 +171,7 @@ void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl)
DTLS1_RECORD_DATA *rdata; DTLS1_RECORD_DATA *rdata;
pqueue unprocessed_rcds; pqueue unprocessed_rcds;
pqueue processed_rcds; pqueue processed_rcds;
pqueue buffered_app_data;
d = rl->d; d = rl->d;
...@@ -187,11 +193,22 @@ void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl) ...@@ -187,11 +193,22 @@ void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl)
pitem_free(item); pitem_free(item);
} }
while ((item = pqueue_pop(d->buffered_app_data.q)) != NULL) {
rdata = (DTLS1_RECORD_DATA *)item->data;
if (rdata->rbuf.buf) {
OPENSSL_free(rdata->rbuf.buf);
}
OPENSSL_free(item->data);
pitem_free(item);
}
unprocessed_rcds = d->unprocessed_rcds.q; unprocessed_rcds = d->unprocessed_rcds.q;
processed_rcds = d->processed_rcds.q; processed_rcds = d->processed_rcds.q;
buffered_app_data = d->buffered_app_data.q;
memset(d, 0, sizeof *d); memset(d, 0, sizeof *d);
d->unprocessed_rcds.q = unprocessed_rcds; d->unprocessed_rcds.q = unprocessed_rcds;
d->processed_rcds.q = processed_rcds; d->processed_rcds.q = processed_rcds;
d->buffered_app_data.q = buffered_app_data;
} }
static int have_handshake_fragment(SSL *s, int type, unsigned char *buf, static int have_handshake_fragment(SSL *s, int type, unsigned char *buf,
...@@ -441,7 +458,7 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) ...@@ -441,7 +458,7 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
*/ */
if (s->state == SSL_ST_OK && rr->length == 0) { if (s->state == SSL_ST_OK && rr->length == 0) {
pitem *item; pitem *item;
item = pqueue_pop(s->d1->buffered_app_data.q); item = pqueue_pop(s->rlayer.d->buffered_app_data.q);
if (item) { if (item) {
#ifndef OPENSSL_NO_SCTP #ifndef OPENSSL_NO_SCTP
/* Restore bio_dgram_sctp_rcvinfo struct */ /* Restore bio_dgram_sctp_rcvinfo struct */
...@@ -491,8 +508,8 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) ...@@ -491,8 +508,8 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
* the packets were reordered on their way, so buffer the application * the packets were reordered on their way, so buffer the application
* data for later processing rather than dropping the connection. * data for later processing rather than dropping the connection.
*/ */
if (dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num) < if (dtls1_buffer_record(s, &(s->rlayer.d->buffered_app_data),
0) { rr->seq_num) < 0) {
SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR); SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
return -1; return -1;
} }
......
...@@ -151,7 +151,12 @@ typedef struct dtls_record_layer_st { ...@@ -151,7 +151,12 @@ typedef struct dtls_record_layer_st {
/* Received handshake records (processed and unprocessed) */ /* Received handshake records (processed and unprocessed) */
record_pqueue unprocessed_rcds; record_pqueue unprocessed_rcds;
record_pqueue processed_rcds; record_pqueue processed_rcds;
/*
* Buffered application records. Only for records between CCS and
* Finished to prevent either protocol violation or unnecessary message
* loss.
*/
record_pqueue buffered_app_data;
/* /*
* storage for Alert/Handshake protocol data received but not yet * storage for Alert/Handshake protocol data received but not yet
* processed by ssl3_read_bytes: * processed by ssl3_read_bytes:
......
...@@ -1415,12 +1415,7 @@ typedef struct dtls1_state_st { ...@@ -1415,12 +1415,7 @@ typedef struct dtls1_state_st {
pqueue buffered_messages; pqueue buffered_messages;
/* Buffered (sent) handshake records */ /* Buffered (sent) handshake records */
pqueue sent_messages; pqueue sent_messages;
/*
* Buffered application records. Only for records between CCS and
* Finished to prevent either protocol violation or unnecessary message
* loss.
*/
record_pqueue buffered_app_data;
/* Is set when listening for new connections with dtls1_listen() */ /* Is set when listening for new connections with dtls1_listen() */
unsigned int listen; unsigned int listen;
unsigned int link_mtu; /* max on-the-wire DTLS packet size */ unsigned int link_mtu; /* max on-the-wire DTLS packet size */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册