From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752812AbdBJXuC (ORCPT ); Fri, 10 Feb 2017 18:50:02 -0500 Received: from mga02.intel.com ([134.134.136.20]:21804 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752657AbdBJXuA (ORCPT ); Fri, 10 Feb 2017 18:50:00 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,143,1484035200"; d="scan'208";a="932557582" From: william.c.roberts@intel.com To: linux-kernel@vger.kernel.org, joe@perches.com, apw@canonical.com Cc: keescook@chromium.org, kernel-hardening@lists.openwall.com, William Roberts Subject: [PATCH v3] checkpatch: add warning on invalid %p extensions Date: Fri, 10 Feb 2017 15:49:56 -0800 Message-Id: <1486770596-15526-1-git-send-email-william.c.roberts@intel.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: William Roberts The kernel supports %p extensions as documented in Documentation/printk-formats.txt. Warn on possibly improper use of non-extension characters. One issue would be the usage of %pk when %pK should have been used. This has a side-effect of appearing to work alright, but does not respect the kptr_restrict setting as %pK does. Sample output: WARNING: Invalid vsprintf pointer extension '%pk' + printk(KERN_INFO "Could not allocate IRQ %d for PCI Applicom device. %pk\n", dev->irq, pci_get_class); // NOT OK improved-by: joe@perches.com Signed-off-by: William Roberts --- scripts/checkpatch.pl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 982c52c..dfc1c11 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -6096,6 +6096,15 @@ sub process { "recursive locking is bad, do not use this ever.\n" . $herecurr); } + # check for vsprintf extension %p misuses + if ($line =~ /\b$logFunctions\s*\(.*$String/) { + my $format = get_quoted_string($line, $rawline); + if ($format =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) { + WARN("VSPRINTF_POINTER_EXTENSION", + "Invalid vsprintf pointer extension '$1'\n" . $herecurr); + } + } + # check for lockdep_set_novalidate_class if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || $line =~ /__lockdep_no_validate__\s*\)/ ) { -- 2.7.4