Omit msgr_tls_record_hdr_t for non-tls data

This commit is contained in:
Vitaliy Filippov
2026-04-17 21:22:47 +03:00
parent 5d65d87dfb
commit a6b29a01a2
2 changed files with 33 additions and 83 deletions
+13 -43
View File
@@ -106,9 +106,7 @@ public:
from = cl->read_op_pos; from = cl->read_op_pos;
} }
void buffer_encrypted() bool buffer_encrypted()
{
while (done < bufsize)
{ {
if (cl->ssl_read_record_size < sizeof(msgr_tls_record_hdr_t)) if (cl->ssl_read_record_size < sizeof(msgr_tls_record_hdr_t))
{ {
@@ -119,10 +117,14 @@ public:
done += n; done += n;
cl->ssl_read_record_size += n; cl->ssl_read_record_size += n;
if (done >= bufsize) if (done >= bufsize)
return; return true;
} }
if (cl->ssl_read_record.encrypted) if (cl->ssl_read_record.encrypted != 1)
{ {
fprintf(stderr, "Client %ju got record with unknown type %u\n", cl->ssl_read_record.encrypted);
cl->io_error = true;
return false;
}
size_t n = cl->ssl_read_record.size; size_t n = cl->ssl_read_record.size;
if (n > bufsize-done) if (n > bufsize-done)
n = bufsize-done; n = bufsize-done;
@@ -134,13 +136,7 @@ public:
cl->ssl_read_record.size -= n; cl->ssl_read_record.size -= n;
if (!cl->ssl_read_record.size) if (!cl->ssl_read_record.size)
cl->ssl_read_record_size = 0; cl->ssl_read_record_size = 0;
} return true;
else
{
// Unencrypted data
break;
}
}
} }
bool read(uint8_t *dst, size_t dst_len, int flags) override bool read(uint8_t *dst, size_t dst_len, int flags) override
@@ -154,21 +150,12 @@ public:
size_t n = dst_len-from; size_t n = dst_len-from;
if (!(flags & RDR_TLS) || !cl->ssl_cli) if (!(flags & RDR_TLS) || !cl->ssl_cli)
{ {
if (cl->ssl_cli && (cl->ssl_read_record_size < sizeof(msgr_tls_record_hdr_t) ||
cl->ssl_read_record.size < n || cl->ssl_read_record.encrypted))
{
fprintf(stderr, "Client %ju non-TLS data is too short, disconnecting\n", cl->client_id);
cl->io_error = true;
return false;
}
if (n > bufsize-done) if (n > bufsize-done)
n = bufsize-done; n = bufsize-done;
if (flags & RDR_XTS) if (flags & RDR_XTS)
{ {
size_t prev = done;
msgr->op_decrypted_copy_buf(cl, curbuf, bufsize, dst, dst_len, from, done); msgr->op_decrypted_copy_buf(cl, curbuf, bufsize, dst, dst_len, from, done);
n = 0; n = 0;
cl->ssl_read_record.size -= (done-prev);
} }
else else
{ {
@@ -181,16 +168,14 @@ public:
if (dst != NULL) if (dst != NULL)
memcpy(dst+from, curbuf+done, n); memcpy(dst+from, curbuf+done, n);
done += n; done += n;
cl->ssl_read_record.size -= n;
} }
if (!cl->ssl_read_record.size)
cl->ssl_read_record_size = 0;
} }
else else
{ {
// Here, dst == NULL is not allowed // Here, dst == NULL is not allowed
assert(dst != NULL); assert(dst != NULL);
buffer_encrypted(); if (!buffer_encrypted())
return false;
if (!cl->ssl_handshake_done) if (!cl->ssl_handshake_done)
{ {
if (!msgr->ssl_do_handshake(cl)) if (!msgr->ssl_do_handshake(cl))
@@ -317,25 +302,10 @@ public:
cl->read_op_pos = cl->read_op_inline_decrypt_in + OSD_PACKET_SIZE + cl->read_op->reply.rw.bitmap_len; cl->read_op_pos = cl->read_op_inline_decrypt_in + OSD_PACKET_SIZE + cl->read_op->reply.rw.bitmap_len;
from = cl->read_op_inline_decrypt_in; from = cl->read_op_inline_decrypt_in;
} }
if (cl->ssl_cli) size_t n = dst_len-from;
{ cl->recv_list.push_back((iovec){ dst+from, n });
if (cl->ssl_read_record_size < sizeof(msgr_tls_record_hdr_t))
{
return false;
}
if (cl->ssl_read_record.size < dst_len-from || cl->ssl_read_record.encrypted)
{
fprintf(stderr, "Client %ju non-TLS data is too short, disconnecting\n", cl->client_id);
cl->io_error = true;
return false;
}
cl->ssl_read_record.size -= (dst_len-from);
if (!cl->ssl_read_record.size)
cl->ssl_read_record_size = 0;
}
cl->recv_list.push_back((iovec){ dst+from, dst_len-from });
cl->recv_flags.push_back(flags); cl->recv_flags.push_back(flags);
cl->read_op_pos += dst_len-from; cl->read_op_pos += n;
from = 0; from = 0;
return true; return true;
} }
-20
View File
@@ -165,13 +165,6 @@ public:
} }
if (!(flags & WR_TLS) || !cl->ssl_cli) if (!(flags & WR_TLS) || !cl->ssl_cli)
{ {
if (cl->ssl_cli && from == 0 && done < bufsize-sizeof(msgr_tls_record_hdr_t)-1)
{
msgr_tls_record_hdr_t *hdr = (msgr_tls_record_hdr_t*)(curbuf+done);
hdr->encrypted = 0;
hdr->size = src_len;
done += sizeof(msgr_tls_record_hdr_t);
}
if (flags & WR_XTS) if (flags & WR_XTS)
{ {
msgr->op_encrypted_copy_buf(cl, curbuf, bufsize, src, src_len, from, done); msgr->op_encrypted_copy_buf(cl, curbuf, bufsize, src, src_len, from, done);
@@ -317,19 +310,6 @@ public:
from = 0; from = 0;
return true; return true;
} }
else if (!from)
{
if (cl->send_list.size() >= IOV_MAX-1)
{
return false;
}
ssl_extend_buf();
msgr_tls_record_hdr_t *hdr = (msgr_tls_record_hdr_t*)(cl->ssl_out_buf+cl->ssl_out_buf_size);
hdr->encrypted = 0;
hdr->size = src_len;
cl->send_list.push_back((iovec){ .iov_base = cl->ssl_out_buf+cl->ssl_out_buf_size, .iov_len = sizeof(msgr_tls_record_hdr_t) });
cl->ssl_out_buf_size += sizeof(msgr_tls_record_hdr_t);
}
} }
if (flags & WR_XTS) if (flags & WR_XTS)
{ {