Skip to content

Commit f13f180

Browse files
committed
Fix potential ArgumentException with ConditionalWeakTable
1 parent f5d289e commit f13f180

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultRequestResponseSerializer.cs

+13-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System.Collections.Generic;
66
using System.IO;
7+
using System.Runtime.Serialization;
78
using System.Text.Json;
89
using System.Text.Json.Serialization;
910
using System.Threading;
@@ -24,6 +25,8 @@ internal sealed class DefaultRequestResponseSerializer : SystemTextJsonSerialize
2425
{
2526
private readonly IElasticsearchClientSettings _settings;
2627

28+
private readonly object _lock = new();
29+
2730
public DefaultRequestResponseSerializer(IElasticsearchClientSettings settings) :
2831
base(new DefaultRequestResponseSerializerOptionsProvider(settings))
2932
{
@@ -62,14 +65,17 @@ private void LinkSettings(IElasticsearchClientSettings settings)
6265
var options = GetJsonSerializerOptions(SerializationFormatting.None);
6366
var indentedOptions = GetJsonSerializerOptions(SerializationFormatting.Indented);
6467

65-
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
66-
{
67-
ElasticsearchClient.SettingsTable.Add(options, settings);
68-
}
69-
70-
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
68+
lock (_lock)
7169
{
72-
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
70+
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
71+
{
72+
ElasticsearchClient.SettingsTable.Add(options, settings);
73+
}
74+
75+
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
76+
{
77+
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
78+
}
7379
}
7480
}
7581
}

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultSourceSerializer.cs

+11-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ namespace Elastic.Clients.Elasticsearch.Serialization;
2121
public class DefaultSourceSerializer :
2222
SystemTextJsonSerializer
2323
{
24+
private readonly object _lock = new();
25+
2426
/// <summary>
2527
/// Constructs a new <see cref="DefaultSourceSerializer"/> instance that accepts an <see cref="Action{T}"/> that can
2628
/// be provided to customize the default <see cref="JsonSerializerOptions"/>.
@@ -43,14 +45,17 @@ private void LinkSettings(IElasticsearchClientSettings settings)
4345
var options = GetJsonSerializerOptions(SerializationFormatting.None);
4446
var indentedOptions = GetJsonSerializerOptions(SerializationFormatting.Indented);
4547

46-
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
48+
lock (_lock)
4749
{
48-
ElasticsearchClient.SettingsTable.Add(options, settings);
49-
}
50+
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
51+
{
52+
ElasticsearchClient.SettingsTable.Add(options, settings);
53+
}
5054

51-
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
52-
{
53-
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
55+
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
56+
{
57+
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
58+
}
5459
}
5560
}
5661
}

0 commit comments

Comments
 (0)