shadowsocks/shadowsocks-rust · error

unix datagram requires path address target

Error message

unix datagram requires path address target

What it means

send_to on a unix-datagram manager socket was given an IP:port (ManagerSocketAddr::SocketAddr) target. Unix datagram sockets can only send to path-based addresses, so the call fails with ErrorKind::InvalidInput.

Solutions

  1. Pass a unix path address (ManagerSocketAddr::UnixSocketAddr) when using the unix datagram transport
  2. Switch the transport to UDP if the manager really is reached via IP:port
  3. Match the address type against the transport type before calling send_to

Example fix

// before
unix_conn.send_to(buf, &ManagerSocketAddr::SocketAddr(ip_port)).await?;
// after
unix_conn.send_to(buf, &ManagerSocketAddr::UnixSocketAddr(unix_addr)).await?;
Defensive patterns

Strategy: validation

Validate before calling

if let ManagerSocketAddr::SocketAddr(_) = target {
    return Err(anyhow!("unix transport requires path target"));
}

Prevention

When it happens

Trigger: Calling send_to with ManagerDatagram::UnixDatagram transport but a ManagerSocketAddr::SocketAddr target parsed from an IP:port string.

Common situations: Mixed-up configuration where the transport is a unix socket but the manager address in config is host:port; code paths shared between UDP and unix transports passing the wrong address variant.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of shadowsocks/shadowsocks-rust@8eb0f0a65b (2026-09-09). Data as JSON: /api/errors/913990c6e01c0c85. Report an issue: GitHub.

Appendix: source

Thrown at crates/shadowsocks/src/manager/datagram.rs:162

            Self::UdpDatagram(ref mut udp) => match *target {
                ManagerSocketAddr::SocketAddr(ref saddr) => udp.send_to(buf, saddr).await,
                #[cfg(unix)]
                ManagerSocketAddr::UnixSocketAddr(..) => {
                    let err = io::Error::new(ErrorKind::InvalidInput, "udp datagram requires IP address target");
                    Err(err)
                }
            },
            #[cfg(unix)]
            Self::UnixDatagram(ref mut unix) => match *target {
                ManagerSocketAddr::UnixSocketAddr(ref saddr) => match saddr.as_pathname() {
                    Some(paddr) => unix.send_to(buf, paddr).await,
                    None => {
                        let err = io::Error::new(ErrorKind::InvalidInput, "target address must not be unnamed");
                        Err(err)
                    }
                },
                ManagerSocketAddr::SocketAddr(..) => {
                    let err = io::Error::new(ErrorKind::InvalidInput, "unix datagram requires path address target");
                    Err(err)
                }
            },
        }
    }

    /// Sends data on the socket to the specified manager address
    pub async fn send_to_manager(&mut self, buf: &[u8], context: &Context, target: &ManagerAddr) -> io::Result<usize> {
        match *self {
            Self::UdpDatagram(ref mut udp) => match *target {
                ManagerAddr::SocketAddr(ref saddr) => udp.send_to(buf, saddr).await,
                ManagerAddr::DomainName(ref dname, port) => {
                    let (_, n) = lookup_then!(context, dname, port, |saddr| { udp.send_to(buf, saddr).await })?;
                    Ok(n)
                }
                #[cfg(unix)]
                ManagerAddr::UnixSocketAddr(..) => {
                    let err = io::Error::new(ErrorKind::InvalidInput, "udp datagram requires IP address target");

View on GitHub (pinned to 8eb0f0a65b)