[ltt-dev] [PATCH 04/10] use cds_list_for_each_entry_safe()

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Sep 15 11:11:43 EDT 2011


* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>

Renamed patch to:

urcu call_rcu: fix use after free()

call_rcu_after_fork_child() needs to use cds_list_for_each_entry_safe to
safely iterate on the list as its item is being freed.


Merged, thanks!

Mathieu

> ---
>  urcu-call-rcu-impl.h |    9 +++------
>  1 files changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h
> index 1fbce98..6cb08be 100644
> --- a/urcu-call-rcu-impl.h
> +++ b/urcu-call-rcu-impl.h
> @@ -651,7 +651,7 @@ void call_rcu_after_fork_parent(void)
>   */
>  void call_rcu_after_fork_child(void)
>  {
> -	struct call_rcu_data *crdp;
> +	struct call_rcu_data *crdp, *next;
>  
>  	/* Release the mutex. */
>  	call_rcu_unlock(&call_rcu_mutex);
> @@ -664,12 +664,9 @@ void call_rcu_after_fork_child(void)
>  	(void)get_default_call_rcu_data();
>  
>  	/* Dispose of all of the rest of the call_rcu_data structures. */
> -	while (call_rcu_data_list.next != call_rcu_data_list.prev) {
> -		crdp = cds_list_entry(call_rcu_data_list.prev,
> -				      struct call_rcu_data, list);
> +	cds_list_for_each_entry_safe(crdp, next, &call_rcu_data_list, list) {
>  		if (crdp == default_call_rcu_data)
> -			crdp = cds_list_entry(crdp->list.prev,
> -					      struct call_rcu_data, list);
> +			continue;
>  		uatomic_set(&crdp->flags, URCU_CALL_RCU_STOPPED);
>  		call_rcu_data_free(crdp);
>  	}
> -- 
> 1.7.4.4
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




More information about the lttng-dev mailing list