{"record":{"id":"b916b8700a55f642","repo":"cloudflare/pingora","slug":"invalid-argument","errorCode":null,"errorMessage":"invalid argument","messagePattern":"invalid argument","errorType":"validation","errorClass":"std::io::Error","httpStatus":null,"severity":"error","filePath":"pingora-core/src/protocols/windows.rs","lineNumber":83,"sourceCode":"    match storage.ss_family {\n        AF_INET => {\n            assert!(len >= mem::size_of::<SOCKADDR_IN>());\n            Ok(SocketAddr::from(unsafe {\n                let sockaddr = *(storage as *const _ as *const SOCKADDR_IN);\n                (\n                    sockaddr.sin_addr.S_un.S_addr.to_ne_bytes(),\n                    sockaddr.sin_port.to_be(),\n                )\n            }))\n        }\n        AF_INET6 => {\n            assert!(len >= mem::size_of::<SOCKADDR_IN6>());\n            Ok(SocketAddr::from(unsafe {\n                let sockaddr = *(storage as *const _ as *const SOCKADDR_IN6);\n                (sockaddr.sin6_addr.u.Byte, sockaddr.sin6_port.to_be())\n            }))\n        }\n        _ => Err(io::Error::new(\n            io::ErrorKind::InvalidInput,\n            \"invalid argument\",\n        )),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::os::windows::io::AsRawSocket;\n\n    use crate::protocols::l4::{listener::Listener, stream::Stream};\n\n    use super::*;\n\n    async fn assert_listener_and_stream(addr: &str) {\n        let tokio_listener = tokio::net::TcpListener::bind(addr).await.unwrap();\n\n        let listener_local_addr = tokio_listener.local_addr().unwrap();","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/cloudflare/pingora/blob/0046038bd402bc82912da862dadf9a479f31e9f1/pingora-core/src/protocols/windows.rs#L65-L101","documentation":"On Windows, pingora converts the raw Winsock sockaddr storage returned by getpeername/getsockname into std::net::SocketAddr via sockaddr_to_addr() in protocols/windows.rs. Only AF_INET and AF_INET6 are handled; every other address family is rejected with io::Error::new(ErrorKind::InvalidInput, \"invalid argument\"). It surfaces through peer_addr()/local_addr() of pingora streams and listeners on Windows builds.","triggerScenarios":"Running pingora on Windows and calling peer_addr()/local_addr() on a socket whose family is neither AF_INET nor AF_INET6, e.g. a Windows AF_UNIX socket or other non-TCP transport handed to pingora's l4 accept path.","commonSituations":"Experimental Windows builds trying AF_UNIX (supported since Windows 10 17063) through pingora's TCP-centric layer; unit tests on Windows that create exotic sockets; in normal HTTP proxying this is nearly unreachable because peers are always IPv4/IPv6.","solutions":["Restrict pingora on Windows to IPv4/IPv6 TCP listeners and upstreams, which is the supported configuration","Match ErrorKind::InvalidInput from peer_addr()/local_addr() and drop the unsupported connection instead of unwrapping","Terminate non-INET transports outside pingora and bridge them to pingora over TCP/localhost"],"exampleFix":"// before\nlet peer = stream.peer_addr()?; // InvalidInput for non-INET families on Windows\n\n// after\nlet peer = match stream.peer_addr() {\n    Ok(a) => a,\n    Err(e) if e.kind() == std::io::ErrorKind::InvalidInput => {\n        return Ok(()); // unsupported address family: drop connection\n    }\n    Err(e) => return Err(e.into()),\n};","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Windows: tolerate unsupported socket families from peer_addr()/local_addr()\nmatch stream.peer_addr() {\n    Ok(addr) => { /* proceed */ }\n    Err(e) if e.kind() == std::io::ErrorKind::InvalidInput => {\n        log::warn!(\"dropping connection with unsupported address family\");\n        return Ok(()); // skip the connection, do not abort the accept loop\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["On Windows, bind only IPv4/IPv6 listeners and never hand non-INET sockets to pingora's l4 layer","Never unwrap() peer_addr()/local_addr() in accept paths; map InvalidInput to a controlled 'drop connection' branch","Run a Windows CI job so platform-specific address handling is exercised before release"],"tags":["rust","windows","winsock","socket-address","pingora"],"backgroundTag":"unsupported-address-family","analyzedSha":"0046038bd402bc82912da862dadf9a479f31e9f1","analyzedAt":"2026-08-16T21:33:22.341Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}