From patchwork Tue Jun 3 23:40:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 355675 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 079F314007F for ; Wed, 4 Jun 2014 09:41:12 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933860AbaFCXlG (ORCPT ); Tue, 3 Jun 2014 19:41:06 -0400 Received: from mail-pd0-f180.google.com ([209.85.192.180]:51263 "EHLO mail-pd0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932164AbaFCXlE (ORCPT ); Tue, 3 Jun 2014 19:41:04 -0400 Received: by mail-pd0-f180.google.com with SMTP id y13so5281319pdi.11 for ; Tue, 03 Jun 2014 16:41:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=klRNcLpL87Zr0aoM6yP8WmtiBw3oBBLOz+CdDDke5/I=; b=zoAP+fmzO5OO6To7rs/E5axieWs9TUS+FB0G8DfOBEopnD7LHCqN+6Owr/HGh7bGv6 7jcQdV/1B+szm3hCht4UiIopU78wAUghrvDBGtMjutah91YkpxQl+xCCbrSo8/Cl4v37 7lWbn+ir1DsYxDClLGxJaJdsjU4nzqSx7fxS6N+gd+Urgv4opGJ/ALHXuJ8Qd/Rfps5M iu46JPjqb0//rX1auaydv3nXDAqi9qbUqOSO/g1gtpj/h6kflPssARoprTtq+O9gVqOS NGOaL1niPrJzdSjN4e2vUKeG73qMAGjbsnLqUoQ3lDv233HHEYFS7irt3KCn6E4SNkqf xlaw== X-Received: by 10.68.170.66 with SMTP id ak2mr55255763pbc.5.1401838864003; Tue, 03 Jun 2014 16:41:04 -0700 (PDT) Received: from localhost.net ([8.25.197.27]) by mx.google.com with ESMTPSA id x5sm2243583pbw.26.2014.06.03.16.41.02 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jun 2014 16:41:03 -0700 (PDT) From: Cong Wang To: netdev@vger.kernel.org Cc: Cong Wang , "David S. Miller" , Eric Dumazet , Cong Wang Subject: [Patch net] rtnetlink: fix a memory leak when ->newlink fails Date: Tue, 3 Jun 2014 16:40:47 -0700 Message-Id: <1401838847-5982-1-git-send-email-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 1.8.3.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Cong Wang It is possible that ->newlink() fails before registering the device, in this case we should just free it, it's safe to call free_netdev(). Fixes: commit 0e0eee2465df77bcec2 (net: correct error path in rtnl_newlink()) Cc: David S. Miller Cc: Eric Dumazet Signed-off-by: Cong Wang Signed-off-by: Cong Wang --- net/core/rtnetlink.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2d8d8fc..f4e9037 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2019,11 +2019,15 @@ replay: if (ops->newlink) { err = ops->newlink(net, dev, tb, data); /* Drivers should call free_netdev() in ->destructor - * and unregister it on failure so that device could be - * finally freed in rtnl_unlock. + * and unregister it on failure after registration + * so that device could be finally freed in rtnl_unlock. */ - if (err < 0) + if (err < 0) { + /* If device is not registered at all, free it now */ + if (dev->reg_state == NETREG_UNINITIALIZED) + free_netdev(dev); goto out; + } } else { err = register_netdevice(dev); if (err < 0) {