Release unused capacity after short reads (#9028)

Assisted-by: Codex:gpt-6
This commit is contained in:
1ndahous3 authored and GitHub committed 2026-10-12 22:29:24 +09:00
1 parent 129330f95c
commit 85d5956dbb
4 files changed
+10 -2

No files matched your search

+5 -1
View File
@@ -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);
+2 -1
View File
@@ -3198,7 +3198,7 @@ mod _ssl {
}
// Helper function to handle return value based on buffer presence
let return_data = |data: Vec<u8>,
let return_data = |mut data: Vec<u8>,
buffer_arg: &OptionalArg<ArgMemoryBuffer>,
vm: &VirtualMachine|
-> PyResult<PyObjectRef> {
@@ -3216,6 +3216,7 @@ mod _ssl {
}
OptionalArg::Missing => {
// Return bytes object
data.shrink_to_fit();
Ok(vm.ctx.new_bytes(data).into())
}
}
+2
View File
@@ -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![];
+1
View File
@@ -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) => {