Fix read_ahead
authorMatt Caswell <matt@openssl.org>
Wed, 2 Nov 2016 10:34:12 +0000 (10:34 +0000)
committerMatt Caswell <matt@openssl.org>
Wed, 2 Nov 2016 16:47:14 +0000 (16:47 +0000)
commita7faa6da317887e14e8e28254a83555983ed6ca7
tree2c28e7517bd678bd0d0d3c51ecbada6d3d86c642
parent8aefa08cfbc7db7cc10765ee9684090e37983f45
Fix read_ahead

The function ssl3_read_n() takes a parameter |clearold| which, if set,
causes any old data in the read buffer to be forgotten, and any unread data
to be moved to the start of the buffer. This is supposed to happen when we
first read the record header.

However, the data move was only taking place if there was not already
sufficient data in the buffer to satisfy the request. If read_ahead is set
then the record header could be in the buffer already from when we read the
preceding record. So with read_ahead we can get into a situation where even
though |clearold| is set, the data does not get moved to the start of the
read buffer when we read the record header. This means there is insufficient
room in the read buffer to consume the rest of the record body, resulting in
an internal error.

This commit moves the |clearold| processing to earlier in ssl3_read_n()
to ensure that it always takes place.

Reviewed-by: Richard Levitte <levitte@openssl.org>
ssl/record/rec_layer_s3.c