Skip to content

UdpSocket: recv() and recv_from() behave differently for zero sized buffers #149392

@apps4uco

Description

@apps4uco

With a zero length buffer UdpSocket recv() behaves differently from recv_from().

(Only tested on MacOS M1 processor)

recv_from() returns the following error:

Err(Error { kind: InvalidInput, message: "invalid argument" })

recv() instantly returns with Ok(0), even though no UDP packet has been received

I would expect both to return Err(Error { kind: InvalidInput, message: "invalid argument" })

Importance

The api is different for similar functions, I believe they should behave the same way.

I encountered the bug when using

let mut buf=Vec::with_capacity(MTU);

Which could be an easy to overlook mistake.

Also recv() is returning even though no UDP packet has been received, in my case this led to a thread consuming 100% of a CPU.

Test case:

#[cfg(test)]
mod tests {
    use std::net::{Ipv4Addr, UdpSocket};

    use super::*;

    #[test]
    fn test_rx_from() {
        let mut buf = [0; 0];
        let socket = UdpSocket::bind((Ipv4Addr::LOCALHOST, 0)).unwrap();
        let res = socket.recv_from(&mut buf);
        println!("{res:?}");
        assert!(res.is_err());
    }

    #[test]
    fn test_rx() {
        let mut buf = [0; 0];
        let socket = UdpSocket::bind((Ipv4Addr::LOCALHOST, 0)).unwrap();
        let res = socket.recv(&mut buf);
        println!("{res:?}");
        assert!(res.is_err());
    }
}

Expected

I expected to see this happen:

I would expect both to return Err(Error { kind: InvalidInput, message: "invalid argument" })

I would not expect that recv instantly return an Ok(0) even though no UDP packet has been received.

Actual

Instead, this happened:

running 2 tests
Err(Error { kind: InvalidInput, message: "invalid argument" })
Ok(0)

thread 'tests::test_rx' (15944916) panicked at src/main.rs:24:9:
assertion failed: res.is_err()
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
test tests::test_rx_from ... ok
test tests::test_rx ... FAILED

failures:

failures:
    tests::test_rx

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Meta

rustc --version --verbose:

rustc 1.93.0-nightly (80d8f292d 2025-11-25)
binary: rustc
commit-hash: 80d8f292d82d735f83417221dd63b0dd2bbb8dd2
commit-date: 2025-11-25
host: aarch64-apple-darwin
release: 1.93.0-nightly
LLVM version: 21.1.5

OS uname -a

Darwin xxxxxx 25.0.0 Darwin Kernel Version 25.0.0: Mon Aug 25 21:17:45 PDT 2025; root:xnu-12377.1.9~3/RELEASE_ARM64_T8103 arm64

Related

Possibly related #55794 #123222

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-error-handlingArea: Error handlingA-ioArea: `std::io`, `std::fs`, `std::net` and `std::path`C-bugCategory: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions