Merge pull request #98995 from Faless/mbetls/insestent_io

[mbedTLS] Keep reading/writing partial until "would block"
This commit is contained in:
Thaddeus Crews 2024-11-12 12:13:09 -06:00
commit 21ed92273d
No known key found for this signature in database
GPG Key ID: 62181B86FE9E5D84

View File

@ -166,21 +166,24 @@ Error StreamPeerMbedTLS::put_partial_data(const uint8_t *p_data, int p_bytes, in
return OK; return OK;
} }
int ret = mbedtls_ssl_write(tls_ctx->get_context(), p_data, p_bytes); do {
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { int ret = mbedtls_ssl_write(tls_ctx->get_context(), &p_data[r_sent], p_bytes - r_sent);
// Non blocking IO if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
ret = 0; // Non blocking IO.
} else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { break;
// Clean close } else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
disconnect_from_stream(); // Clean close
return ERR_FILE_EOF; disconnect_from_stream();
} else if (ret <= 0) { return ERR_FILE_EOF;
TLSContextMbedTLS::print_mbedtls_error(ret); } else if (ret <= 0) {
disconnect_from_stream(); TLSContextMbedTLS::print_mbedtls_error(ret);
return ERR_CONNECTION_ERROR; disconnect_from_stream();
} return ERR_CONNECTION_ERROR;
}
r_sent += ret;
} while (r_sent < p_bytes);
r_sent = ret;
return OK; return OK;
} }
@ -209,20 +212,25 @@ Error StreamPeerMbedTLS::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r
r_received = 0; r_received = 0;
int ret = mbedtls_ssl_read(tls_ctx->get_context(), p_buffer, p_bytes); do {
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { int ret = mbedtls_ssl_read(tls_ctx->get_context(), &p_buffer[r_received], p_bytes - r_received);
ret = 0; // non blocking io if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
} else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { // Non blocking IO.
// Clean close break;
disconnect_from_stream(); } else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
return ERR_FILE_EOF; // Clean close
} else if (ret <= 0) { disconnect_from_stream();
TLSContextMbedTLS::print_mbedtls_error(ret); return ERR_FILE_EOF;
disconnect_from_stream(); } else if (ret <= 0) {
return ERR_CONNECTION_ERROR; TLSContextMbedTLS::print_mbedtls_error(ret);
} disconnect_from_stream();
return ERR_CONNECTION_ERROR;
}
r_received += ret;
} while (r_received < p_bytes);
r_received = ret;
return OK; return OK;
} }