Move s->rstate to s->rlayer.rstate

Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
Matt Caswell 2015-02-03 10:48:28 +00:00
parent 7a7048aff0
commit 295c3f4111
8 changed files with 79 additions and 64 deletions

@ -450,7 +450,7 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
goto start; goto start;
/* get new packet if necessary */ /* get new packet if necessary */
if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) { if ((rr->length == 0) || (s->rlayer.rstate == SSL_ST_READ_BODY)) {
ret = dtls1_get_record(s); ret = dtls1_get_record(s);
if (ret <= 0) { if (ret <= 0) {
ret = dtls1_read_failed(s, ret); ret = dtls1_read_failed(s, ret);
@ -522,7 +522,7 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
rr->length -= n; rr->length -= n;
rr->off += n; rr->off += n;
if (rr->length == 0) { if (rr->length == 0) {
s->rstate = SSL_ST_READ_HEADER; s->rlayer.rstate = SSL_ST_READ_HEADER;
rr->off = 0; rr->off = 0;
} }
} }
@ -629,7 +629,7 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
*/ */
FIX ME FIX ME
#endif #endif
s->rstate = SSL_ST_READ_HEADER; s->rlayer.rstate = SSL_ST_READ_HEADER;
rr->length = 0; rr->length = 0;
goto start; goto start;
} }

@ -140,6 +140,8 @@ typedef struct record_layer_st {
* non-blocking reads) * non-blocking reads)
*/ */
int read_ahead; int read_ahead;
/* where we are when reading */
int rstate;
/* read IO goes into here */ /* read IO goes into here */
SSL3_BUFFER rbuf; SSL3_BUFFER rbuf;
/* write IO goes into here */ /* write IO goes into here */
@ -176,6 +178,7 @@ void RECORD_LAYER_release(RECORD_LAYER *rl);
int RECORD_LAYER_read_pending(RECORD_LAYER *rl); int RECORD_LAYER_read_pending(RECORD_LAYER *rl);
int RECORD_LAYER_write_pending(RECORD_LAYER *rl); int RECORD_LAYER_write_pending(RECORD_LAYER *rl);
int RECORD_LAYER_set_data(RECORD_LAYER *rl, const unsigned char *buf, int len); int RECORD_LAYER_set_data(RECORD_LAYER *rl, const unsigned char *buf, int len);
void RECORD_LAYER_dup(RECORD_LAYER *dst, RECORD_LAYER *src);
__owur int ssl3_pending(const SSL *s); __owur int ssl3_pending(const SSL *s);
__owur int ssl23_read_bytes(SSL *s, int n); __owur int ssl23_read_bytes(SSL *s, int n);
__owur int ssl23_write_bytes(SSL *s); __owur int ssl23_write_bytes(SSL *s);
@ -203,6 +206,8 @@ void dtls1_reset_seq_numbers(SSL *s, int rw);
#define RECORD_LAYER_get_wrec(rl) (&(rl)->wrec) #define RECORD_LAYER_get_wrec(rl) (&(rl)->wrec)
#define RECORD_LAYER_set_packet(rl, p) ((rl)->packet = (p)) #define RECORD_LAYER_set_packet(rl, p) ((rl)->packet = (p))
#define RECORD_LAYER_reset_packet_length(rl) ((rl)->packet_length = 0) #define RECORD_LAYER_reset_packet_length(rl) ((rl)->packet_length = 0)
#define RECORD_LAYER_get_rstate(rl) ((rl)->rstate)
#define RECORD_LAYER_set_rstate(rl, st) ((rl)->rstate = (st))
__owur int ssl3_read_n(SSL *s, int n, int max, int extend); __owur int ssl3_read_n(SSL *s, int n, int max, int extend);
__owur int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, __owur int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,

