-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Null Reference Error when preparing aruments #5292
Copy link
Copy link
Closed
Description
Describe the bug
InputObject#validate_for generates a NoMethodError: undefined method `[]' for nil because it is being passed a nil context (https://github.com/rmosolgo/graphql-ruby/blob/v2.4.15/lib/graphql/schema/input_object.rb#L109). Walking back up the call stack shows that:
- Argument#recursively_prepare_input_argument (https://github.com/rmosolgo/graphql-ruby/blob/v2.4.15/lib/graphql/schema/argument.rb#L410) passes the context unchecked
- Argument#prepare_value passes the context which may default to nil (https://github.com/rmosolgo/graphql-ruby/blob/v2.4.15/lib/graphql/schema/argument.rb#L220)
- InputObject#initialize specifically calls Argument#prepare_value when context is nil https://github.com/rmosolgo/graphql-ruby/blob/v2.4.15/lib/graphql/schema/input_object.rb#L41
Versions
graphql version: 2.4.15
rails (or other framework): 7.2.2.1
GraphQL schema
Nothing relevant
GraphQL query
Nothing relevant
Steps to reproduce
Steps to reproduce the behavior
Expected behavior
The code does not throw a no method error on nil when preparing arguments
Actual behavior
The code threw a no method error on nil when preparing arguments
Click to view exception backtrace
["graphql-2.4.15/lib/graphql/schema/input_object.rb:109:in `validate_for'",
"graphql-2.4.15/lib/graphql/schema/argument.rb:410:in `recursively_prepare_input_object'",
"graphql-2.4.15/lib/graphql/schema/argument.rb:408:in `block in recursively_prepare_input_object'",
"graphql-2.4.15/lib/graphql/schema/argument.rb:408:in `map'",
"graphql-2.4.15/lib/graphql/schema/argument.rb:408:in `recursively_prepare_input_object'",
"graphql-2.4.15/lib/graphql/schema/argument.rb:220:in `prepare_value'",
"graphql-2.4.15/lib/graphql/schema/input_object.rb:41:in `block in initialize'",
"graphql-2.4.15/lib/graphql/schema/input_object.rb:35:in `each'",
"graphql-2.4.15/lib/graphql/schema/input_object.rb:35:in `initialize'",
"graphql-2.4.15/lib/graphql/schema/input_object.rb:235:in `new'",
"graphql-2.4.15/lib/graphql/schema/input_object.rb:235:in `block in coerce_input'",
"graphql-2.4.15/lib/graphql/execution/interpreter/runtime.rb:777:in `minimal_after_lazy'",
"graphql-2.4.15/lib/graphql/execution/interpreter/runtime.rb:774:in `block in minimal_after_lazy'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:30:in `value'",
"graphql-2.4.15/lib/graphql/schema.rb:1628:in `public_send'",
"graphql-2.4.15/lib/graphql/schema.rb:1628:in `sync_lazy'",
"graphql-2.4.15/lib/graphql/execution/interpreter/runtime.rb:772:in `block in minimal_after_lazy'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:30:in `value'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:59:in `block (2 levels) in all'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:59:in `map'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:59:in `block in all'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:30:in `value'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:51:in `block in then'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:30:in `value'",
"graphql-2.4.15/lib/graphql/schema.rb:1628:in `public_send'",
"graphql-2.4.15/lib/graphql/schema.rb:1628:in `sync_lazy'",
"graphql-2.4.15/lib/graphql/execution/interpreter/runtime.rb:807:in `block (2 levels) in after_lazy'",
"graphql-2.4.15/lib/graphql/tracing/trace.rb:111:in `execute_field_lazy'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:118:in `block in execute_field_lazy'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:104:in `block in execute_field_span'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `block in measure'",
"datadog-2.12.2/lib/datadog/tracing/span_operation.rb:152:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:411:in `start_span'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:166:in `block in trace'",
"datadog-2.12.2/lib/datadog/tracing/context.rb:45:in `activate!'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:165:in `trace'",
"datadog-2.12.2/lib/datadog/tracing.rb:30:in `trace'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:96:in `execute_field_span'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:117:in `execute_field_lazy'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `block in execute_field_lazy'",
"activesupport-7.2.2.1/lib/active_support/notifications.rb:212:in `instrument'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `execute_field_lazy'",
"graphql-2.4.15/lib/graphql/execution/interpreter/runtime.rb:806:in `block in after_lazy'",
"graphql-2.4.15/lib/graphql/execution/lazy.rb:30:in `value'",
"graphql-2.4.15/lib/graphql/execution/interpreter/resolve.rb:27:in `each'",
"graphql-2.4.15/lib/graphql/execution/interpreter/resolve.rb:27:in `block in resolve_each_depth'",
"graphql-2.4.15/lib/graphql/dataloader/null_dataloader.rb:19:in `append_job'",
"graphql-2.4.15/lib/graphql/execution/interpreter/resolve.rb:26:in `resolve_each_depth'",
"graphql-2.4.15/lib/graphql/execution/interpreter.rb:104:in `block (3 levels) in run_all'",
"graphql-2.4.15/lib/graphql/tracing/trace.rb:89:in `execute_query_lazy'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:51:in `block in execute_query_lazy'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `block in measure'",
"datadog-2.12.2/lib/datadog/tracing/span_operation.rb:152:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:411:in `start_span'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:166:in `block in trace'",
"datadog-2.12.2/lib/datadog/tracing/context.rb:45:in `activate!'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:165:in `trace'",
"datadog-2.12.2/lib/datadog/tracing.rb:30:in `trace'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:43:in `execute_query_lazy'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `block in execute_query_lazy'",
"activesupport-7.2.2.1/lib/active_support/notifications.rb:212:in `instrument'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `execute_query_lazy'",
"graphql-2.4.15/lib/graphql/execution/interpreter.rb:103:in `block (2 levels) in run_all'",
"graphql-2.4.15/lib/graphql/dataloader/null_dataloader.rb:19:in `append_job'",
"graphql-2.4.15/lib/graphql/execution/interpreter.rb:94:in `block in run_all'",
"graphql-2.4.15/lib/graphql/tracing/trace.rb:81:in `execute_multiplex'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:63:in `block in execute_multiplex'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `block in measure'",
"datadog-2.12.2/lib/datadog/tracing/span_operation.rb:152:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/trace_operation.rb:226:in `measure'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:411:in `start_span'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:166:in `block in trace'",
"datadog-2.12.2/lib/datadog/tracing/context.rb:45:in `activate!'",
"datadog-2.12.2/lib/datadog/tracing/tracer.rb:165:in `trace'",
"datadog-2.12.2/lib/datadog/tracing.rb:30:in `trace'",
"graphql-2.4.15/lib/graphql/tracing/data_dog_trace.rb:43:in `execute_multiplex'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `block in execute_multiplex'",
"activesupport-7.2.2.1/lib/active_support/notifications.rb:210:in `block in instrument'",
"activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'",
"activesupport-7.2.2.1/lib/active_support/notifications.rb:210:in `instrument'",
"graphql-2.4.15/lib/graphql/tracing/notifications_trace.rb:38:in `execute_multiplex'",
"app/graphql/tracing/actual_complexity.rb:19:in `execute_multiplex'",
"graphql-batch-0.6.0/lib/graphql/batch/setup_multiplex.rb:24:in `execute_multiplex'",
"graphql-2.4.15/lib/graphql/execution/interpreter.rb:42:in `run_all'",
"graphql-2.4.15/lib/graphql/schema.rb:1573:in `multiplex'",
"graphql-2.4.15/lib/graphql/schema.rb:1549:in `execute'",
]```
</details>
**Additional context**
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels