Prechádzať zdrojové kódy

Merge pull request #983 from d2weber/pr

Fixes #982
Thibaut Vandervelden 6 mesiacov pred
rodič
commit
a2b92ed6e8
3 zmenil súbory, kde vykonal 29 pridanie a 9 odobranie
  1. 8 0
      .github/workflows/test.yml
  2. 14 0
      ci.sh
  3. 7 9
      src/socket/tcp.rs

+ 8 - 0
.github/workflows/test.yml

@@ -47,3 +47,11 @@ jobs:
       - uses: actions/checkout@v4
       - name: Run Tests nightly
         run: ./ci.sh test nightly
+
+  test-build-16bit:
+    runs-on: ubuntu-22.04
+    continue-on-error: true
+    steps:
+      - uses: actions/checkout@v4
+      - name: Build for target with 16 bit pointer
+        run: ./ci.sh build_16bit

+ 14 - 0
ci.sh

@@ -82,6 +82,16 @@ clippy() {
     cargo +$MSRV clippy --tests --examples -- -D warnings
 }
 
+build_16bit() {
+    rustup toolchain install nightly
+    rustup +nightly component add rust-src
+
+    TARGET_WITH_16BIT_POINTER=msp430-none-elf
+    for features in ${FEATURES_CHECK[@]}; do
+        cargo +nightly build -Z build-std=core,alloc --target $TARGET_WITH_16BIT_POINTER --no-default-features --features=$features
+    done
+}
+
 coverage() {
     for features in ${FEATURES_TEST[@]}; do
         cargo llvm-cov --no-report --no-default-features --features "$features"
@@ -121,6 +131,10 @@ if [[ $1 == "clippy" || $1 == "all" ]]; then
     clippy
 fi
 
+if [[ $1 == "build_16bit" || $1 == "all" ]]; then
+    build_16bit
+fi
+
 if [[ $1 == "coverage" || $1 == "all" ]]; then
     coverage
 fi

+ 7 - 9
src/socket/tcp.rs

@@ -5,7 +5,7 @@
 use core::fmt::Display;
 #[cfg(feature = "async")]
 use core::task::Waker;
-use core::{cmp, fmt, mem};
+use core::{fmt, mem};
 
 #[cfg(feature = "async")]
 use crate::socket::WakerRegistration;
@@ -510,6 +510,7 @@ impl<'a> Socket<'a> {
         // [...] the above constraints imply that 2 * the max window size must be less
         // than 2**31 [...] Thus, the shift count must be limited to 14 (which allows
         // windows of 2**30 = 1 Gbyte).
+        #[cfg(not(target_pointer_width = "16"))] // Prevent overflow
         if rx_capacity > (1 << 30) {
             panic!("receiving buffer too large, cannot exceed 1 GiB")
         }
@@ -676,10 +677,7 @@ impl<'a> Socket<'a> {
     /// Used in internal calculations as well as packet generation.
     #[inline]
     fn scaled_window(&self) -> u16 {
-        cmp::min(
-            self.rx_buffer.window() >> self.remote_win_shift as usize,
-            (1 << 16) - 1,
-        ) as u16
+        u16::try_from(self.rx_buffer.window() >> self.remote_win_shift).unwrap_or(u16::MAX)
     }
 
     /// Return the last window field value, including scaling according to RFC 1323.
@@ -698,7 +696,7 @@ impl<'a> Socket<'a> {
         let last_win = (self.remote_last_win as usize) << self.remote_win_shift;
         let last_win_adjusted = last_ack + last_win - next_ack;
 
-        Some(cmp::min(last_win_adjusted >> self.remote_win_shift, (1 << 16) - 1) as u16)
+        Some(u16::try_from(last_win_adjusted >> self.remote_win_shift).unwrap_or(u16::MAX))
     }
 
     /// Set the timeout duration.
@@ -2335,7 +2333,7 @@ impl<'a> Socket<'a> {
             State::SynSent | State::SynReceived => {
                 repr.control = TcpControl::Syn;
                 // window len must NOT be scaled in SYNs.
-                repr.window_len = self.rx_buffer.window().min((1 << 16) - 1) as u16;
+                repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX);
                 if self.state == State::SynSent {
                     repr.ack_number = None;
                     repr.window_scale = Some(self.remote_win_shift);
@@ -3075,7 +3073,7 @@ mod test {
                     ack_number: Some(REMOTE_SEQ + 1),
                     max_seg_size: Some(BASE_MSS),
                     window_scale: Some(*shift_amt),
-                    window_len: cmp::min(*buffer_size, 65535) as u16,
+                    window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
                     ..RECV_TEMPL
                 }]
             );
@@ -3810,7 +3808,7 @@ mod test {
                     ack_number: None,
                     max_seg_size: Some(BASE_MSS),
                     window_scale: Some(*shift_amt),
-                    window_len: cmp::min(*buffer_size, 65535) as u16,
+                    window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
                     sack_permitted: true,
                     ..RECV_TEMPL
                 }]