X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=ssl%2Fs2_pkt.c;h=56662f29facb508a10b908c2ffb87808fcd0485a;hp=89fe9dabb17f3490cf7dd5d5730ea8335b86762e;hb=aa82db4fb49e8e3da38e39861837117ce12256bf;hpb=6b691a5c85ddc4e407e32781841fee5c029506cd diff --git a/ssl/s2_pkt.c b/ssl/s2_pkt.c index 89fe9dabb1..56662f29fa 100644 --- a/ssl/s2_pkt.c +++ b/ssl/s2_pkt.c @@ -56,30 +56,16 @@ * [including the GNU Public Licence.] */ +#include "ssl_locl.h" +#ifndef NO_SSL2 #include #include #define USE_SOCKETS -#include "ssl_locl.h" - -/* SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_PEER_ERROR_NO_CIPHER); - * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_PEER_ERROR_NO_CERTIFICATE); - * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_PEER_ERROR_CERTIFICATE); - * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE); - * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_UNKNOWN_REMOTE_ERROR_TYPE); - */ -#ifndef NOPROTO static int read_n(SSL *s,unsigned int n,unsigned int max,unsigned int extend); -static int do_ssl_write(SSL *s, const char *buf, unsigned int len); -static int write_pending(SSL *s, const char *buf, unsigned int len); +static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len); +static int write_pending(SSL *s, const unsigned char *buf, unsigned int len); static int ssl_mt_error(int n); -#else -static int read_n(); -static int do_ssl_write(); -static int write_pending(); -static int ssl_mt_error(); -#endif - int ssl2_peek(SSL *s, char *buf, int len) { int ret; @@ -96,7 +82,7 @@ int ssl2_peek(SSL *s, char *buf, int len) /* SSL_read - * This routine will return 0 to len bytes, decrypted etc if required. */ -int ssl2_read(SSL *s, char *buf, int len) +int ssl2_read(SSL *s, void *buf, int len) { int n; unsigned char mac[MAX_MAC_SIZE]; @@ -104,6 +90,7 @@ int ssl2_read(SSL *s, char *buf, int len) int i; unsigned int mac_size=0; +ssl2_read_again: if (SSL_in_init(s) && !s->in_handshake) { n=s->handshake_func(s); @@ -231,6 +218,25 @@ int ssl2_read(SSL *s, char *buf, int len) INC32(s->s2->read_sequence); /* expect next number */ /* s->s2->ract_data is now available for processing */ +#if 1 + /* How should we react when a packet containing 0 + * bytes is received? (Note that SSLeay/OpenSSL itself + * never sends such packets; see ssl2_write.) + * Returning 0 would be interpreted by the caller as + * indicating EOF, so it's not a good idea. + * Instead, we just continue reading. Note that using + * select() for blocking sockets *never* guarantees + * that the next SSL_read will not block -- the available + * data may contain incomplete packets, and except for SSL 2 + * renegotiation can confuse things even more. */ + + goto ssl2_read_again; /* This should really be + * "return ssl2_read(s,buf,len)", + * but that would allow for + * denial-of-service attacks if a + * C compiler is used that does not + * recognize end-recursion. */ +#else /* If a 0 byte packet was sent, return 0, otherwise * we play havoc with people using select with * blocking sockets. Let them handle a packet at a time, @@ -238,6 +244,7 @@ int ssl2_read(SSL *s, char *buf, int len) if (s->s2->ract_data_length == 0) return(0); return(ssl2_read(s,buf,len)); +#endif } else { @@ -345,8 +352,9 @@ static int read_n(SSL *s, unsigned int n, unsigned int max, return(n); } -int ssl2_write(SSL *s, const char *buf, int len) +int ssl2_write(SSL *s, const void *_buf, int len) { + const unsigned char *buf=_buf; unsigned int n,tot; int i; @@ -384,14 +392,18 @@ int ssl2_write(SSL *s, const char *buf, int len) s->s2->wnum=tot; return(i); } - if (i == (int)n) return(tot+i); - + if ((i == (int)n) || + (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) + { + return(tot+i); + } + n-=i; tot+=i; } } -static int write_pending(SSL *s, const char *buf, unsigned int len) +static int write_pending(SSL *s, const unsigned char *buf, unsigned int len) { int i; @@ -399,7 +411,9 @@ static int write_pending(SSL *s, const char *buf, unsigned int len) /* check that they have given us the same buffer to * write */ - if ((s->s2->wpend_tot > (int)len) || (s->s2->wpend_buf != buf)) + if ((s->s2->wpend_tot > (int)len) || + ((s->s2->wpend_buf != buf) && + !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))) { SSLerr(SSL_F_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY); return(-1); @@ -436,7 +450,7 @@ static int write_pending(SSL *s, const char *buf, unsigned int len) } } -static int do_ssl_write(SSL *s, const char *buf, unsigned int len) +static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len) { unsigned int j,k,olen,p,mac_size,bs; register unsigned char *pp; @@ -591,8 +605,7 @@ int ssl2_do_write(SSL *s) { int ret; - ret=ssl2_write(s,(char *)&(s->init_buf->data[s->init_off]), - s->init_num); + ret=ssl2_write(s,&s->init_buf->data[s->init_off],s->init_num); if (ret == s->init_num) return(1); if (ret < 0) @@ -626,3 +639,10 @@ static int ssl_mt_error(int n) } return(ret); } +#else /* !NO_SSL2 */ + +# if PEDANTIC +static void *dummy=&dummy; +# endif + +#endif