Skip to content

Commit c3c14f4

Browse files
committed
CDRIVER-547 fix sasl concurrency
(cherry picked from commit cd5c234) Conflicts: build/cmake/FindSASL2.cmake
1 parent b50a9df commit c3c14f4

File tree

3 files changed

+82
-9
lines changed

3 files changed

+82
-9
lines changed

build/autotools/CheckSasl.m4

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ AC_SUBST(SASL_LIBS)
4242
dnl Let mongoc-config.h.in know about SASL status.
4343
if test "$sasl_mode" != "no" ; then
4444
AC_SUBST(MONGOC_ENABLE_SASL, 1)
45+
46+
AC_MSG_CHECKING([for sasl_client_done])
47+
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sasl/sasl.h>]],
48+
[[sasl_client_done ();]])],
49+
[AC_MSG_RESULT(yes)
50+
have_sasl_client_done=yes],
51+
[AC_MSG_RESULT(no)
52+
have_sasl_client_done=no])
53+
AS_IF([test "$have_sasl_client_done" = "yes"],
54+
[AC_SUBST(MONGOC_HAVE_SASL_CLIENT_DONE, 1)],
55+
[AC_SUBST(MONGOC_HAVE_SASL_CLIENT_DONE, 0)])
56+
4557
else
4658
AC_SUBST(MONGOC_ENABLE_SASL, 0)
4759
fi

src/mongoc/mongoc-init.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,61 @@
2626
# include "mongoc-ssl-private.h"
2727
#endif
2828
#include "mongoc-thread-private.h"
29+
#include "mongoc-trace.h"
30+
31+
32+
#ifdef MONGOC_ENABLE_SASL
33+
#include <sasl/sasl.h>
34+
35+
static void *
36+
mongoc_sasl_mutex_alloc (void)
37+
{
38+
mongoc_mutex_t *mutex;
39+
40+
ENTRY;
41+
42+
mutex = bson_malloc0 (sizeof (mongoc_mutex_t));
43+
mongoc_mutex_init (mutex);
44+
45+
RETURN((void *) mutex);
46+
}
47+
48+
49+
static int
50+
mongoc_sasl_mutex_lock (void *mutex)
51+
{
52+
ENTRY;
53+
54+
mongoc_mutex_lock ((mongoc_mutex_t *) mutex);
55+
56+
RETURN(SASL_OK);
57+
}
58+
59+
60+
static int
61+
mongoc_sasl_mutex_unlock (void *mutex)
62+
{
63+
ENTRY;
64+
65+
mongoc_mutex_unlock ((mongoc_mutex_t *) mutex);
66+
67+
RETURN(SASL_OK);
68+
}
69+
70+
71+
static void
72+
mongoc_sasl_mutex_free (void *mutex)
73+
{
74+
ENTRY;
75+
76+
mongoc_mutex_destroy ((mongoc_mutex_t *) mutex);
77+
bson_free (mutex);
78+
79+
EXIT;
80+
}
81+
82+
#endif//MONGOC_ENABLE_SASL
83+
2984

3085
static MONGOC_ONCE_FUN( _mongoc_do_init)
3186
{
@@ -34,6 +89,16 @@ static MONGOC_ONCE_FUN( _mongoc_do_init)
3489
_mongoc_scram_startup();
3590
#endif
3691

92+
#ifdef MONGOC_ENABLE_SASL
93+
sasl_set_mutex (mongoc_sasl_mutex_alloc,
94+
mongoc_sasl_mutex_lock,
95+
mongoc_sasl_mutex_unlock,
96+
mongoc_sasl_mutex_free);
97+
98+
/* TODO: logging callback? */
99+
sasl_client_init (NULL);
100+
#endif
101+
37102
_mongoc_counters_init();
38103

39104
#ifdef _WIN32
@@ -70,6 +135,11 @@ static MONGOC_ONCE_FUN( _mongoc_do_cleanup)
70135
_mongoc_ssl_cleanup();
71136
#endif
72137

138+
/* apple's libsasl package somehow lacks sasl_client_done before 2.1.24 */
139+
#if MONGOC_HAVE_SASL_CLIENT_DONE
140+
sasl_client_done ();
141+
#endif
142+
73143
#ifdef _WIN32
74144
WSACleanup ();
75145
#endif

src/mongoc/mongoc-sasl.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,6 @@ _mongoc_sasl_init (mongoc_sasl_t *sasl)
151151
sasl->service_name = NULL;
152152
sasl->service_host = NULL;
153153
sasl->interact = NULL;
154-
155-
sasl_client_init (sasl->callbacks);
156154
}
157155

158156

@@ -170,13 +168,6 @@ _mongoc_sasl_destroy (mongoc_sasl_t *sasl)
170168
free (sasl->mechanism);
171169
free (sasl->service_name);
172170
free (sasl->service_host);
173-
174-
#if (SASL_VERSION_MAJOR >= 2) && \
175-
(SASL_VERSION_MINOR >= 1) && \
176-
(SASL_VERSION_STEP >= 24) && \
177-
(!defined(__APPLE__))
178-
sasl_client_done ();
179-
#endif
180171
}
181172

182173

0 commit comments

Comments
 (0)