Skip to content

Commit aeb0008

Browse files
authored
fix: nil pointer on operation rule valid argument (#844)
## Background Addressing the following issues: * resolve a panic case on `operation_rule_valid_arguments.go` * resolve issue extracting operation name on `operation_rule_values.go` * reorder validator order for a more logical validation ### An example query to reproduce panic ```graphql query first { characters(size: $size) { collection { id } } } ``` ``` runtime error: index out of range [-1] ```
2 parents 3f21de7 + f2b44e2 commit aeb0008

File tree

6 files changed

+16
-11
lines changed

6 files changed

+16
-11
lines changed

pkg/astvalidation/operation_rule_valid_arguments.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ func (v *validArgumentsVisitor) validateIfValueSatisfiesInputFieldDefinition(val
7171
return
7272
}
7373

74+
if operationTypeRef == ast.InvalidRef {
75+
// variable is not defined on operation
76+
return
77+
}
78+
7479
printedValue, err := v.operation.PrintValueBytes(value, nil)
7580
if v.HandleInternalErr(err) {
7681
return

pkg/astvalidation/operation_rule_values.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (v *valuesVisitor) EnterArgument(ref int) {
5353
variableName := v.operation.VariableValueNameBytes(value.Ref)
5454
variableDefinition, exists := v.operation.VariableDefinitionByNameAndOperation(v.Ancestors[0].Ref, variableName)
5555
if !exists {
56-
operationName := v.operation.NodeNameBytes(v.Ancestors[0])
56+
operationName := v.operation.OperationDefinitionNameBytes(v.Ancestors[0].Ref)
5757
v.StopWithExternalErr(operationreport.ErrVariableNotDefinedOnOperation(variableName, operationName))
5858
return
5959
}

pkg/astvalidation/operation_validation.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ func DefaultOperationValidator() *OperationValidator {
1414
walker: astvisitor.NewWalker(48),
1515
}
1616

17+
validator.RegisterRule(AllVariablesUsed())
18+
validator.RegisterRule(AllVariableUsesDefined())
1719
validator.RegisterRule(DocumentContainsExecutableOperation())
1820
validator.RegisterRule(OperationNameUniqueness())
1921
validator.RegisterRule(LoneAnonymousOperation())
@@ -31,8 +33,6 @@ func DefaultOperationValidator() *OperationValidator {
3133
validator.RegisterRule(VariableUniqueness())
3234
validator.RegisterRule(DirectivesAreUniquePerLocation())
3335
validator.RegisterRule(VariablesAreInputTypes())
34-
validator.RegisterRule(AllVariableUsesDefined())
35-
validator.RegisterRule(AllVariablesUsed())
3636

3737
return &validator
3838
}

v2/pkg/astvalidation/operation_rule_valid_arguments.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ func (v *validArgumentsVisitor) validateIfValueSatisfiesInputFieldDefinition(val
7171
return
7272
}
7373

74+
if operationTypeRef == ast.InvalidRef {
75+
// variable is not defined
76+
return
77+
}
78+
7479
printedValue, err := v.operation.PrintValueBytes(value, nil)
7580
if v.HandleInternalErr(err) {
7681
return
@@ -82,11 +87,6 @@ func (v *validArgumentsVisitor) validateIfValueSatisfiesInputFieldDefinition(val
8287
return
8388
}
8489

85-
if operationTypeRef == ast.InvalidRef {
86-
// variable is not defined
87-
return
88-
}
89-
9090
actualTypeName, err := v.operation.PrintTypeBytes(operationTypeRef, nil)
9191
if v.HandleInternalErr(err) {
9292
return

v2/pkg/astvalidation/operation_rule_values.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (v *valuesVisitor) EnterArgument(ref int) {
5353
variableName := v.operation.VariableValueNameBytes(value.Ref)
5454
variableDefinition, exists := v.operation.VariableDefinitionByNameAndOperation(v.Ancestors[0].Ref, variableName)
5555
if !exists {
56-
operationName := v.operation.NodeNameBytes(v.Ancestors[0])
56+
operationName := v.operation.OperationDefinitionNameBytes(v.Ancestors[0].Ref)
5757
v.StopWithExternalErr(operationreport.ErrVariableNotDefinedOnOperation(variableName, operationName))
5858
return
5959
}

v2/pkg/astvalidation/operation_validation.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ func DefaultOperationValidator() *OperationValidator {
1414
walker: astvisitor.NewWalker(48),
1515
}
1616

17+
validator.RegisterRule(AllVariablesUsed())
18+
validator.RegisterRule(AllVariableUsesDefined())
1719
validator.RegisterRule(DocumentContainsExecutableOperation())
1820
validator.RegisterRule(OperationNameUniqueness())
1921
validator.RegisterRule(LoneAnonymousOperation())
@@ -31,8 +33,6 @@ func DefaultOperationValidator() *OperationValidator {
3133
validator.RegisterRule(VariableUniqueness())
3234
validator.RegisterRule(DirectivesAreUniquePerLocation())
3335
validator.RegisterRule(VariablesAreInputTypes())
34-
validator.RegisterRule(AllVariableUsesDefined())
35-
validator.RegisterRule(AllVariablesUsed())
3636

3737
return &validator
3838
}

0 commit comments

Comments
 (0)