From 70de1a257023760b16760d2028122fcae474e3b8 Mon Sep 17 00:00:00 2001 From: Anthony Grondin <104731965+AnthonyGrondin@users.noreply.github.com> Date: Fri, 15 Sep 2023 17:08:27 -0400 Subject: [PATCH] Don't return from `read()` if there's no data --- esp-mbedtls/src/lib.rs | 46 +++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/esp-mbedtls/src/lib.rs b/esp-mbedtls/src/lib.rs index e0170f2..bad2e72 100644 --- a/esp-mbedtls/src/lib.rs +++ b/esp-mbedtls/src/lib.rs @@ -534,21 +534,15 @@ where T: Read + Write, { fn read(&mut self, buf: &mut [u8]) -> Result { - let res = self.session.internal_read(buf); - if res <= 0 { - if res == MBEDTLS_ERR_SSL_WANT_READ - || res == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET - { - Ok(0) - } else { - if res == 0 { - Err(TlsError::Eof) - } else { - Err(TlsError::MbedTlsError(res)) - } + loop { + let res = self.session.internal_read(buf); + match res { + 0 | MBEDTLS_ERR_SSL_WANT_READ | MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET => { + continue + } // no data + 1_i32..=i32::MAX => return Ok(res as usize), // data + i32::MIN..=-1_i32 => return Err(TlsError::MbedTlsError(res)), // error } - } else { - Ok(res as usize) } } } @@ -852,20 +846,18 @@ pub mod asynch { { async fn read(&mut self, buf: &mut [u8]) -> Result { log::debug!("async read called"); - if self.session.eof && self.session.rx_buffer.empty() { - return Err(TlsError::Eof); - } - - let res = self.session.async_internal_read(buf).await?; - if res < 0 { - if res == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET { - log::debug!("MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET"); - Ok(0) - } else { - Err(TlsError::MbedTlsError(res)) + loop { + if self.session.eof && self.session.rx_buffer.empty() { + return Err(TlsError::Eof); + } + let res = self.session.async_internal_read(buf).await?; + match res { + 0 | MBEDTLS_ERR_SSL_WANT_READ | MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET => { + continue + } // no data + 1_i32..=i32::MAX => return Ok(res as usize), // data + i32::MIN..=-1_i32 => return Err(TlsError::MbedTlsError(res)), // error } - } else { - Ok(res as usize) } } }