Skip to content

Commit 7df6c3f

Browse files
authored
Merge pull request #363 from microsoft/copilot/fix-double-free-segv-crash
Prevent concurrent fragment resolution from corrupting directive stacks
2 parents 8cb51b8 + d9b6ec7 commit 7df6c3f

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

‎src/GraphQLService.cpp‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -934,9 +934,12 @@ SelectionVisitor::SelectionVisitor(const SelectionSetParams& selectionSetParams,
934934
, _variables(variables)
935935
, _typeNames(typeNames)
936936
, _resolvers(resolvers)
937-
, _fragmentDefinitionDirectives { selectionSetParams.fragmentDefinitionDirectives }
938-
, _fragmentSpreadDirectives { selectionSetParams.fragmentSpreadDirectives }
939-
, _inlineFragmentDirectives { selectionSetParams.inlineFragmentDirectives }
937+
, _fragmentDefinitionDirectives { std::make_shared<FragmentDefinitionDirectiveStack>(
938+
*selectionSetParams.fragmentDefinitionDirectives) }
939+
, _fragmentSpreadDirectives { std::make_shared<FragmentSpreadDirectiveStack>(
940+
*selectionSetParams.fragmentSpreadDirectives) }
941+
, _inlineFragmentDirectives { std::make_shared<FragmentSpreadDirectiveStack>(
942+
*selectionSetParams.inlineFragmentDirectives) }
940943
{
941944
static const Directives s_emptyFragmentDefinitionDirectives;
942945

‎test/CoroutineTests.cpp‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ TEST_F(CoroutineCase, QueryEverythingThreaded)
287287
auto query = R"(
288288
query Everything {
289289
appointments {
290+
pageInfo {
291+
...PageInfoFields
292+
}
290293
edges {
291294
node {
292295
id
@@ -298,6 +301,9 @@ TEST_F(CoroutineCase, QueryEverythingThreaded)
298301
}
299302
}
300303
tasks {
304+
pageInfo {
305+
...PageInfoFields
306+
}
301307
edges {
302308
node {
303309
id
@@ -308,6 +314,9 @@ TEST_F(CoroutineCase, QueryEverythingThreaded)
308314
}
309315
}
310316
unreadCounts {
317+
pageInfo {
318+
...PageInfoFields
319+
}
311320
edges {
312321
node {
313322
id
@@ -317,6 +326,10 @@ TEST_F(CoroutineCase, QueryEverythingThreaded)
317326
}
318327
}
319328
}
329+
}
330+
fragment PageInfoFields on PageInfo {
331+
hasNextPage
332+
hasPreviousPage
320333
})"_graphql;
321334
response::Value variables(response::Type::Map);
322335
auto state = std::make_shared<today::RequestState>(3);

0 commit comments

Comments
 (0)