Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

### Fix

- update nix and related deps to fix s390x build
- armv7/armhf test error `The payload should be rejected due to large size`

## \[4.0.3\] - 2026-03-01

### Fix
Expand Down
12 changes: 6 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 12 additions & 6 deletions pueue_lib/src/network/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,21 +109,27 @@ pub async fn receive_bytes_with_max_size(
.await
.map_err(|err| Error::IoError("reading request size header".to_string(), err))?;
let mut header = Cursor::new(header);
let message_size = ReadBytesExt::read_u64::<BigEndian>(&mut header)? as usize;
let message_size_u64 = ReadBytesExt::read_u64::<BigEndian>(&mut header)?;

if let Some(max_size) = max_size
&& message_size > max_size
&& message_size_u64 > max_size as u64
{
error!("Client requested message size of {message_size}, but only {max_size} is allowed.");
return Err(Error::MessageTooBig(message_size, max_size));
error!(
"Client requested message size of {message_size_u64}, but only {max_size} is allowed."
);
return Err(Error::MessageTooBig(message_size_u64 as usize, max_size));
}

// Show a warning if we see unusually large payloads. In this case payloads that're bigger than
// 20MB, which is pretty large considering pueue is usually only sending a bit of text.
if message_size > (20 * (2usize.pow(20))) {
warn!("Client is sending a large payload: {message_size} bytes.");
if message_size_u64 > (20 * (2u64.pow(20))) {
warn!("Client is sending a large payload: {message_size_u64} bytes.");
}

// On 32-bit platforms usize is narrower than u64; reject sizes that don't fit.
let message_size = usize::try_from(message_size_u64)
.map_err(|_| Error::MessageTooBig(usize::MAX, usize::MAX))?;

// Buffer for the whole payload
let mut payload_bytes = Vec::with_capacity(message_size);

Expand Down
18 changes: 12 additions & 6 deletions pueue_lib/src/network_blocking/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,21 +106,27 @@ pub fn receive_bytes_with_max_size(
.read_exact(&mut header)
.map_err(|err| Error::IoError("reading request size header".to_string(), err))?;
let mut header = Cursor::new(header);
let message_size = ReadBytesExt::read_u64::<BigEndian>(&mut header)? as usize;
let message_size_u64 = ReadBytesExt::read_u64::<BigEndian>(&mut header)?;

if let Some(max_size) = max_size
&& message_size > max_size
&& message_size_u64 > max_size as u64
{
error!("Client requested message size of {message_size}, but only {max_size} is allowed.");
return Err(Error::MessageTooBig(message_size, max_size));
error!(
"Client requested message size of {message_size_u64}, but only {max_size} is allowed."
);
return Err(Error::MessageTooBig(message_size_u64 as usize, max_size));
}

// Show a warning if we see unusually large payloads. In this case payloads that're bigger than
// 20MB, which is pretty large considering pueue is usually only sending a bit of text.
if message_size > (20 * (2usize.pow(20))) {
warn!("Client is sending a large payload: {message_size} bytes.");
if message_size_u64 > (20 * (2u64.pow(20))) {
warn!("Client is sending a large payload: {message_size_u64} bytes.");
}

// On 32-bit platforms usize is narrower than u64; reject sizes that don't fit.
let message_size = usize::try_from(message_size_u64)
.map_err(|_| Error::MessageTooBig(usize::MAX, usize::MAX))?;

// Buffer for the whole payload
let mut payload_bytes = Vec::with_capacity(message_size);

Expand Down