{"record":{"id":"3d7cbcacf180f7b9","repo":"crowdsecurity/crowdsec","slug":"unable-to-convert-s-to-int-w-w-3d7cbc","errorCode":null,"errorMessage":"unable to convert '%s' to int: %w: %w","messagePattern":"unable to convert '(.+?)' to int: %w: %w","errorType":"validation","errorClass":"InvalidIPOrRange","httpStatus":null,"severity":"error","filePath":"pkg/database/decisions.go","lineNumber":251,"sourceCode":"\t\tcase \"contains\":\n\t\t\tcontains, err = strconv.ParseBool(value[0])\n\t\t\tif err != nil {\n\t\t\t\treturn 0, nil, fmt.Errorf(\"invalid contains value: %w: %w\", err, InvalidFilter)\n\t\t\t}\n\t\tcase \"scopes\":\n\t\t\tdecisions = decisions.Where(decision.ScopeEQ(value[0]))\n\t\tcase \"uuid\":\n\t\t\tdecisions = decisions.Where(decision.UUIDIn(value...))\n\t\tcase \"origin\":\n\t\t\tdecisions = decisions.Where(decision.OriginEQ(value[0]))\n\t\tcase \"value\":\n\t\t\tdecisions = decisions.Where(decision.ValueEQ(value[0]))\n\t\tcase \"type\":\n\t\t\tdecisions = decisions.Where(decision.TypeEQ(value[0]))\n\t\tcase \"ip\", \"range\":\n\t\t\trng, err = csnet.NewRange(value[0])\n\t\t\tif err != nil {\n\t\t\t\treturn 0, nil, fmt.Errorf(\"unable to convert '%s' to int: %w: %w\", value[0], err, InvalidIPOrRange)\n\t\t\t}\n\t\tcase \"scenario\":\n\t\t\tdecisions = decisions.Where(decision.ScenarioEQ(value[0]))\n\t\tdefault:\n\t\t\treturn 0, nil, fmt.Errorf(\"'%s' doesn't exist: %w\", param, InvalidFilter)\n\t\t}\n\t}\n\n\tdecisions, err = decisionIPFilter(decisions, contains, rng)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\tdecisionsToDelete, err := decisions.All(ctx)\n\tif err != nil {\n\t\tc.Log.Warningf(\"ExpireDecisionsWithFilter : %s\", err)\n\t\treturn 0, nil, fmt.Errorf(\"expire decisions with provided filter: %w\", DeleteFail)\n\t}","sourceCodeStart":233,"sourceCodeEnd":269,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/database/decisions.go#L233-L269","documentation":"When the filter contains the 'ip' or 'range' key, ExpireDecisionsWithFilter parses the value into a csnet.Range via csnet.NewRange. On parse failure the error is wrapped with a misleading historical message ('unable to convert to int') plus the InvalidIPOrRange sentinel; it really means the value is not a valid IP address or CIDR range.","triggerScenarios":"Calling ExpireDecisionsWithFilter with filter keys 'ip' or 'range' whose value is not a valid IP/CIDR (e.g. \"192.168.1.300\", \"10.0.0/24\", or a hostname).","commonSituations":"Hand-typed CLI arguments with typos in the CIDR; copy-pasted values retaining prefixes like 'ip:1.2.3.4'; scripts building ranges from unvalidated user input.","solutions":["Validate the value is a correct IP or CIDR (net.ParseIP / net.ParseCIDR) before passing it","Correct the typo in the ip/range filter value (e.g. 192.168.1.0/24, not 192.168.1.300)","Check errors.Is(err, database.InvalidIPOrRange) to distinguish this from other expiry failures"],"exampleFix":"// before\nc.ExpireDecisionsWithFilter(ctx, map[string][]string{\"range\": {\"10.0.0/24\"}})\n// after\nif _, _, err := net.ParseCIDR(\"10.0.0.0/24\"); err == nil {\n    c.ExpireDecisionsWithFilter(ctx, map[string][]string{\"range\": {\"10.0.0.0/24\"}})\n}","handlingStrategy":"validation","validationCode":"func validIPOrRange(v string) bool {\n    if net.ParseIP(v) != nil { return true }\n    _, _, err := net.ParseCIDR(v)\n    return err == nil\n}","typeGuard":null,"tryCatchPattern":"err := errors.Is(err, database.InvalidIPOrRange) // classify before showing to user\nif errors.Is(err, database.InvalidIPOrRange) {\n    return status.Errorf(codes.InvalidArgument, \"invalid ip/range filter: %v\", err)\n}","preventionTips":["Validate IP/CIDR with net.ParseIP/net.ParseCIDR before calling","Reject hostnames — only literal IPs/CIDRs are accepted","Strip prefixes like 'ip:' from pasted values"],"tags":["go","network","cidr","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}