Hi All,

Ted Ugnast (of OpenBSD) wrote an interesting blog entry:

I'm quoting here for people who need the essential information:
"

On line 1059, we find a call to ssl3_release_read_buffer after we have
read the header, which will free the current buffer.

if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE
*/ { [...] if (!peek) { rr->length-=n; rr->off+=n; if (rr->length ==
0) { s->rstate=SSL_ST_READ_HEADER; rr->off=0; if (s->mode &
SSL_MODE_RELEASE_BUFFERS) ssl3_release_read_buffer(s); } }

There's one small problem. We're not actually done with it yet. It
still has some interesting data in it that we will want to read later.
Fortunately, this is only a small problem because the LIFO freelist
will give it right back to us! It has to chill on the freelist for few
microseconds, but then the next call to ssl3_read_nwill call setup and
start right back where we left off. Same buffer, same contents.

rb = &(s->s3->rbuf); if (rb->buf == NULL) if
(!ssl3_setup_read_buffer(s)) return -1; left = rb->left;

Unless, of course, there is no freelist and releasing the read buffer
actually, you know, releases it, which is what happens when you
compile with OPENSSL_NO_BUF_FREELIST. Now that first buffer is gone
forever, and it's a different buffer that we start reading from. But
this new, different buffer isn't very likely to have the same data as
the old buffer. OpenSSL gets very confused when it can't find the data
it expects and aborts the connection.

"

His patch was not against -current.

http://elandsys.com/~logan/openssl_fix.diff

Please find it here:

diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c
index b9e45c7..61b017f 100644
--- a/ssl/s3_pkt.c
+++ b/ssl/s3_pkt.c
@@ -1334,8 +1334,6 @@ start:
  {
  s->rstate=SSL_ST_READ_HEADER;
  rr->off=0;
- if (s->mode & SSL_MODE_RELEASE_BUFFERS)
- ssl3_release_read_buffer(s);
  }
  }
  return(n);


I tested by building OpenSSL from github.

I would be interested in improving the diff further, so feedback welcomed :-)


-- 
This message is strictly personal and the opinions expressed do not
represent those of my employers, either past or present.
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to