From patchwork Wed May 18 13:11:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacek Luczak X-Patchwork-Id: 96165 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8B7BB1007D1 for ; Wed, 18 May 2011 23:11:53 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756996Ab1ERNLs (ORCPT ); Wed, 18 May 2011 09:11:48 -0400 Received: from mail-pv0-f174.google.com ([74.125.83.174]:34865 "EHLO mail-pv0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756948Ab1ERNLr convert rfc822-to-8bit (ORCPT ); Wed, 18 May 2011 09:11:47 -0400 Received: by pvg12 with SMTP id 12so695670pvg.19 for ; Wed, 18 May 2011 06:11:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=sOxhMS9vgBgH+lzaDL8EnMzSTNvQsjiqSNQN97ADeU4=; b=ArMncZNaHaBEZ6uJOaH3EGgL7PTv6+bVaNfbyz6zXUPbLQEi3Oabm0vtuZL6rfaqzX Rtlzy5Dqro+1MbvaIcn49Jk+F1WzbghEKdI2sLIzgyQf2Jaimy4BGRD+hATULDdF87xp NaO8/l+hwf0/Q9aggj9U5SL3YczScn6ttnBY0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=xz2m0iNoMGcUUJjyuDwI4/UdNjsWBmetujQpLoGLSQBiga9MqTvv/EnfwmldI4V/cp 2/Vzd9WyufLYFnauZ4Azfwi8uei1TVqEbNwe+1LW1n6gUwBVHXQqctkJ/utEhEx/7SSj nGFa/NDNiM04j78sx6bWe8/mK+RwYXfA73eHY= MIME-Version: 1.0 Received: by 10.68.14.66 with SMTP id n2mr2818853pbc.421.1305724307346; Wed, 18 May 2011 06:11:47 -0700 (PDT) Received: by 10.68.48.199 with HTTP; Wed, 18 May 2011 06:11:47 -0700 (PDT) In-Reply-To: <1305723046.2991.19.camel@edumazet-laptop> References: <1305704885.2983.4.camel@edumazet-laptop> <1305707358.2983.14.camel@edumazet-laptop> <4DD38B30.9090601@cn.fujitsu.com> <4DD3BC8F.9050802@hp.com> <1305723046.2991.19.camel@edumazet-laptop> Date: Wed, 18 May 2011 15:11:47 +0200 Message-ID: Subject: Re: [PATCH] SCTP: fix race between sctp_bind_addr_free() and sctp_bind_addr_conflict() From: Jacek Luczak To: Eric Dumazet Cc: Vladislav Yasevich , Wei Yongjun , netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 2011/5/18 Eric Dumazet : > Le mercredi 18 mai 2011 à 14:47 +0200, Jacek Luczak a écrit : > >> OK then, at the end what Eric suggested is IMO valid: >> >> diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c >> index faf71d1..0025d90 100644 >> --- a/net/sctp/bind_addr.c >> +++ b/net/sctp/bind_addr.c >> @@ -144,10 +144,9 @@ static void sctp_bind_addr_clean(struct sctp_bind_addr *bp) >>         struct list_head *pos, *temp; >> >>         /* Empty the bind address list. */ >> -       list_for_each_safe(pos, temp, &bp->address_list) { >> -               addr = list_entry(pos, struct sctp_sockaddr_entry, list); >> -               list_del(pos); >> -               kfree(addr); >> +       list_for_each_entry(pos, &bp->address_list, list) { > > a 'safe' version is needed here, since we remove items in iterator. Yep. } Does it now look good? -Jacek --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index faf71d1..6150ac5 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c @@ -140,14 +140,12 @@ void sctp_bind_addr_init(struct sctp_bind_addr *bp, __u16 port) /* Dispose of the address list. */ static void sctp_bind_addr_clean(struct sctp_bind_addr *bp) { - struct sctp_sockaddr_entry *addr; - struct list_head *pos, *temp; + struct sctp_sockaddr_entry *addr, *temp; /* Empty the bind address list. */ - list_for_each_safe(pos, temp, &bp->address_list) { - addr = list_entry(pos, struct sctp_sockaddr_entry, list); - list_del(pos); - kfree(addr); + list_for_each_entry_safe(addr, temp, &bp->address_list, list) { + list_del_rcu(&addr->list); + call_rcu(&addr->rcu, sctp_local_addr_free); SCTP_DBG_OBJCNT_DEC(addr); }