diff options
Diffstat (limited to 'ssl/record')
-rw-r--r-- | ssl/record/d1_pkt.c | 8 | ||||
-rw-r--r-- | ssl/record/rec_layer.h | 8 | ||||
-rw-r--r-- | ssl/record/s3_pkt.c | 26 |
3 files changed, 25 insertions, 17 deletions
diff --git a/ssl/record/d1_pkt.c b/ssl/record/d1_pkt.c index 5df1d3043a..3b69d8eb41 100644 --- a/ssl/record/d1_pkt.c +++ b/ssl/record/d1_pkt.c @@ -1212,10 +1212,10 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf, * memorize arguments so that ssl3_write_pending can detect bad write * retries later */ - s->s3->wpend_tot = len; - s->s3->wpend_buf = buf; - s->s3->wpend_type = type; - s->s3->wpend_ret = len; + s->rlayer.wpend_tot = len; + s->rlayer.wpend_buf = buf; + s->rlayer.wpend_type = type; + s->rlayer.wpend_ret = len; /* we now just need to write the buffer */ return ssl3_write_pending(s, type, buf, len); diff --git a/ssl/record/rec_layer.h b/ssl/record/rec_layer.h index 0123c5682c..c81c6ce5e0 100644 --- a/ssl/record/rec_layer.h +++ b/ssl/record/rec_layer.h @@ -166,6 +166,14 @@ typedef struct record_layer_st { unsigned int alert_fragment_len; unsigned char handshake_fragment[4]; unsigned int handshake_fragment_len; + + /* partial write - check the numbers match */ + /* number bytes written */ + int wpend_tot; + int wpend_type; + /* number of bytes submitted */ + int wpend_ret; + const unsigned char *wpend_buf; } RECORD_LAYER; diff --git a/ssl/record/s3_pkt.c b/ssl/record/s3_pkt.c index fea7dbbb03..88209299a0 100644 --- a/ssl/record/s3_pkt.c +++ b/ssl/record/s3_pkt.c @@ -467,7 +467,7 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len) * will happen with non blocking IO */ if (wb->left != 0) { - i = ssl3_write_pending(s, type, &buf[tot], s->s3->wpend_tot); + i = ssl3_write_pending(s, type, &buf[tot], s->rlayer.wpend_tot); if (i <= 0) { /* XXX should we ssl3_release_write_buffer if i<0? */ s->rlayer.wnum = tot; @@ -579,10 +579,10 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len) wb->offset = 0; wb->left = packlen; - s->s3->wpend_tot = nw; - s->s3->wpend_buf = &buf[tot]; - s->s3->wpend_type = type; - s->s3->wpend_ret = nw; + s->rlayer.wpend_tot = nw; + s->rlayer.wpend_buf = &buf[tot]; + s->rlayer.wpend_type = type; + s->rlayer.wpend_ret = nw; i = ssl3_write_pending(s, type, &buf[tot], nw); if (i <= 0) { @@ -863,10 +863,10 @@ int do_ssl3_write(SSL *s, int type, const unsigned char *buf, * memorize arguments so that ssl3_write_pending can detect bad write * retries later */ - s->s3->wpend_tot = len; - s->s3->wpend_buf = buf; - s->s3->wpend_type = type; - s->s3->wpend_ret = len; + s->rlayer.wpend_tot = len; + s->rlayer.wpend_buf = buf; + s->rlayer.wpend_type = type; + s->rlayer.wpend_ret = len; /* we now just need to write the buffer */ return ssl3_write_pending(s, type, buf, len); @@ -882,10 +882,10 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, SSL3_BUFFER *wb = &s->rlayer.wbuf; /* XXXX */ - if ((s->s3->wpend_tot > (int)len) - || ((s->s3->wpend_buf != buf) && + if ((s->rlayer.wpend_tot > (int)len) + || ((s->rlayer.wpend_buf != buf) && !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER)) - || (s->s3->wpend_type != type)) { + || (s->rlayer.wpend_type != type)) { SSLerr(SSL_F_SSL3_WRITE_PENDING, SSL_R_BAD_WRITE_RETRY); return (-1); } @@ -905,7 +905,7 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, wb->left = 0; wb->offset += i; s->rwstate = SSL_NOTHING; - return (s->s3->wpend_ret); + return (s->rlayer.wpend_ret); } else if (i <= 0) { if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER) { /* |