Retry sending record split fragment when SSL write fails
When the write size was exactly SSL3_RT_MAX_PLAIN_LENGTH+1 and record
splitting is needed, an extra byte would be added to the max size of the
message to be written. This would cause the requested size to not exceed
the max. If the SSL_WANT_WRITE error were returned, the next packet
would not get the extra byte added to the max packet size since
record_split_done is set. Since a different set of arguments
(SSL3_RT_MAX_PLAIN_LENGTH+1 vs SSL3_RT_MAX_PLAIN_LENGTH) would be passed
to do_ssl3_write, it would get an "SSL3_WRITE_PENDING:bad write retry"
error.
To avoid a failure in the opposite direction, the max variable increment
is removed as well. This can happen when SSL_MODE_ENABLE_PARTIAL_WRITE
is not enabled, the call to ssl3_write_bytes contains, e.g., buffer of
2*SSL3_RT_MAX_PLAIN_LENGTH where the first call into do_ssl3_write
succeeds writing the first SSL3_RT_MAX_PLAIN_LENGTH bytes, but the
writing the second SSL3_RT_MAX_PLAIN_LENGTH bytes fails. This means the
first time the the second section of SSL3_RT_MAX_PLAIN_LENGTH bytes has
called do_ssl3_write with "max" bytes, but next call to ssl3_write_bytes
in turn calls into do_ssl3_write with "max+1" bytes.
(cherry picked from commit 455e02af15d07aa8f8b22b5f6558c23f041c6b2a)
Bug: 16482963
Change-Id: I28a515a970d535a7fbba9c0ba325c9aed633d1cc
4 files changed