From patchwork Fri Mar 5 12:47:05 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Glendinning X-Patchwork-Id: 47006 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 0DA3AB7CF9 for ; Fri, 5 Mar 2010 23:53:27 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751469Ab0CEMxO (ORCPT ); Fri, 5 Mar 2010 07:53:14 -0500 Received: from 77-44-110-64.xdsl.murphx.net ([77.44.110.64]:59450 "EHLO drevil2.shawell.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750885Ab0CEMxN (ORCPT ); Fri, 5 Mar 2010 07:53:13 -0500 X-Greylist: delayed 365 seconds by postgrey-1.27 at vger.kernel.org; Fri, 05 Mar 2010 07:53:13 EST Received: from localhost.localdomain (unknown [10.0.20.109]) by drevil2.shawell.net (Postfix) with ESMTP id 1D5D967BC8 for ; Fri, 5 Mar 2010 12:47:05 +0000 (GMT) From: Steve Glendinning To: netdev@vger.kernel.org Subject: [PATCH] Fix netdev_printk null dereference Date: Fri, 5 Mar 2010 12:47:05 +0000 Message-Id: <1267793225-426-1-git-send-email-steve.glendinning@smsc.com> X-Mailer: git-send-email 1.6.6.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch fixes a reproducible null dereference in smsc95xx (and I suspect others) when the device is removed during a control register access. This can be reproduced by rapidly plugging and unplugging the device during its initialisation. Signed-off-by: Steve Glendinning --- include/linux/netdevice.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index c79a88b..250dbc0 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2132,9 +2132,10 @@ static inline const char *netdev_name(const struct net_device *dev) } #define netdev_printk(level, netdev, format, args...) \ - dev_printk(level, (netdev)->dev.parent, \ + ({ if ((netdev)->dev.parent) \ + dev_printk(level, (netdev)->dev.parent, \ "%s: " format, \ - netdev_name(netdev), ##args) + netdev_name(netdev), ##args); }) #define netdev_emerg(dev, format, args...) \ netdev_printk(KERN_EMERG, dev, format, ##args)