]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
move memory allocation to outside of the mutex lock
authorAlan T. DeKok <aland@freeradius.org>
Tue, 7 Feb 2023 21:54:58 +0000 (16:54 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 7 Feb 2023 22:08:27 +0000 (17:08 -0500)
src/lib/server/state.c

index 59aa7a5ba65512b7deeb58b7efee92d4efbd41b1..76159448f84b4e87b7be6ed0165f4293be28934c 100644 (file)
@@ -738,6 +738,7 @@ int fr_request_to_state(fr_state_tree_t *state, request_t *request)
 {
        fr_state_entry_t        *entry, *old;
        fr_dlist_head_t         data;
+       fr_pair_t               *vp;
 
        old = request_data_get(request, state, 0);
        request_data_list_init(&data);
@@ -750,6 +751,8 @@ int fr_request_to_state(fr_state_tree_t *state, request_t *request)
                log_request_pair_list(L_DBG_LVL_2, request, NULL, &request->session_state_pairs, "&session-state.");
        }
 
+       MEM(vp = request_state_replace(request, NULL));
+
        PTHREAD_MUTEX_LOCK(&state->mutex);
 
        /*
@@ -759,6 +762,8 @@ int fr_request_to_state(fr_state_tree_t *state, request_t *request)
        if (!entry) {
                PTHREAD_MUTEX_UNLOCK(&state->mutex);
                RERROR("Creating state entry failed");
+
+               talloc_free(request_state_replace(request, vp));
                request_data_restore(request, &data);   /* Put it back again */
                return -1;
        }
@@ -767,7 +772,7 @@ int fr_request_to_state(fr_state_tree_t *state, request_t *request)
        fr_assert(request->session_state_ctx);
 
        entry->seq_start = request->seq_start;
-       entry->ctx = request_state_replace(request, NULL);
+       entry->ctx = vp;
        fr_dlist_move(&entry->data, &data);
        PTHREAD_MUTEX_UNLOCK(&state->mutex);