From: Alan T. DeKok Date: Fri, 23 Jan 2026 21:00:57 +0000 (-0500) Subject: address locking issues. CID #1680642 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2ae86bb228c1132c5dee1a59afb66dfce84487d;p=thirdparty%2Ffreeradius-server.git address locking issues. CID #1680642 --- diff --git a/src/lib/server/state.c b/src/lib/server/state.c index 9fe6b68a509..11f1c58bc99 100644 --- a/src/lib/server/state.c +++ b/src/lib/server/state.c @@ -405,7 +405,6 @@ static fr_state_entry_t *state_entry_create(fr_state_tree_t *state, request_t *r if (too_many) { RERROR("Failed inserting state entry - At maximum ongoing session limit (%u)", state->config.max_sessions); - PTHREAD_MUTEX_LOCK(&state->mutex); /* Caller expects this to be locked */ return NULL; } @@ -541,6 +540,7 @@ static fr_state_entry_t *state_entry_create(fr_state_tree_t *state, request_t *r if (!fr_rb_insert(state->tree, entry)) { RERROR("Failed inserting state entry - Insertion into state tree failed"); + PTHREAD_MUTEX_UNLOCK(&state->mutex); fail: fr_pair_delete_by_da(reply_list, state->da); talloc_free(entry); @@ -764,11 +764,10 @@ int fr_state_store(fr_state_tree_t *state, request_t *request) PTHREAD_MUTEX_LOCK(&state->mutex); /* - * Reuses old if possible + * Reuses old if possible, and leaves the mutex unlocked on failure. */ entry = state_entry_create(state, request, &request->reply_pairs, old); if (!entry) { - PTHREAD_MUTEX_UNLOCK(&state->mutex); RERROR("Creating state entry failed"); talloc_free(request_state_replace(request, state_ctx));