]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Remember the request that previously thawed the state
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 31 Jan 2018 22:36:12 +0000 (15:36 -0700)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 31 Jan 2018 22:36:17 +0000 (15:36 -0700)
src/main/state.c

index a7cdd7b73ca269d88d61ff7dbf63e1440d7331e8..04ea2e2f6e95ff7f7311fa446304d3528f97d370 100644 (file)
@@ -104,6 +104,8 @@ typedef struct state_entry {
        VALUE_PAIR              *vps;                           //!< session-state VALUE_PAIRs, parented by ctx.
 
        request_data_t          *data;                          //!< Persistable request data, also parented ctx.
+
+       REQUEST                 *thawed;                        //!< The request that thawed this entry.
 } fr_state_entry_t;
 
 struct fr_state_tree_t {
@@ -586,7 +588,14 @@ void fr_state_to_request(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET
 
        entry = state_entry_find(state, request, packet);
        if (entry) {
-               if (request->state_ctx) old_ctx = request->state_ctx;
+               (void)talloc_get_type_abort(entry, fr_state_entry_t);
+               if (entry->thawed) {
+                       REDEBUG("State entry has already been thawed by a request %"PRIu64, entry->thawed->number);
+                       return;
+               }
+               if (request->state_ctx) old_ctx = request->state_ctx;   /* Store for later freeing */
+
+               rad_assert(entry->ctx);
 
                request->seq_start = entry->seq_start;
                request->state_ctx = entry->ctx;
@@ -596,6 +605,7 @@ void fr_state_to_request(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET
                entry->ctx = NULL;
                entry->vps = NULL;
                entry->data = NULL;
+               entry->thawed = request;
        }
 
        PTHREAD_MUTEX_UNLOCK(&state->mutex);