diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index dc324cd5667..f43bf2be45d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ on:
jobs:
release:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v3
diff --git a/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs b/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs
index aa71de9ad74..064d49ef456 100644
--- a/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs
+++ b/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs
@@ -321,6 +321,11 @@ public static class Validation
/// The introspection is not allowed for the current request
///
public const string IntrospectionNotAllowed = "HC0046";
+
+ ///
+ /// The maximum allowed introspection depth was exceeded.
+ ///
+ public const string MaxIntrospectionDepthOverflow = "HC0086";
}
///
diff --git a/src/HotChocolate/Core/src/Abstractions/packages.lock.json b/src/HotChocolate/Core/src/Abstractions/packages.lock.json
index 28a7c3a6941..9bce93705bc 100644
--- a/src/HotChocolate/Core/src/Abstractions/packages.lock.json
+++ b/src/HotChocolate/Core/src/Abstractions/packages.lock.json
@@ -284,9 +284,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Core/src/Types.Shared/packages.lock.json b/src/HotChocolate/Core/src/Types.Shared/packages.lock.json
index bd23a6b2c1b..37244c9fc4c 100644
--- a/src/HotChocolate/Core/src/Types.Shared/packages.lock.json
+++ b/src/HotChocolate/Core/src/Types.Shared/packages.lock.json
@@ -158,9 +158,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs b/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs
new file mode 100644
index 00000000000..2717b7cc7bd
--- /dev/null
+++ b/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs
@@ -0,0 +1,27 @@
+namespace HotChocolate.Validation;
+
+internal sealed class CoordinateLimit
+{
+ public ushort MaxAllowed { get; private set; }
+
+ public ushort Count { get; private set; }
+
+ public bool Add()
+ {
+ if (Count < MaxAllowed)
+ {
+ Count++;
+ return true;
+ }
+
+ return false;
+ }
+
+ public void Remove() => Count--;
+
+ public void Reset(ushort maxAllowed)
+ {
+ MaxAllowed = maxAllowed;
+ Count = 0;
+ }
+}
diff --git a/src/HotChocolate/Core/src/Validation/DocumentValidator.cs b/src/HotChocolate/Core/src/Validation/DocumentValidator.cs
index 31b4b57412d..7306e1dbabf 100644
--- a/src/HotChocolate/Core/src/Validation/DocumentValidator.cs
+++ b/src/HotChocolate/Core/src/Validation/DocumentValidator.cs
@@ -110,6 +110,11 @@ public ValueTask ValidateAsync(
for (var i = 0; i < length; i++)
{
Unsafe.Add(ref start, i).Validate(context, document);
+
+ if (context.FatalErrorDetected)
+ {
+ break;
+ }
}
if (_aggregators.Length == 0)
diff --git a/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs b/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs
index 084655c6c9f..fe5b2bd3b27 100644
--- a/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs
+++ b/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs
@@ -98,6 +98,8 @@ public IOutputType NonNullString
public bool UnexpectedErrorsDetected { get; set; }
+ public bool FatalErrorDetected { get; set; }
+
public int Count { get; set; }
public int Max { get; set; }
@@ -112,6 +114,8 @@ public IOutputType NonNullString
public HashSet ProcessedFieldPairs { get; } = [];
+ public FieldDepthCycleTracker FieldDepth { get; } = new();
+
public IList RentFieldInfoList()
{
var buffer = _buffers.Peek();
@@ -168,7 +172,9 @@ public void Clear()
CurrentFieldPairs.Clear();
NextFieldPairs.Clear();
ProcessedFieldPairs.Clear();
+ FieldDepth.Reset();
UnexpectedErrorsDetected = false;
+ FatalErrorDetected = false;
Count = 0;
Max = 0;
Allowed = 0;
diff --git a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs
index f1534b08680..c5a552cd0bd 100644
--- a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs
+++ b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs
@@ -725,4 +725,18 @@ public static IError StreamOnNonListField(
.SpecifiedBy("sec-Stream-Directives-Are-Used-On-List-Fields")
.SetPath(context.CreateErrorPath())
.Build();
+
+ public static void ReportMaxIntrospectionDepthOverflow(
+ this IDocumentValidatorContext context,
+ ISyntaxNode selection)
+ {
+ context.FatalErrorDetected = true;
+ context.ReportError(
+ ErrorBuilder.New()
+ .SetMessage("Maximum allowed introspection depth exceeded.")
+ .SetCode(ErrorCodes.Validation.MaxIntrospectionDepthOverflow)
+ .SetSyntaxNode(selection)
+ .SetPath(context.CreateErrorPath())
+ .Build());
+ }
}
diff --git a/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs b/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs
index 97f5b897caf..e6ffc78c31a 100644
--- a/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs
+++ b/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs
@@ -342,4 +342,11 @@ public static IValidationBuilder AddMaxExecutionDepthRule(
public static IValidationBuilder AddIntrospectionAllowedRule(
this IValidationBuilder builder) =>
builder.TryAddValidationVisitor((_, _) => new IntrospectionVisitor(), false);
+
+ ///
+ /// Adds a validation rule that restricts the depth of a GraphQL introspection request.
+ ///
+ public static IValidationBuilder AddIntrospectionDepthRule(
+ this IValidationBuilder builder)
+ => builder.TryAddValidationVisitor();
}
diff --git a/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs
index 5ab7538b971..308c8800bea 100644
--- a/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs
+++ b/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs
@@ -28,6 +28,7 @@ public static IValidationBuilder AddValidation(
var builder = new DefaultValidationBuilder(schemaName, services);
builder
+ .AddIntrospectionDepthRule()
.AddDocumentRules()
.AddOperationRules()
.AddFieldRules()
diff --git a/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs b/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs
new file mode 100644
index 00000000000..f0321bb1b7f
--- /dev/null
+++ b/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs
@@ -0,0 +1,90 @@
+using System.Collections.Generic;
+using HotChocolate.Language;
+
+namespace HotChocolate.Validation;
+
+///
+/// Allows to track field cycle depths in a GraphQL query.
+///
+public sealed class FieldDepthCycleTracker
+{
+ private readonly Dictionary _coordinates = new();
+ private readonly List _limits = new();
+ private ushort? _defaultMaxAllowed;
+
+ ///
+ /// Adds a field coordinate to the tracker.
+ ///
+ ///
+ /// A field coordinate.
+ ///
+ ///
+ /// true if the field coordinate has not reached its cycle depth limit;
+ /// otherwise, false.
+ ///
+ public bool Add(FieldCoordinate coordinate)
+ {
+ if (_coordinates.TryGetValue(coordinate, out var limit))
+ {
+ return limit.Add();
+ }
+
+ if(_defaultMaxAllowed.HasValue)
+ {
+ _limits.TryPop(out limit);
+ limit ??= new CoordinateLimit();
+ limit.Reset(_defaultMaxAllowed.Value);
+ _coordinates.Add(coordinate, limit);
+ return limit.Add();
+ }
+
+ return true;
+ }
+
+ ///
+ /// Removes a field coordinate from the tracker.
+ ///
+ ///
+ /// A field coordinate.
+ ///
+ public void Remove(FieldCoordinate coordinate)
+ {
+ if (_coordinates.TryGetValue(coordinate, out var limit))
+ {
+ limit.Remove();
+ }
+ }
+
+ ///
+ /// Initializes the field depth tracker with the specified limits.
+ ///
+ ///
+ /// A collection of field coordinates and their cycle depth limits.
+ ///
+ ///
+ /// The default cycle depth limit for coordinates that were not explicitly defined.
+ ///
+ public void Initialize(
+ IEnumerable<(FieldCoordinate Coordinate, ushort MaxAllowed)> limits,
+ ushort? defaultMaxAllowed = null)
+ {
+ foreach (var (coordinate, maxAllowed) in limits)
+ {
+ _limits.TryPop(out var limit);
+ limit ??= new CoordinateLimit();
+ limit.Reset(maxAllowed);
+ _coordinates.Add(coordinate, limit);
+ }
+
+ _defaultMaxAllowed = defaultMaxAllowed;
+ }
+
+ ///
+ /// Resets the field depth tracker.
+ ///
+ public void Reset()
+ {
+ _limits.AddRange(_coordinates.Values);
+ _coordinates.Clear();
+ }
+}
diff --git a/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs b/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs
index ec0062cc053..2f55e796d96 100644
--- a/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs
+++ b/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs
@@ -155,6 +155,11 @@ public interface IDocumentValidatorContext : ISyntaxVisitorContext
///
bool UnexpectedErrorsDetected { get; set; }
+ ///
+ /// Defines that a fatal error was detected and that the analyzer will be aborted.
+ ///
+ bool FatalErrorDetected { get; set; }
+
///
/// A map to store arbitrary visitor data.
///
@@ -175,6 +180,11 @@ public interface IDocumentValidatorContext : ISyntaxVisitorContext
///
HashSet ProcessedFieldPairs { get; }
+ ///
+ /// Gets the field depth cycle tracker.
+ ///
+ FieldDepthCycleTracker FieldDepth { get; }
+
///
/// Rents a list of field infos.
///
diff --git a/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs b/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs
new file mode 100644
index 00000000000..2dd1913b501
--- /dev/null
+++ b/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs
@@ -0,0 +1,77 @@
+using HotChocolate.Language;
+using HotChocolate.Language.Visitors;
+using HotChocolate.Types;
+using HotChocolate.Types.Introspection;
+using HotChocolate.Utilities;
+
+namespace HotChocolate.Validation.Rules;
+
+///
+/// This rules ensures that recursive introspection fields cannot be used
+/// to create endless cycles.
+///
+internal sealed class IntrospectionDepthVisitor : TypeDocumentValidatorVisitor
+{
+ private readonly (FieldCoordinate Coordinate, ushort MaxAllowed)[] _limits =
+ [
+ (new FieldCoordinate("__Type", "fields"), 1),
+ (new FieldCoordinate("__Type", "inputFields"), 1),
+ (new FieldCoordinate("__Type", "interfaces"), 1),
+ (new FieldCoordinate("__Type", "possibleTypes"), 1),
+ (new FieldCoordinate("__Type", "ofType"), 8),
+ ];
+
+ protected override ISyntaxVisitorAction Enter(
+ DocumentNode node,
+ IDocumentValidatorContext context)
+ {
+ context.FieldDepth.Initialize(_limits);
+ return base.Enter(node, context);
+ }
+
+ protected override ISyntaxVisitorAction Enter(
+ FieldNode node,
+ IDocumentValidatorContext context)
+ {
+ if (IntrospectionFields.TypeName.EqualsOrdinal(node.Name.Value))
+ {
+ return Skip;
+ }
+
+ if (context.Types.TryPeek(out var type)
+ && type.NamedType() is IComplexOutputType ot
+ && ot.Fields.TryGetField(node.Name.Value, out var of))
+ {
+ // we are only interested in fields if the root field is either
+ // __type or __schema.
+ if (context.OutputFields.Count == 0
+ && !of.IsIntrospectionField)
+ {
+ return Skip;
+ }
+
+ if (!context.FieldDepth.Add(of.Coordinate))
+ {
+ context.ReportMaxIntrospectionDepthOverflow(node);
+ return Break;
+ }
+
+ context.OutputFields.Push(of);
+ context.Types.Push(of.Type);
+ return Continue;
+ }
+
+ context.UnexpectedErrorsDetected = true;
+ return Skip;
+ }
+
+ protected override ISyntaxVisitorAction Leave(
+ FieldNode node,
+ IDocumentValidatorContext context)
+ {
+ context.FieldDepth.Remove(context.OutputFields.Peek().Coordinate);
+ context.Types.Pop();
+ context.OutputFields.Pop();
+ return Continue;
+ }
+}
diff --git a/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs b/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs
index 348b66acf71..706f5ee8219 100644
--- a/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs
+++ b/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs
@@ -865,6 +865,12 @@ public async Task Produce_Many_Errors_50000_query()
await ExpectErrors(FileResource.Open("50000_query.graphql"));
}
+ [Fact]
+ public async Task Introspection_Cycle_Detected()
+ {
+ await ExpectErrors(FileResource.Open("introspection_with_cycle.graphql"));
+ }
+
private Task ExpectValid(string sourceText) => ExpectValid(null, null, sourceText);
private async Task ExpectValid(ISchema schema, IDocumentValidator validator, string sourceText)
diff --git a/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql b/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql
new file mode 100644
index 00000000000..ac0a3e54237
--- /dev/null
+++ b/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql
@@ -0,0 +1,93 @@
+query IntrospectionQuery {
+ __schema {
+ queryType {
+ name
+ }
+ mutationType {
+ name
+ }
+ types {
+ ... FullType
+ }
+ directives {
+ name
+ description
+ args {
+ ... InputValue
+ }
+ onOperation
+ onFragment
+ onField
+ }
+ }
+}
+
+fragment FullType on __Type {
+ kind
+ name
+ description
+ fields(includeDeprecated: true) {
+ name
+ description
+ args {
+ ... InputValue
+ }
+ type {
+ ... TypeRef
+ fields {
+ name
+ }
+ }
+ isDeprecated
+ deprecationReason
+ }
+ inputFields {
+ ... InputValue
+ }
+ interfaces {
+ ... TypeRef
+ }
+ enumValues(includeDeprecated: true) {
+ name
+ description
+ isDeprecated
+ deprecationReason
+ }
+ possibleTypes {
+ ... TypeRef
+ }
+}
+
+fragment InputValue on __InputValue {
+ name
+ description
+ type {
+ ... TypeRef
+ }
+ defaultValue
+}
+
+fragment TypeRef on __Type {
+ kind
+ name
+ ofType {
+ kind
+ name
+ ofType {
+ kind
+ name
+ ofType {
+ kind
+ name
+ ofType {
+ kind
+ name
+ ofType {
+ kind
+ name
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap b/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap
new file mode 100644
index 00000000000..66ab176ff48
--- /dev/null
+++ b/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap
@@ -0,0 +1,94 @@
+[
+ {
+ "Message": "Maximum allowed introspection depth exceeded.",
+ "Code": "HC0086",
+ "Path": {
+ "Name": "type",
+ "Parent": {
+ "Name": "fields",
+ "Parent": {
+ "Name": "types",
+ "Parent": {
+ "Name": "__schema",
+ "Parent": {
+ "Parent": null,
+ "Length": 0,
+ "IsRoot": true
+ },
+ "Length": 1,
+ "IsRoot": false
+ },
+ "Length": 2,
+ "IsRoot": false
+ },
+ "Length": 3,
+ "IsRoot": false
+ },
+ "Length": 4,
+ "IsRoot": false
+ },
+ "Locations": null,
+ "Extensions": {
+ "code": "HC0086"
+ },
+ "Exception": null,
+ "SyntaxNode": {
+ "Kind": "Field",
+ "Alias": null,
+ "Arguments": [],
+ "Required": null,
+ "SelectionSet": {
+ "Kind": "SelectionSet",
+ "Location": {
+ "Start": 497,
+ "End": 525,
+ "Line": 37,
+ "Column": 14
+ },
+ "Selections": [
+ {
+ "Kind": "Field",
+ "Alias": null,
+ "Arguments": [],
+ "Required": null,
+ "SelectionSet": null,
+ "Location": {
+ "Start": 507,
+ "End": 519,
+ "Line": 38,
+ "Column": 9
+ },
+ "Name": {
+ "Kind": "Name",
+ "Location": {
+ "Start": 507,
+ "End": 519,
+ "Line": 38,
+ "Column": 9
+ },
+ "Value": "name"
+ },
+ "Directives": []
+ }
+ ]
+ },
+ "Location": {
+ "Start": 490,
+ "End": 525,
+ "Line": 37,
+ "Column": 7
+ },
+ "Name": {
+ "Kind": "Name",
+ "Location": {
+ "Start": 490,
+ "End": 498,
+ "Line": 37,
+ "Column": 7
+ },
+ "Value": "fields"
+ },
+ "Directives": []
+ }
+ }
+]
\ No newline at end of file
diff --git a/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json b/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json
index d462e54c0f8..0f42f4ca6a8 100644
--- a/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json
+++ b/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json
@@ -73,9 +73,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json b/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json
index 7f61364a5ea..6d8073fbb3d 100644
--- a/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json
+++ b/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json
@@ -481,9 +481,9 @@
},
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Fusion/src/Composition/packages.lock.json b/src/HotChocolate/Fusion/src/Composition/packages.lock.json
index 0f73354e50f..6b4fa729109 100644
--- a/src/HotChocolate/Fusion/src/Composition/packages.lock.json
+++ b/src/HotChocolate/Fusion/src/Composition/packages.lock.json
@@ -100,9 +100,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json b/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json
index 3cb41bc67ec..fb8d1e4c80d 100644
--- a/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json
+++ b/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json
@@ -149,9 +149,9 @@
},
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json b/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json
index bd23a6b2c1b..37244c9fc4c 100644
--- a/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json
+++ b/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json
@@ -158,9 +158,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json b/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json
index bd23a6b2c1b..37244c9fc4c 100644
--- a/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json
+++ b/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json
@@ -158,9 +158,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Language/src/Language.Web/packages.lock.json b/src/HotChocolate/Language/src/Language.Web/packages.lock.json
index 546c954e862..2ea5af42b13 100644
--- a/src/HotChocolate/Language/src/Language.Web/packages.lock.json
+++ b/src/HotChocolate/Language/src/Language.Web/packages.lock.json
@@ -176,9 +176,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Language/src/Language/ListExtensions.cs b/src/HotChocolate/Language/src/Language/ListExtensions.cs
index 10977318852..4706cf0916d 100644
--- a/src/HotChocolate/Language/src/Language/ListExtensions.cs
+++ b/src/HotChocolate/Language/src/Language/ListExtensions.cs
@@ -17,7 +17,7 @@ public static T Pop(this IList list)
return p;
}
- public static bool TryPop(this IList list, [NotNullWhen(true)] out T item)
+ public static bool TryPop(this IList list, [MaybeNullWhen(false)] out T item)
{
if (list.Count > 0)
{
diff --git a/src/HotChocolate/Language/src/Language/packages.lock.json b/src/HotChocolate/Language/src/Language/packages.lock.json
index 12493afaaab..59baf299330 100644
--- a/src/HotChocolate/Language/src/Language/packages.lock.json
+++ b/src/HotChocolate/Language/src/Language/packages.lock.json
@@ -212,9 +212,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json b/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json
index 02864153fab..8755f1ddfb3 100644
--- a/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json
+++ b/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json
@@ -79,9 +79,9 @@
"net8.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/src/HotChocolate/Utilities/src/Utilities/packages.lock.json b/src/HotChocolate/Utilities/src/Utilities/packages.lock.json
index aab22b3b5e9..c8e80b30fdc 100644
--- a/src/HotChocolate/Utilities/src/Utilities/packages.lock.json
+++ b/src/HotChocolate/Utilities/src/Utilities/packages.lock.json
@@ -236,9 +236,9 @@
},
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[8.0.7, )",
- "resolved": "8.0.7",
- "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ=="
+ "requested": "[8.0.8, )",
+ "resolved": "8.0.8",
+ "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",