{"record":{"id":"092a0d60418031ae","repo":"grpc/grpc-go","slug":"fault-nil-configuration-message-provided","errorCode":null,"errorMessage":"fault: nil configuration message provided","messagePattern":"fault: nil configuration message provided","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/fault/fault.go","lineNumber":83,"sourceCode":"\thttpfilter.Register(builder{})\n}\n\ntype builder struct {\n}\n\ntype config struct {\n\thttpfilter.FilterConfig\n\tconfig *fpb.HTTPFault\n}\n\nfunc (builder) TypeURLs() []string {\n\treturn []string{\"type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault\"}\n}\n\n// Parsing is the same for the base config and the override config.\nfunc parseConfig(cfg proto.Message) (httpfilter.FilterConfig, error) {\n\tif cfg == nil {\n\t\treturn nil, fmt.Errorf(\"fault: nil configuration message provided\")\n\t}\n\tm, ok := cfg.(*anypb.Any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"fault: error parsing config %v: unknown type %T\", cfg, cfg)\n\t}\n\tmsg := new(fpb.HTTPFault)\n\tif err := m.UnmarshalTo(msg); err != nil {\n\t\treturn nil, fmt.Errorf(\"fault: error parsing config %v: %v\", cfg, err)\n\t}\n\treturn config{config: msg}, nil\n}\n\nfunc (builder) ParseFilterConfig(cfg proto.Message) (httpfilter.FilterConfig, error) {\n\treturn parseConfig(cfg)\n}\n\nfunc (builder) ParseFilterConfigOverride(override proto.Message) (httpfilter.FilterConfig, error) {\n\treturn parseConfig(override)","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/fault/fault.go#L65-L101","documentation":"The fault-injection HTTP filter's parseConfig rejects a nil protobuf message outright (fault.go:82). A nil config is not a meaningful fault configuration, so it is a hard error rather than a silent no-op.","triggerScenarios":"ParseFilterConfig or ParseFilterConfigOverride is invoked with a nil proto.Message for the fault filter.","commonSituations":"xDS layer forwards an empty/absent typed_struct for the fault filter; programmatic construction passing nil by mistake; a per-route override that omits the fault config.","solutions":["Ensure the xDS fault filter resource always carries a populated envoy.extensions.filters.http.fault.v3.HTTPFault message.","If fault injection should be a no-op for a route, omit the filter from the chain instead of passing nil.","Trace where nil originates (resource decoder) and guard it before calling parseConfig."],"exampleFix":"// before\nfc, err := faultBuilder.ParseFilterConfig(nil)\n\n// after: pass an actual HTTPFault wrapped in an Any\nanyMsg, _ := anypb.New(&fpb.HTTPFault{Delay: &fpb.FaultDelay{FixedDelay: durationpb.New(time.Second)}})\nfc, err := faultBuilder.ParseFilterConfig(anyMsg)","handlingStrategy":"validation","validationCode":"if cfg == nil {\n    return nil, errors.New(\"fault: refusing to build with nil config\")\n}\nfc, err := faultBuilder.ParseFilterConfig(cfg)","typeGuard":null,"tryCatchPattern":"fc, err := faultBuilder.ParseFilterConfig(cfg)\nif err != nil {\n    // handle (e.g. log and skip fault filter)\n    return err\n}","preventionTips":["Never pass nil to ParseFilterConfig; omit the filter from the chain instead.","Guard the resource decoder against emitting nil typed configs.","Unit-test config parsing with both valid and nil inputs."],"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"}