{"record":{"id":"1a45b54270f77211","repo":"shadowsocks/shadowsocks-rust","slug":"udp-datagram-requires-ip-address-target","errorCode":null,"errorMessage":"udp datagram requires IP address target","messagePattern":"udp datagram requires IP address target","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/shadowsocks/src/manager/datagram.rs","lineNumber":148,"sourceCode":"    }\n\n    /// Sends data to the socket\n    pub async fn send(&mut self, buf: &[u8]) -> io::Result<usize> {\n        match *self {\n            Self::UdpDatagram(ref mut udp) => udp.send(buf).await,\n            #[cfg(unix)]\n            Self::UnixDatagram(ref mut unix) => unix.send(buf).await,\n        }\n    }\n\n    /// Sends data to the socket to the specified address.\n    pub async fn send_to(&mut self, buf: &[u8], target: &ManagerSocketAddr) -> io::Result<usize> {\n        match *self {\n            Self::UdpDatagram(ref mut udp) => match *target {\n                ManagerSocketAddr::SocketAddr(ref saddr) => udp.send_to(buf, saddr).await,\n                #[cfg(unix)]\n                ManagerSocketAddr::UnixSocketAddr(..) => {\n                    let err = io::Error::new(ErrorKind::InvalidInput, \"udp datagram requires IP address target\");\n                    Err(err)\n                }\n            },\n            #[cfg(unix)]\n            Self::UnixDatagram(ref mut unix) => match *target {\n                ManagerSocketAddr::UnixSocketAddr(ref saddr) => match saddr.as_pathname() {\n                    Some(paddr) => unix.send_to(buf, paddr).await,\n                    None => {\n                        let err = io::Error::new(ErrorKind::InvalidInput, \"target address must not be unnamed\");\n                        Err(err)\n                    }\n                },\n                ManagerSocketAddr::SocketAddr(..) => {\n                    let err = io::Error::new(ErrorKind::InvalidInput, \"unix datagram requires path address target\");\n                    Err(err)\n                }\n            },\n        }","sourceCodeStart":130,"sourceCodeEnd":166,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/crates/shadowsocks/src/manager/datagram.rs#L130-L166","documentation":"ManagerServerSendTo::send_to was called on a UDP-datagram manager socket with a ManagerSocketAddr::UnixSocketAddr target. UDP sockets can only send to IP:port addresses, so the method refuses the call with ErrorKind::InvalidInput instead of attempting an impossible send.","triggerScenarios":"Calling send_to on a manager connection opened over UDP (ManagerDatagram::UdpDatagram) while passing a target created from a unix socket path (e.g. /path/to/manager.sock).","commonSituations":"Configuration where the manager address and the transport are mismatched — the client connects to the manager over UDP but the config specifies a unix-socket address, or code copied from the unix-socket variant is reused with a UDP transport.","solutions":["Use a SocketAddr (IP:port) target when the manager transport is UDP","Switch the manager transport to unix datagram if the manager listens on a unix socket path","Validate the ManagerAddr type before choosing which transport/datagram to build"],"exampleFix":"// before\nudp_conn.send_to(buf, &ManagerSocketAddr::UnixSocketAddr(path)).await?;\n// after\nlet target = ManagerSocketAddr::SocketAddr(\"127.0.0.1:6010\".parse()?);\nudp_conn.send_to(buf, &target).await?;","handlingStrategy":"validation","validationCode":"if let ManagerSocketAddr::UnixSocketAddr(_) = target {\n    return Err(anyhow!(\"UDP transport cannot send to unix socket target\"));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep manager address type and transport type consistent in config","Use UDP transports only with IP:port manager addresses","Unit-test transport/address combinations at startup"],"tags":["udp","unix-socket","invalid-input","shadowsocks"],"backgroundTag":"invalid-argument-value","analyzedSha":"8eb0f0a65b1d976ab6bed5787327ef86529b0435","analyzedAt":"2026-09-09T12:20:43.168Z","contentChangedAt":"2026-09-09T12:20:43.168Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}