{"record":{"id":"3a413d575bf3cc4c","repo":"TechnitiumSoftware/DnsServer","slug":"network-group-map-contains-an-invalid-network-addr-3a413d","errorCode":null,"errorMessage":"Network group map contains an invalid network address: {strNetworkAddress}","messagePattern":"Network group map contains an invalid network address: (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Apps/SplitHorizonApp/AddressTranslation.cs","lineNumber":197,"sourceCode":"\n                if (!jsonConfig.TryReadObjectAsMap(\"domainGroupMap\", delegate (string domain, JsonElement jsonGroupName)\n                    {\n                        return new Tuple<string, string>(domain, jsonGroupName.GetString());\n                    }, out _domainGroupMap))\n                {\n                    _domainGroupMap = new Dictionary<string, string>(1)\n                    {\n                        { \"example.com\", \"local1\" }\n                    };\n\n                    config = config.Replace(\"\\\"networkGroupMap\\\": \", \"\\\"domainGroupMap\\\": {\\r\\n        \\\"example.com\\\": \\\"local1\\\"\\r\\n    },\\r\\n    \\\"networkGroupMap\\\": \");\n                    await File.WriteAllTextAsync(Path.Combine(dnsServer.ApplicationFolder, \"dnsApp.config\"), config);\n                }\n\n                _networkGroupMap = jsonConfig.ReadObjectAsMap(\"networkGroupMap\", delegate (string strNetworkAddress, JsonElement jsonGroupName)\n                {\n                    if (!NetworkAddress.TryParse(strNetworkAddress, out NetworkAddress networkAddress))\n                        throw new InvalidOperationException(\"Network group map contains an invalid network address: \" + strNetworkAddress);\n\n                    return new Tuple<NetworkAddress, string>(networkAddress, jsonGroupName.GetString());\n                });\n\n                _groups = jsonConfig.ReadArrayAsMap(\"groups\", delegate (JsonElement jsonGroup)\n                {\n                    Group group = new Group(jsonGroup);\n                    return new Tuple<string, Group>(group.Name, group);\n                });\n\n                break;\n            }\n            while (true);\n        }\n\n        public Task<DnsDatagram> PostProcessAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, DnsDatagram response)\n        {\n            if (!_enableAddressTranslation)","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/Apps/SplitHorizonApp/AddressTranslation.cs#L179-L215","documentation":"The SplitHorizonApp builds a map from network addresses (CIDR strings) to group names via the 'networkGroupMap' config key. Each key is parsed with NetworkAddress.TryParse; if a key is not a valid network/CIDR expression this InvalidOperationException is thrown. NetworkAddress expects a well-formed IP prefix like '10.0.0.0/8' or 'fe80::/64'.","triggerScenarios":"The 'networkGroupMap' object in config contains a key that NetworkAddress.TryParse rejects: a bare hostname, a typoed IP, a missing prefix length, an out-of-range octet, or an invalid CIDR. The delegate throws during ReadObjectAsMap.","commonSituations":"Editing dnsApp.config and entering '10.0.0.1' (host, no /32), '192.168.1' (truncated), '10.x.0.0/8' (non-numeric), or a hostname like 'lan-net' as a networkGroupMap key.","solutions":["Replace the offending key with a valid CIDR network, e.g. '10.0.0.0/8' or '192.168.0.0/16'.","Use full prefix-length notation even for single hosts ('203.0.113.5/32', '::1/128').","Validate each key with System.Net.IPNetwork or IPAddress.TryParse before saving."],"exampleFix":"// before\n\"networkGroupMap\": {\n  \"10.0.0.1\": \"local1\",\n  \"lan-net\": \"local2\"\n}\n\n// after\n\"networkGroupMap\": {\n  \"10.0.0.0/8\": \"local1\",\n  \"192.168.0.0/16\": \"local2\"\n}","handlingStrategy":"validation","validationCode":"// Validate each networkGroupMap key before writing config\nusing System.Net;\n\nstatic bool IsValidNetworkAddress(string s)\n{\n    // NetworkAddress expects CIDR; mirror with IPNetwork parse\n    if (!s.Contains('/'))\n        return IPAddress.TryParse(s, out _); // bare host only if you intend /32 or /128\n    var parts = s.Split('/');\n    return IPAddress.TryParse(parts[0], out var ip)\n        && int.TryParse(parts[1], out var pl)\n        && pl >= 0\n        && pl <= (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 ? 128 : 32);\n}\n\nforeach (var key in networkGroupMap.Keys)\n    if (!IsValidNetworkAddress(key))\n        throw new InvalidOperationException($\"Invalid network address: {key}\");","typeGuard":null,"tryCatchPattern":"try\n{\n    // load SplitHorizonApp config\n}\ncatch (InvalidOperationException ex) when (ex.Message.StartsWith(\"Network group map contains an invalid network address\"))\n{\n    // log offending config, surface to operator, keep previous config\n}","preventionTips":["Always use CIDR notation with explicit prefix lengths in networkGroupMap.","Validate keys with IPNetwork.TryParse before deploying config.","Keep an example config with valid CIDR entries for reference."],"tags":["splithorizon","config","networking","cidr","validation"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}