summaryrefslogtreecommitdiff
path: root/src/lib/libssl/s3_pkt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/s3_pkt.c')
-rw-r--r--src/lib/libssl/s3_pkt.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c
index 1414079853..9ab76604a6 100644
--- a/src/lib/libssl/s3_pkt.c
+++ b/src/lib/libssl/s3_pkt.c
@@ -704,7 +704,7 @@ static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
704 * Application data protocol 704 * Application data protocol
705 * none of our business 705 * none of our business
706 */ 706 */
707int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len) 707int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
708 { 708 {
709 int al,i,j,ret; 709 int al,i,j,ret;
710 unsigned int n; 710 unsigned int n;
@@ -715,7 +715,8 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len)
715 if (!ssl3_setup_buffers(s)) 715 if (!ssl3_setup_buffers(s))
716 return(-1); 716 return(-1);
717 717
718 if ((type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) 718 if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) ||
719 (peek && (type != SSL3_RT_APPLICATION_DATA)))
719 { 720 {
720 SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_INTERNAL_ERROR); 721 SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_INTERNAL_ERROR);
721 return -1; 722 return -1;
@@ -728,6 +729,7 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len)
728 unsigned char *dst = buf; 729 unsigned char *dst = buf;
729 unsigned int k; 730 unsigned int k;
730 731
732 /* peek == 0 */
731 n = 0; 733 n = 0;
732 while ((len > 0) && (s->s3->handshake_fragment_len > 0)) 734 while ((len > 0) && (s->s3->handshake_fragment_len > 0))
733 { 735 {
@@ -763,7 +765,7 @@ start:
763 * s->s3->rrec.length, - number of bytes. */ 765 * s->s3->rrec.length, - number of bytes. */
764 rr = &(s->s3->rrec); 766 rr = &(s->s3->rrec);
765 767
766 /* get new packet */ 768 /* get new packet if necessary */
767 if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) 769 if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
768 { 770 {
769 ret=ssl3_get_record(s); 771 ret=ssl3_get_record(s);
@@ -781,7 +783,8 @@ start:
781 goto err; 783 goto err;
782 } 784 }
783 785
784 /* If the other end has shutdown, throw anything we read away */ 786 /* If the other end has shut down, throw anything we read away
787 * (even in 'peek' mode) */
785 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 788 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
786 { 789 {
787 rr->length=0; 790 rr->length=0;
@@ -810,12 +813,15 @@ start:
810 n = (unsigned int)len; 813 n = (unsigned int)len;
811 814
812 memcpy(buf,&(rr->data[rr->off]),n); 815 memcpy(buf,&(rr->data[rr->off]),n);
813 rr->length-=n; 816 if (!peek)
814 rr->off+=n;
815 if (rr->length == 0)
816 { 817 {
817 s->rstate=SSL_ST_READ_HEADER; 818 rr->length-=n;
818 rr->off=0; 819 rr->off+=n;
820 if (rr->length == 0)
821 {
822 s->rstate=SSL_ST_READ_HEADER;
823 rr->off=0;
824 }
819 } 825 }
820 return(n); 826 return(n);
821 } 827 }