Skip to content

Commit d06249c

Browse files
authored
Fix potential ArgumentException with ConditionalWeakTable (#8444)
1 parent f5d289e commit d06249c

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

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

+19-7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ internal sealed class DefaultRequestResponseSerializer : SystemTextJsonSerialize
2424
{
2525
private readonly IElasticsearchClientSettings _settings;
2626

27+
#if !NET8_0_OR_GREATER
28+
private readonly object _lock = new();
29+
#endif
30+
2731
public DefaultRequestResponseSerializer(IElasticsearchClientSettings settings) :
2832
base(new DefaultRequestResponseSerializerOptionsProvider(settings))
2933
{
@@ -62,15 +66,23 @@ private void LinkSettings(IElasticsearchClientSettings settings)
6266
var options = GetJsonSerializerOptions(SerializationFormatting.None);
6367
var indentedOptions = GetJsonSerializerOptions(SerializationFormatting.Indented);
6468

65-
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
66-
{
67-
ElasticsearchClient.SettingsTable.Add(options, settings);
68-
}
69-
70-
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
69+
#if NET8_0_OR_GREATER
70+
ElasticsearchClient.SettingsTable.TryAdd(options, settings);
71+
ElasticsearchClient.SettingsTable.TryAdd(indentedOptions, settings);
72+
#else
73+
lock (_lock)
7174
{
72-
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
75+
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
76+
{
77+
ElasticsearchClient.SettingsTable.Add(options, settings);
78+
}
79+
80+
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
81+
{
82+
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
83+
}
7384
}
85+
#endif
7486
}
7587
}
7688

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

+18-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ namespace Elastic.Clients.Elasticsearch.Serialization;
2121
public class DefaultSourceSerializer :
2222
SystemTextJsonSerializer
2323
{
24+
#if !NET8_0_OR_GREATER
25+
private readonly object _lock = new();
26+
#endif
27+
2428
/// <summary>
2529
/// Constructs a new <see cref="DefaultSourceSerializer"/> instance that accepts an <see cref="Action{T}"/> that can
2630
/// be provided to customize the default <see cref="JsonSerializerOptions"/>.
@@ -43,15 +47,23 @@ private void LinkSettings(IElasticsearchClientSettings settings)
4347
var options = GetJsonSerializerOptions(SerializationFormatting.None);
4448
var indentedOptions = GetJsonSerializerOptions(SerializationFormatting.Indented);
4549

46-
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
50+
#if NET8_0_OR_GREATER
51+
ElasticsearchClient.SettingsTable.TryAdd(options, settings);
52+
ElasticsearchClient.SettingsTable.TryAdd(indentedOptions, settings);
53+
#else
54+
lock (_lock)
4755
{
48-
ElasticsearchClient.SettingsTable.Add(options, settings);
49-
}
56+
if (!ElasticsearchClient.SettingsTable.TryGetValue(options, out _))
57+
{
58+
ElasticsearchClient.SettingsTable.Add(options, settings);
59+
}
5060

51-
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
52-
{
53-
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
61+
if (!ElasticsearchClient.SettingsTable.TryGetValue(indentedOptions, out _))
62+
{
63+
ElasticsearchClient.SettingsTable.Add(indentedOptions, settings);
64+
}
5465
}
66+
#endif
5567
}
5668
}
5769

0 commit comments

Comments
 (0)