* @note This should be used for requests in preparation for freeing them.
*
* @param[in] child request to unlink.
- * @param[in] will_free Caller super pinky swears to free
- * the request ASAP, and that it wont
- * touch persistable request data,
- * request->session_state_ctx or request->state.
* @return
* - 0 on success.
* - -1 on failure.
*/
-int request_detach(request_t *child, bool will_free)
+int request_detach(request_t *child)
{
request_t *request = child->parent;
*/
request_data_get(request, child, 0);
- /*
- * Fixup any sate or persistent
- * request data.
- */
- fr_state_detach(child, will_free);
-
child->parent = NULL;
while (!request->backlog) {
#define request_local_alloc(_ctx, _args) _request_local_alloc(__FILE__, __LINE__, (_ctx), (_args))
request_t *_request_local_alloc(char const *file, int line, TALLOC_CTX *ctx, request_init_args_t const *args);
-int request_detach(request_t *child, bool will_free);
+int request_detach(request_t *child);
int request_global_init(void);
void request_global_free(void);
talloc_free(child_entry);
}
-/** Move all request data and session-state VPs into a new state_ctx
- *
- * If we don't do this on detach, session-state VPs and persistable
- * request data will be freed when the parent's state_ctx is freed.
- * If the parent was freed before the child, we'd get all kinds of
- * use after free nastiness.
- *
- * @param[in] request to detach.
- * @param[in] will_free Caller super pinky swears to free
- * the request ASAP, and that it wont
- * touch persistable request data,
- * request->session_state_ctx or request->state.
- */
-void fr_state_detach(request_t *request, bool will_free)
-{
- fr_pair_t *new_state_ctx;
-
- if (will_free) {
- fr_pair_list_free(&request->session_state_pairs);
-
- /*
- * The non-persistable stuff is
- * prented directly by the request
- */
- request_data_persistable_free(request);
- return;
- }
-
- /*
- * Alloc a new pairlist to use as the
- * state ctx and the head of the
- * state list.
- */
- MEM(new_state_ctx = fr_pair_afrom_da(NULL, request_attr_state));
- request_data_by_persistance_reparent(new_state_ctx, NULL, request, true);
- request_data_by_persistance_reparent(new_state_ctx, NULL, request, false);
-
- (void) fr_pair_list_copy(new_state_ctx, &new_state_ctx->children, &request->session_state_pairs);
- fr_pair_list_free(&request->session_state_pairs);
-
- request->session_state_ctx = new_state_ctx;
-}
-
/** Return number of entries created
*
*/
void fr_state_store_in_parent(request_t *request, void const *unique_ptr, int unique_int);
void fr_state_restore_to_child(request_t *request, void const *unique_ptr, int unique_int);
-void fr_state_detach(request_t *request, bool will_free);
/*
* Stats
*/
{
fr_pair_t *vp;
- if (request_detach(request, false) < 0) {
+ if (request_detach(request) < 0) {
ERROR("Failed detaching child");
return -1;
}
*/
void unlang_subrequest_free(request_t **child)
{
- request_detach(*child, true);
+ request_detach(*child);
talloc_free(*child);
*child = NULL;
}
eap_session = talloc_get_type_abort(rctx, eap_session_t);
- (void)fr_cond_assert(request_detach(eap_session->subrequest, true) == 0);
+ (void)fr_cond_assert(request_detach(eap_session->subrequest) == 0);
TALLOC_FREE(eap_session->subrequest);
/*
/*
* Cleanup the subrequest
*/
- (void)fr_cond_assert(request_detach(eap_session->subrequest, true) == 0);
+ (void)fr_cond_assert(request_detach(eap_session->subrequest) == 0);
TALLOC_FREE(eap_session->subrequest);
/*