diff --git a/crates/stdlib/src/socket.rs b/crates/stdlib/src/socket.rs index db22e6a10..e3745d109 100644 --- a/crates/stdlib/src/socket.rs +++ b/crates/stdlib/src/socket.rs @@ -1931,6 +1931,7 @@ mod _socket { .recv_with_flags(buffer.spare_capacity_mut(), flags) })?; unsafe { buffer.set_len(n) }; + buffer.shrink_to_fit(); Ok(buffer) } @@ -1984,6 +1985,7 @@ mod _socket { .recv_from_with_flags(buffer.spare_capacity_mut(), flags) })?; unsafe { buffer.set_len(n) }; + buffer.shrink_to_fit(); Ok(( buffer, get_addr_tuple(&addr, zelf.proto.load(Ordering::Relaxed), vm), @@ -2239,7 +2241,7 @@ mod _socket { let ancbufsize = ancbufsize as usize; let flags = flags.unwrap_or(0); - let msg = zelf + let mut msg = zelf .sock_op(vm, SockWaitKind::Read, || { let sock = zelf.sock_snapshot()?; let fd = unsafe { std::os::fd::BorrowedFd::borrow_raw(sock_fileno(&sock)) }; @@ -2247,6 +2249,8 @@ mod _socket { }) .map_err(|e| e.into_pyexception(vm))?; + msg.data.shrink_to_fit(); + // Build ancdata list let ancdata = Self::parse_ancillary_data(&msg.ancdata, vm); diff --git a/crates/stdlib/src/ssl.rs b/crates/stdlib/src/ssl.rs index 74750cced..3f18d93c3 100644 --- a/crates/stdlib/src/ssl.rs +++ b/crates/stdlib/src/ssl.rs @@ -3198,7 +3198,7 @@ mod _ssl { } // Helper function to handle return value based on buffer presence - let return_data = |data: Vec, + let return_data = |mut data: Vec, buffer_arg: &OptionalArg, vm: &VirtualMachine| -> PyResult { @@ -3216,6 +3216,7 @@ mod _ssl { } OptionalArg::Missing => { // Return bytes object + data.shrink_to_fit(); Ok(vm.ctx.new_bytes(data).into()) } } diff --git a/crates/vm/src/stdlib/_io.rs b/crates/vm/src/stdlib/_io.rs index d20cb3679..9bf3b3cfb 100644 --- a/crates/vm/src/stdlib/_io.rs +++ b/crates/vm/src/stdlib/_io.rs @@ -1439,6 +1439,7 @@ mod _io { match ($x, written > 0) { (Some(0), _) | (None, true) => { out.truncate(written); + out.shrink_to_fit(); return Ok(Some(out)); } (Some(r), _) => r, @@ -6250,6 +6251,7 @@ mod fileio { } }; bytes.truncate(n); + bytes.shrink_to_fit(); bytes } else { let mut bytes = vec![]; diff --git a/crates/vm/src/stdlib/os.rs b/crates/vm/src/stdlib/os.rs index 7419c8f92..d096157d0 100644 --- a/crates/vm/src/stdlib/os.rs +++ b/crates/vm/src/stdlib/os.rs @@ -403,6 +403,7 @@ pub(super) mod _os { match vm.allow_threads(|| crt_fd::read(fd, &mut buffer)) { Ok(n) => { buffer.truncate(n); + buffer.shrink_to_fit(); return Ok(vm.ctx.new_bytes(buffer)); } Err(e) if e.raw_os_error() == Some(libc::EINTR) => {