]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
address locking issues. CID #1680642
authorAlan T. DeKok <aland@freeradius.org>
Fri, 23 Jan 2026 21:00:57 +0000 (16:00 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 23 Jan 2026 21:00:57 +0000 (16:00 -0500)
src/lib/server/state.c

index 9fe6b68a50911c49ce6d507d870b418c1f042a87..11f1c58bc99ceffc049319da01dc6c155630e118 100644 (file)
@@ -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));