{"record":{"id":"1f1d640bbdb1458f","repo":"shadowsocks/shadowsocks-rust","slug":"server-addr-1f1d64","errorCode":null,"errorMessage":"server-addr","messagePattern":"server-addr","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/service/server.rs","lineNumber":355,"sourceCode":"                .expect(\"`method` is required\");\n\n            let password = match matches.get_one::<String>(\"PASSWORD\") {\n                Some(pwd) => read_variable_field_value(pwd).into(),\n                None => {\n                    // NOTE: svr_addr should have been checked by crate::vparser\n                    if method.is_none() {\n                        // If method doesn't need a key (none, plain), then we can leave it empty\n                        String::new()\n                    } else {\n                        match crate::password::read_server_password(svr_addr) {\n                            Ok(pwd) => pwd,\n                            Err(..) => panic!(\"`password` is required for server {svr_addr}\"),\n                        }\n                    }\n                }\n            };\n\n            let svr_addr = svr_addr.parse::<ServerAddr>().expect(\"server-addr\");\n            let timeout = matches.get_one::<u64>(\"TIMEOUT\").map(|x| Duration::from_secs(*x));\n\n            let mut sc = match ServerConfig::new(svr_addr, password, method) {\n                Ok(sc) => sc,\n                Err(err) => {\n                    panic!(\"failed to create ServerConfig, error: {}\", err);\n                }\n            };\n            if let Some(timeout) = timeout {\n                sc.set_timeout(timeout);\n            }\n\n            if let Some(p) = matches.get_one::<String>(\"PLUGIN\").cloned() {\n                let plugin = PluginConfig {\n                    plugin: p,\n                    plugin_opts: matches.get_one::<String>(\"PLUGIN_OPT\").cloned(),\n                    plugin_args: Vec::new(),\n                    plugin_mode: matches","sourceCodeStart":337,"sourceCodeEnd":373,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/src/service/server.rs#L337-L373","documentation":"The `SERVER_ADDR` CLI value is parsed with `svr_addr.parse::<ServerAddr>().expect(\"server-addr\")`. The panic means the string is not a valid SIP002 server address — it must be a `host:port` (or `hostname:port`) pair. Invalid hosts, missing port, or malformed IPv6 literals all fail this parse.","triggerScenarios":"Running `ssserver`/managers with `-s` values like `0.0.0.0` (no port), `:8388` (no host), `example.com` (no port), or unbracketed IPv6 like `-s ::1:8388`.","commonSituations":"Forgetting the port; writing IPv6 addresses without brackets (`[::1]:8388` is required); trailing whitespace or protocol prefixes (`udp://host:port`).","solutions":["Supply a valid `host:port` pair, e.g. `-s \"0.0.0.0:8388\"`","Bracket IPv6 literals: `-s \"[::]:8388\"`","Strip any scheme prefix and trim whitespace from the value","Use a config file with a properly validated `server` field for complex setups"],"exampleFix":"// before\nssserver -s \"0.0.0.0\" -p \"pass\" -m aes-256-gcm\n// after\nssserver -s \"0.0.0.0:8388\" -p \"pass\" -m aes-256-gcm","handlingStrategy":"validation","validationCode":"use std::net::ToSocketAddrs;\nfn valid_server_addr(s: &str) -> bool {\n    s.rsplit_once(':').map(|(h, p)| p.parse::<u16>().is_ok() && !h.is_empty()).unwrap_or(false)\n        && s.to_socket_addrs().is_ok()\n}","typeGuard":"fn looks_like_host_port(s: &str) -> bool {\n    s.rsplit_once(':').map(|(h, p)| !h.is_empty() && p.parse::<u16>().is_ok()).unwrap_or(false)\n}","tryCatchPattern":"// parse explicitly with guidance\nlet addr: ServerAddr = s.parse().map_err(|_| anyhow!(\"-s must be host:port (IPv6 needs brackets: [::1]:8388)\"))?;","preventionTips":["Always include a port with -s","Bracket IPv6 literals: [2001:db8::1]:8388","Trim whitespace and never include scheme prefixes"],"tags":["cli","address","parsing","shadowsocks"],"backgroundTag":"invalid-argument-format","analyzedSha":"8eb0f0a65b1d976ab6bed5787327ef86529b0435","analyzedAt":"2026-09-09T12:20:43.168Z","contentChangedAt":"2026-09-09T12:20:43.168Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}