@ -163,6 +163,7 @@ void RECORD_LAYER_clear(RECORD_LAYER *rl)
* that right? * that right?
*/ */
rl->read_ahead = read_ahead; rl->read_ahead = read_ahead;
rl->rstate = SSL_ST_READ_HEADER;
rl->s = s; rl->s = s;
} }
@ -189,7 +190,7 @@ int RECORD_LAYER_set_data(RECORD_LAYER *rl, const unsigned char *buf, int len)
{ {
rl->packet_length = len; rl->packet_length = len;
if(len != 0) { if(len != 0) {
rl->s->rstate = SSL_ST_READ_HEADER; rl->rstate = SSL_ST_READ_HEADER;
if (!SSL3_BUFFER_is_initialised(&rl->rbuf)) if (!SSL3_BUFFER_is_initialised(&rl->rbuf))
if (!ssl3_setup_read_buffer(rl->s)) if (!ssl3_setup_read_buffer(rl->s))
return 0; return 0;
@ -201,15 +202,66 @@ int RECORD_LAYER_set_data(RECORD_LAYER *rl, const unsigned char *buf, int len)
return 1; return 1;
} }
void RECORD_LAYER_dup(RECORD_LAYER *dst, RECORD_LAYER *src)
{
/*
* Currently only called from SSL_dup...which only seems to expect the
* rstate to be duplicated and nothing else from the RECORD_LAYER???
*/
dst->rstate = src->rstate;
}
int ssl3_pending(const SSL *s) int ssl3_pending(const SSL *s)
{ {
if (s->rstate == SSL_ST_READ_BODY) if (s->rlayer.rstate == SSL_ST_READ_BODY)
return 0; return 0;
return (SSL3_RECORD_get_type(&s->rlayer.rrec) == SSL3_RT_APPLICATION_DATA) return (SSL3_RECORD_get_type(&s->rlayer.rrec) == SSL3_RT_APPLICATION_DATA)
? SSL3_RECORD_get_length(&s->rlayer.rrec) : 0; ? SSL3_RECORD_get_length(&s->rlayer.rrec) : 0;
} }
const char *SSL_rstate_string_long(const SSL *s)
{
const char *str;
switch (s->rlayer.rstate) {
case SSL_ST_READ_HEADER:
str = "read header";
break;
case SSL_ST_READ_BODY:
str = "read body";
break;
case SSL_ST_READ_DONE:
str = "read done";
break;
default:
str = "unknown";
break;
}
return (str);
}
const char *SSL_rstate_string(const SSL *s)
{
const char *str;
switch (s->rlayer.rstate) {
case SSL_ST_READ_HEADER:
str = "RH";
break;
case SSL_ST_READ_BODY:
str = "RB";
break;
case SSL_ST_READ_DONE:
str = "RD";
break;
default:
str = "unknown";
break;
}
return (str);
}
int ssl3_read_n(SSL *s, int n, int max, int extend) int ssl3_read_n(SSL *s, int n, int max, int extend)
{ {
/* /*
@ -965,7 +1017,7 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
rr = &s->rlayer.rrec; rr = &s->rlayer.rrec;
/* get new packet if necessary */ /* get new packet if necessary */
if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) { if ((rr->length == 0) || (s->rlayer.rstate == SSL_ST_READ_BODY)) {
ret = ssl3_get_record(s); ret = ssl3_get_record(s);
if (ret <= 0) if (ret <= 0)
return (ret); return (ret);
@ -1017,7 +1069,7 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
rr->length -= n; rr->length -= n;
rr->off += n; rr->off += n;
if (rr->length == 0) { if (rr->length == 0) {
s->rstate = SSL_ST_READ_HEADER; s->rlayer.rstate = SSL_ST_READ_HEADER;
rr->off = 0; rr->off = 0;
if (s->mode & SSL_MODE_RELEASE_BUFFERS if (s->mode & SSL_MODE_RELEASE_BUFFERS
&& SSL3_BUFFER_get_left(&s->rlayer.rbuf) == 0) && SSL3_BUFFER_get_left(&s->rlayer.rbuf) == 0)

@ -207,13 +207,13 @@ int ssl3_get_record(SSL *s)
again: again:
/* check if we have the header */ /* check if we have the header */
if ((s->rstate != SSL_ST_READ_BODY) || if ((RECORD_LAYER_get_rstate(&s->rlayer) != SSL_ST_READ_BODY) ||
(RECORD_LAYER_get_packet_length(&s->rlayer) < SSL3_RT_HEADER_LENGTH)) { (RECORD_LAYER_get_packet_length(&s->rlayer) < SSL3_RT_HEADER_LENGTH)) {
n = ssl3_read_n(s, SSL3_RT_HEADER_LENGTH, n = ssl3_read_n(s, SSL3_RT_HEADER_LENGTH,
SSL3_BUFFER_get_len(&s->rlayer.rbuf), 0); SSL3_BUFFER_get_len(&s->rlayer.rbuf), 0);
if (n <= 0) if (n <= 0)
return (n); /* error or non-blocking */ return (n); /* error or non-blocking */
s->rstate = SSL_ST_READ_BODY; RECORD_LAYER_set_rstate(&s->rlayer, SSL_ST_READ_BODY);
p = RECORD_LAYER_get_packet(&s->rlayer); p = RECORD_LAYER_get_packet(&s->rlayer);
if (s->msg_callback) if (s->msg_callback)
@ -255,10 +255,10 @@ int ssl3_get_record(SSL *s)
goto f_err; goto f_err;
} }
/* now s->rstate == SSL_ST_READ_BODY */ /* now s->rlayer.rstate == SSL_ST_READ_BODY */
} }
/* s->rstate == SSL_ST_READ_BODY, get and decode the data */ /* s->rlayer.rstate == SSL_ST_READ_BODY, get and decode the data */
if (rr->length > if (rr->length >
RECORD_LAYER_get_packet_length(&s->rlayer) - SSL3_RT_HEADER_LENGTH) { RECORD_LAYER_get_packet_length(&s->rlayer) - SSL3_RT_HEADER_LENGTH) {
@ -273,7 +273,8 @@ int ssl3_get_record(SSL *s)
*/ */
} }
s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */ /* set state for later operations */
RECORD_LAYER_set_rstate(&s->rlayer, SSL_ST_READ_HEADER);
/* /*
* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length, * At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
@ -1399,7 +1400,7 @@ int dtls1_get_record(SSL *s)
/* get something from the wire */ /* get something from the wire */
again: again:
/* check if we have the header */ /* check if we have the header */
if ((s->rstate != SSL_ST_READ_BODY) || if ((RECORD_LAYER_get_rstate(&s->rlayer) != SSL_ST_READ_BODY) ||
(RECORD_LAYER_get_packet_length(&s->rlayer) < DTLS1_RT_HEADER_LENGTH)) { (RECORD_LAYER_get_packet_length(&s->rlayer) < DTLS1_RT_HEADER_LENGTH)) {
n = ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH, n = ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH,
SSL3_BUFFER_get_len(&s->rlayer.rbuf), 0); SSL3_BUFFER_get_len(&s->rlayer.rbuf), 0);
@ -1413,7 +1414,7 @@ int dtls1_get_record(SSL *s)
goto again; goto again;
} }
s->rstate = SSL_ST_READ_BODY; RECORD_LAYER_set_rstate(&s->rlayer, SSL_ST_READ_BODY);
p = RECORD_LAYER_get_packet(&s->rlayer); p = RECORD_LAYER_get_packet(&s->rlayer);
@ -1459,10 +1460,10 @@ int dtls1_get_record(SSL *s)
goto again; goto again;
} }
/* now s->rstate == SSL_ST_READ_BODY */ /* now s->rlayer.rstate == SSL_ST_READ_BODY */
} }
/* s->rstate == SSL_ST_READ_BODY, get and decode the data */ /* s->rlayer.rstate == SSL_ST_READ_BODY, get and decode the data */
if (rr->length > if (rr->length >
RECORD_LAYER_get_packet_length(&s->rlayer) - DTLS1_RT_HEADER_LENGTH) { RECORD_LAYER_get_packet_length(&s->rlayer) - DTLS1_RT_HEADER_LENGTH) {
@ -1481,7 +1482,8 @@ int dtls1_get_record(SSL *s)
* DTLS1_RT_HEADER_LENGTH + rr->length * DTLS1_RT_HEADER_LENGTH + rr->length
*/ */
} }
s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */ /* set state for later operations */
RECORD_LAYER_set_rstate(&s->rlayer, SSL_ST_READ_HEADER);
/* match epochs. NULL means the packet is dropped on the floor */ /* match epochs. NULL means the packet is dropped on the floor */
bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch); bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch);

