From patchwork Tue Aug 20 13:50:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 268525 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 42A432C00D9 for ; Tue, 20 Aug 2013 23:51:53 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751079Ab3HTNvg (ORCPT ); Tue, 20 Aug 2013 09:51:36 -0400 Received: from mail-ee0-f51.google.com ([74.125.83.51]:35329 "EHLO mail-ee0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751045Ab3HTNvf (ORCPT ); Tue, 20 Aug 2013 09:51:35 -0400 Received: by mail-ee0-f51.google.com with SMTP id c1so216784eek.38 for ; Tue, 20 Aug 2013 06:51:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=Y63/wTmzBRLHs+Kx6DqgtlMssUcqoVhjVFDBNwCAqHk=; b=gp28flkKHqzJXP6kPItmFhWot+RgppgJGxG08ngZEpHHa0dSE1sj8apcaQkN52oTXp F55zb5vOGiVZUVj9Qpw/0UiA97of/vKvex9bmqlNrWPKoA89ZdQa0Ke2Zao15YM7hM2i dMP1DiHSJeqXATqdu+++EQEwMj1ijA9xgSgsvSNrHpkDkgA9Sgaj5FIZzqdWAZPkFR+w 4lHMl6cMhfPgebhRAPuJxulvqgpNQ+AYSW6UResbKrVfVUw+hZfm1qXjicRUh9jjpj03 cEUgrNBsmrhtMqWwN9mh3cw/A5g1YvdAsV/VWrxF7m8/mvUj5dLGbmznmh0b9iAnRbsI FdiQ== X-Received: by 10.14.9.72 with SMTP id 48mr2474795ees.42.1377006694035; Tue, 20 Aug 2013 06:51:34 -0700 (PDT) Received: from localhost ([86.57.255.92]) by mx.google.com with ESMTPSA id n48sm2535766eeg.17.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 20 Aug 2013 06:51:33 -0700 (PDT) Date: Tue, 20 Aug 2013 16:50:33 +0300 From: Sergey Senozhatsky To: "David S. Miller" Cc: Patrick McHardy , Pablo Neira Ayuso , Johannes Berg , Gao feng , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH next] netlink: prevent deadlock in ctrl_dumpfamily() Message-ID: <20130820135033.GA2315@swordfish.minsk.epam.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Commmit 58ad436fcf49810aa006016107f494c9ac9013db Author: Johannes Berg genetlink: fix family dump race added genl_lock() call to ctrl_dumpfamily(), which potentially can deadlock. Suppose the following case: genl_rcv_msg(): !family->parallel_ops -> genl_lock() genl_family_rcv_msg() netlink_dump_start() netlink_dump() ctrl_dumpfamily() --> genl_lock() Take in account possibility of genl_lock() in genl_rcv_msg() and do not acquire genl_mutex in ctrl_dumpfamily() for a family that supports parallel_ops. Signed-off-by: Sergey Senozhatsky --- net/netlink/genetlink.c | 6 ++++++ 1 file changed, 6 insertions(+) -- 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/netlink/genetlink.c b/net/netlink/genetlink.c index f85f8a2..fca3659 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -791,6 +791,12 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) int fams_to_skip = cb->args[1]; bool need_locking = chains_to_skip || fams_to_skip; + if (need_locking) { + /* genl_mutex could be already locked in genl_rcv_msg() */ + rt = genl_family_find_byid(cb->nlh->nlmsg_type); + need_locking = need_locking && rt->parallel_ops; + } + if (need_locking) genl_lock();