{"record":{"id":"e7b360a974f136bd","repo":"shadowsocks/shadowsocks-rust","slug":"local-udp-port-cannot-be-0","errorCode":null,"errorMessage":"`local_udp_port` cannot be 0","messagePattern":"`local_udp_port` cannot be 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/shadowsocks-service/src/config.rs","lineNumber":1890,"sourceCode":"                        let mut local_config = LocalConfig::new(protocol);\n\n                        if let Some(local_port) = local.local_port {\n                            if local_port == 0 {\n                                let err = Error::new(ErrorKind::Malformed, \"`local_port` cannot be 0\", None);\n                                return Err(err);\n                            }\n\n                            let local_addr =\n                                get_local_address(local.local_address, local_port, config.ipv6_first.unwrap_or(false));\n                            local_config.addr = Some(local_addr);\n                        } else if local.local_address.is_some() {\n                            let err = Error::new(ErrorKind::Malformed, \"missing `local_port`\", None);\n                            return Err(err);\n                        }\n\n                        if let Some(local_udp_port) = local.local_udp_port {\n                            if local_udp_port == 0 {\n                                let err = Error::new(ErrorKind::Malformed, \"`local_udp_port` cannot be 0\", None);\n                                return Err(err);\n                            }\n\n                            let local_udp_addr = get_local_address(\n                                local.local_udp_address,\n                                local_udp_port,\n                                config.ipv6_first.unwrap_or(false),\n                            );\n\n                            local_config.udp_addr = Some(local_udp_addr);\n                        }\n\n                        #[cfg(target_os = \"macos\")]\n                        {\n                            local_config.launchd_tcp_socket_name = local.launchd_tcp_socket_name;\n                            local_config.launchd_udp_socket_name = local.launchd_udp_socket_name;\n                        }\n","sourceCodeStart":1872,"sourceCodeEnd":1908,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/crates/shadowsocks-service/src/config.rs#L1872-L1908","documentation":"This is a sentinel validation error raised during config deserialization of a local server entry: a local forwarder was declared with local_port = 0. Port 0 normally means 'let the OS assign an ephemeral port', which is meaningless for a declared listener whose port must be known and stable, so the parser rejects the whole config early rather than binding to an unpredictable port later. The input at fault is the local.local_port field of a LocalConfig in the user's configuration file being 0.","triggerScenarios":"A `local` entry (local-http/local-tunnel contexts with UDP support) contains `\"local_udp_port\": 0`.","commonSituations":"Placeholder value left from a template; a script computing the UDP port failed and produced 0; user assumed 0 means 'no UDP' instead of omitting the field.","solutions":["Set `local_udp_port` to a concrete port (1-65535), e.g. 1080.","Omit `local_udp_port` entirely if UDP relay is not needed.","Fix the generator/script that emitted 0."],"exampleFix":"// before\n{ \"protocol\": \"socks\", \"local_udp_port\": 0 }\n// after\n{ \"protocol\": \"socks\", \"local_udp_port\": 1080 }","handlingStrategy":"validation","validationCode":"fn validate_udp_port(entry: &serde_json::Value) -> Result<(), String> {\n    if let Some(p) = entry.get(\"local_udp_port\") {\n        let port = p.as_u64().ok_or(\"local_udp_port must be an integer\")?;\n        if port == 0 || port > 65535 {\n            return Err(format!(\"local_udp_port {port} out of range 1-65535\"));\n        }\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":"match LocalConfig::load_from(config_path) {\n    Ok(cfg) => start(cfg),\n    Err(e) if e.to_string().contains(\"local_udp_port\") => {\n        eprintln!(\"Fix local_udp_port: {e}\");\n        std::process::exit(1);\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Omit `local_udp_port` rather than setting 0 to disable UDP.","Apply the same 1-65535 range check used for TCP ports.","Fail generation-time when the source UDP port resolves to 0."],"tags":["config","port","udp","validation"],"backgroundTag":"invalid-config-value","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"}