Skip to content

Commit 58bac1c

Browse files
committed
session server BUGFIX double context unlock
1 parent feccb31 commit 58bac1c

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/session_server.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3236,11 +3236,11 @@ nc_server_ch_client_set_max_attempts(const char *client_name, uint8_t max_attemp
32363236

32373237
/* client lock is expected to be held */
32383238
static NC_MSG_TYPE
3239-
nc_connect_ch_endpt(struct nc_ch_endpt *endpt, nc_server_ch_session_acquire_ctx_cb acquire_ctx_cb, void *ctx_cb_data,
3240-
struct nc_session **session)
3239+
nc_connect_ch_endpt(struct nc_ch_endpt *endpt, nc_server_ch_session_acquire_ctx_cb acquire_ctx_cb,
3240+
nc_server_ch_session_release_ctx_cb release_ctx_cb, void *ctx_cb_data, struct nc_session **session)
32413241
{
32423242
NC_MSG_TYPE msgtype;
3243-
const struct ly_ctx *ctx;
3243+
const struct ly_ctx *ctx = NULL;
32443244
int sock, ret;
32453245
struct timespec ts_cur;
32463246
char *ip_host;
@@ -3342,6 +3342,9 @@ nc_connect_ch_endpt(struct nc_ch_endpt *endpt, nc_server_ch_session_acquire_ctx_
33423342
fail:
33433343
nc_session_free(*session, NULL);
33443344
*session = NULL;
3345+
if (ctx) {
3346+
release_ctx_cb(ctx_cb_data);
3347+
}
33453348
return msgtype;
33463349
}
33473350

@@ -3399,8 +3402,10 @@ nc_server_ch_client_thread_session_cond_wait(struct nc_session *session, struct
33993402
/* CH UNLOCK */
34003403
pthread_mutex_unlock(&session->opts.server.ch_lock);
34013404

3405+
/* session terminated, release its context */
34023406
nc_session_free(session, NULL);
3403-
goto release_ctx;
3407+
data->release_ctx_cb(data->ctx_cb_data);
3408+
return ret;
34043409
}
34053410

34063411
do {
@@ -3456,10 +3461,6 @@ nc_server_ch_client_thread_session_cond_wait(struct nc_session *session, struct
34563461
/* CH UNLOCK */
34573462
pthread_mutex_unlock(&session->opts.server.ch_lock);
34583463

3459-
release_ctx:
3460-
/* session terminated, release its context */
3461-
data->release_ctx_cb(data->ctx_cb_data);
3462-
34633464
return ret;
34643465
}
34653466

@@ -3489,7 +3490,7 @@ nc_ch_client_thread(void *arg)
34893490

34903491
VRB(NULL, "Call Home client \"%s\" connecting...", data->client_name);
34913492
while (1) {
3492-
msgtype = nc_connect_ch_endpt(cur_endpt, data->acquire_ctx_cb, data->ctx_cb_data, &session);
3493+
msgtype = nc_connect_ch_endpt(cur_endpt, data->acquire_ctx_cb, data->release_ctx_cb, data->ctx_cb_data, &session);
34933494

34943495
if (msgtype == NC_MSG_HELLO) {
34953496
/* UNLOCK */

0 commit comments

Comments
 (0)