@ -999,8 +999,8 @@ extern "C" {
# define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) # define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT)
/* /*
* The following 2 states are kept in ssl->rstate when reads fail, you should * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you
* not need these * should not need these
*/ */
# define SSL_ST_READ_HEADER 0xF0 # define SSL_ST_READ_HEADER 0xF0
# define SSL_ST_READ_BODY 0xF1 # define SSL_ST_READ_BODY 0xF1

@ -215,7 +215,6 @@ int SSL_clear(SSL *s)
s->version = s->method->version; s->version = s->method->version;
s->client_version = s->version; s->client_version = s->version;
s->rwstate = SSL_NOTHING; s->rwstate = SSL_NOTHING;
s->rstate = SSL_ST_READ_HEADER;
if (s->init_buf != NULL) { if (s->init_buf != NULL) {
BUF_MEM_free(s->init_buf); BUF_MEM_free(s->init_buf);
@ -2830,7 +2829,7 @@ SSL *SSL_dup(SSL *s)
ret->shutdown = s->shutdown; ret->shutdown = s->shutdown;
ret->state = s->state; /* SSL_dup does not really work at any state, ret->state = s->state; /* SSL_dup does not really work at any state,
* though */ * though */
ret->rstate = s->rstate; RECORD_LAYER_dup(&ret->rlayer, &s->rlayer);
ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_num = 0; /* would have to copy ret->init_buf,
* ret->init_msg, ret->init_num, * ret->init_msg, ret->init_num,
* ret->init_off */ * ret->init_off */

@ -1022,8 +1022,6 @@ struct ssl_st {
int shutdown; int shutdown;
/* where we are */ /* where we are */
int state; int state;
/* where we are when reading */
int rstate;
BUF_MEM *init_buf; /* buffer used during init */ BUF_MEM *init_buf; /* buffer used during init */
void *init_msg; /* pointer to handshake message body, set by void *init_msg; /* pointer to handshake message body, set by
* ssl3_get_message() */ * ssl3_get_message() */

@ -342,26 +342,6 @@ const char *SSL_state_string_long(const SSL *s)
return (str); return (str);
} }
const char *SSL_rstate_string_long(const SSL *s)
{
const char *str;
switch (s->rstate) {
case SSL_ST_READ_HEADER:
str = "read header";
break;
case SSL_ST_READ_BODY:
str = "read body";
break;
case SSL_ST_READ_DONE:
str = "read done";
break;
default:
str = "unknown";
break;
}
return (str);
}
const char *SSL_state_string(const SSL *s) const char *SSL_state_string(const SSL *s)
{ {
@ -817,24 +797,3 @@ const char *SSL_alert_desc_string_long(int value)
} }
return (str); return (str);
} }
const char *SSL_rstate_string(const SSL *s)
{
const char *str;
switch (s->rstate) {
case SSL_ST_READ_HEADER:
str = "RH";
break;
case SSL_ST_READ_BODY:
str = "RB";
break;
case SSL_ST_READ_DONE:
str = "RD";
break;
default:
str = "unknown";
break;
}
return (str);
}