Make sure to send all TLS data before continuing
This commit is contained in:
@@ -100,6 +100,7 @@ struct osd_client_t
|
|||||||
bool ssl_handshake_done = false;
|
bool ssl_handshake_done = false;
|
||||||
msgr_tls_record_hdr_t ssl_read_record;
|
msgr_tls_record_hdr_t ssl_read_record;
|
||||||
size_t ssl_read_header_size = 0;
|
size_t ssl_read_header_size = 0;
|
||||||
|
bool ssl_more_to_buffer = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Read state
|
// Read state
|
||||||
|
|||||||
+22
-10
@@ -108,9 +108,27 @@ public:
|
|||||||
if (!msgr->ssl_do_handshake(cl))
|
if (!msgr->ssl_do_handshake(cl))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
_flush_ssl();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _flush_ssl()
|
||||||
|
{
|
||||||
int r = BIO_read(cl->read_from_ssl, curbuf+done, bufsize-done);
|
int r = BIO_read(cl->read_from_ssl, curbuf+done, bufsize-done);
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
done += r;
|
done += r;
|
||||||
|
if (done >= bufsize)
|
||||||
|
{
|
||||||
|
// Check if we've sent all buffered TLS data
|
||||||
|
// ...Because we can't return true from this->write() if we haven't
|
||||||
|
char *bio_buf = NULL;
|
||||||
|
size_t bio_sz = BIO_get_mem_data(cl->read_from_ssl, &bio_buf);
|
||||||
|
if (bio_sz > 0)
|
||||||
|
{
|
||||||
|
cl->ssl_more_to_buffer = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool write_to_ssl(osd_client_t *cl, uint8_t *src, size_t src_len, int flags, size_t & from)
|
static inline bool write_to_ssl(osd_client_t *cl, uint8_t *src, size_t src_len, int flags, size_t & from)
|
||||||
@@ -147,6 +165,8 @@ public:
|
|||||||
{
|
{
|
||||||
if (from >= src_len)
|
if (from >= src_len)
|
||||||
{
|
{
|
||||||
|
if (cl->ssl_more_to_buffer && !_flush_ssl())
|
||||||
|
return false;
|
||||||
from -= src_len;
|
from -= src_len;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -181,9 +201,8 @@ public:
|
|||||||
if (!write_to_ssl(cl, src, src_len, flags, from))
|
if (!write_to_ssl(cl, src, src_len, flags, from))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int r = BIO_read(cl->read_from_ssl, curbuf+done, bufsize-done);
|
if (!_flush_ssl())
|
||||||
if (r > 0)
|
return false;
|
||||||
done += r;
|
|
||||||
}
|
}
|
||||||
if (from < src_len)
|
if (from < src_len)
|
||||||
return false;
|
return false;
|
||||||
@@ -698,13 +717,6 @@ void osd_messenger_t::handle_send(int result, bool prev, bool more, osd_client_t
|
|||||||
cl->write_state = 0;
|
cl->write_state = 0;
|
||||||
if (cl->write_op || cl->write_ops.size())
|
if (cl->write_op || cl->write_ops.size())
|
||||||
cl->write_state = CL_WRITE_READY;
|
cl->write_state = CL_WRITE_READY;
|
||||||
else if (cl->ssl_cli)
|
|
||||||
{
|
|
||||||
char *bio_buf = NULL;
|
|
||||||
size_t bio_sz = BIO_get_mem_data(cl->read_from_ssl, &bio_buf);
|
|
||||||
if (bio_sz > 0)
|
|
||||||
cl->write_state = CL_WRITE_READY;
|
|
||||||
}
|
|
||||||
if ((cl->proto_csum_status & MSGR_CSUM_NEG) && !cl->write_op && !cl->write_ops.size())
|
if ((cl->proto_csum_status & MSGR_CSUM_NEG) && !cl->write_op && !cl->write_ops.size())
|
||||||
{
|
{
|
||||||
// Checksums negotiated, enable
|
// Checksums negotiated, enable
|
||||||
|
|||||||
Reference in New Issue
Block a user