Skip to content

Commit c15455a

Browse files
authored
Force concurrent LdapConnection in new process (#41880)
* Ensure an initial non-concurrent call to OpenLDAP OpenLDAP requires a single call for initialization before any other concurrent call. This fixes asserts and segfaults we were seeing when calling OpenLDAP concurrently.
1 parent 3f30ac6 commit c15455a

File tree

14 files changed

+401
-374
lines changed

14 files changed

+401
-374
lines changed

src/libraries/Common/src/Interop/Interop.Ldap.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ internal enum LdapOption
9696
LDAP_OPT_AREC_EXCLUSIVE = 0x98, // Not Supported in Linux
9797
LDAP_OPT_SECURITY_CONTEXT = 0x99,
9898
LDAP_OPT_ROOTDSE_CACHE = 0x9a, // Not Supported in Linux
99+
LDAP_OPT_DEBUG_LEVEL = 0x5001,
99100
LDAP_OPT_X_SASL_REALM = 0x6101,
100101
LDAP_OPT_X_SASL_AUTHCID = 0x6102,
101102
LDAP_OPT_X_SASL_AUTHZID = 0x6103

src/libraries/Common/src/Interop/Linux/OpenLdap/Interop.Ber.cs

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,48 @@
77

88
internal static partial class Interop
99
{
10-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_alloc_t", CharSet = CharSet.Ansi)]
11-
public static extern IntPtr ber_alloc(int option);
10+
internal static partial class Ldap
11+
{
12+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_alloc_t", CharSet = CharSet.Ansi)]
13+
public static extern IntPtr ber_alloc(int option);
1214

13-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_init", CharSet = CharSet.Ansi)]
14-
public static extern IntPtr ber_init(berval value);
15+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_init", CharSet = CharSet.Ansi)]
16+
public static extern IntPtr ber_init(berval value);
1517

16-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_free", CharSet = CharSet.Ansi)]
17-
public static extern IntPtr ber_free([In] IntPtr berelement, int option);
18+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_free", CharSet = CharSet.Ansi)]
19+
public static extern IntPtr ber_free([In] IntPtr berelement, int option);
1820

19-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
20-
public static extern int ber_printf_emptyarg(SafeBerHandle berElement, string format);
21+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
22+
public static extern int ber_printf_emptyarg(SafeBerHandle berElement, string format);
2123

22-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
23-
public static extern int ber_printf_int(SafeBerHandle berElement, string format, int value);
24+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
25+
public static extern int ber_printf_int(SafeBerHandle berElement, string format, int value);
2426

25-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
26-
public static extern int ber_printf_bytearray(SafeBerHandle berElement, string format, HGlobalMemHandle value, int length);
27+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
28+
public static extern int ber_printf_bytearray(SafeBerHandle berElement, string format, HGlobalMemHandle value, int length);
2729

28-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
29-
public static extern int ber_printf_berarray(SafeBerHandle berElement, string format, IntPtr value);
30+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_printf", CharSet = CharSet.Ansi)]
31+
public static extern int ber_printf_berarray(SafeBerHandle berElement, string format, IntPtr value);
3032

31-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_flatten", CharSet = CharSet.Ansi)]
32-
public static extern int ber_flatten(SafeBerHandle berElement, ref IntPtr value);
33+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_flatten", CharSet = CharSet.Ansi)]
34+
public static extern int ber_flatten(SafeBerHandle berElement, ref IntPtr value);
3335

34-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_bvfree", CharSet = CharSet.Ansi)]
35-
public static extern int ber_bvfree(IntPtr value);
36+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_bvfree", CharSet = CharSet.Ansi)]
37+
public static extern int ber_bvfree(IntPtr value);
3638

37-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_bvecfree", CharSet = CharSet.Ansi)]
38-
public static extern int ber_bvecfree(IntPtr value);
39+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_bvecfree", CharSet = CharSet.Ansi)]
40+
public static extern int ber_bvecfree(IntPtr value);
3941

40-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
41-
public static extern int ber_scanf(SafeBerHandle berElement, string format);
42+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
43+
public static extern int ber_scanf(SafeBerHandle berElement, string format);
4244

43-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
44-
public static extern int ber_scanf_int(SafeBerHandle berElement, string format, ref int value);
45+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
46+
public static extern int ber_scanf_int(SafeBerHandle berElement, string format, ref int value);
4547

46-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
47-
public static extern int ber_scanf_bitstring(SafeBerHandle berElement, string format, ref IntPtr value, ref int bitLength);
48+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
49+
public static extern int ber_scanf_bitstring(SafeBerHandle berElement, string format, ref IntPtr value, ref int bitLength);
4850

49-
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
50-
public static extern int ber_scanf_ptr(SafeBerHandle berElement, string format, ref IntPtr value);
51+
[DllImport(Libraries.OpenLdap, EntryPoint = "ber_scanf", CharSet = CharSet.Ansi)]
52+
public static extern int ber_scanf_ptr(SafeBerHandle berElement, string format, ref IntPtr value);
53+
}
5154
}

0 commit comments

Comments
 (0)