{"record":{"id":"540c1635e488b6cf","repo":"grpc/grpc-go","slug":"fault-nil-config-provided","errorCode":null,"errorMessage":"fault: nil config provided","messagePattern":"fault: nil config provided","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/fault/fault.go","lineNumber":120,"sourceCode":"}\n\nfunc (builder) IsTerminal() bool {\n\treturn false\n}\n\nfunc (builder) BuildClientFilter(httpfilter.ClientFilterOptions) httpfilter.ClientFilter {\n\treturn clientFilter{}\n}\n\nvar _ httpfilter.ClientFilterBuilder = builder{}\n\ntype clientFilter struct{}\n\nfunc (clientFilter) Close() {}\n\nfunc (clientFilter) BuildClientInterceptor(cfg, override httpfilter.FilterConfig) (httpfilter.ClientInterceptor, error) {\n\tif cfg == nil {\n\t\treturn nil, fmt.Errorf(\"fault: nil config provided\")\n\t}\n\n\tc, ok := cfg.(config)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"fault: incorrect config type provided (%T): %v\", cfg, cfg)\n\t}\n\n\tif override != nil {\n\t\t// override completely replaces the listener configuration; but we\n\t\t// still validate the listener config type.\n\t\tc, ok = override.(config)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"fault: incorrect override config type provided (%T): %v\", override, override)\n\t\t}\n\t}\n\n\ticfg := c.config\n\tif (icfg.GetMaxActiveFaults() != nil && icfg.GetMaxActiveFaults().GetValue() == 0) ||","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/fault/fault.go#L102-L138","documentation":"BuildClientInterceptor rejects a nil base config (fault.go:119). The interceptor cannot be built without fault settings, so nil is a hard error here (unlike a config that simply disables faults, which returns a nil interceptor cleanly).","triggerScenarios":"BuildClientInterceptor is called with cfg == nil.","commonSituations":"Filter chain wired with the fault builder but the listener-level config object was never created; programmatic misuse passing nil; a routing path that drops the parsed config.","solutions":["Ensure the listener-level fault config produced by ParseFilterConfig is passed through to BuildClientInterceptor.","If fault injection is disabled, pass a real config that yields a nil interceptor (max_active_faults==0 or no delay and no abort) rather than nil itself.","Add an assertion in your filter wiring that cfg is non-nil before building."],"exampleFix":"// before\nic, err := cf.BuildClientInterceptor(nil, override)\n\n// after: pass the parsed config (use a disabling config rather than nil)\nic, err := cf.BuildClientInterceptor(parsedCfg, override)","handlingStrategy":"validation","validationCode":"if cfg == nil {\n    return nil, errors.New(\"refusing to build fault interceptor with nil config\")\n}","typeGuard":null,"tryCatchPattern":"ic, err := cf.BuildClientInterceptor(cfg, override)\nif err != nil {\n    return err\n}","preventionTips":["Pass the parsed fault config through to BuildClientInterceptor; never nil.","To disable faults, use a config with max_active_faults==0 instead of nil.","Assert non-nil in filter wiring."],"tags":["fault-injection","grpc","xds","config","go"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}