From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754768AbdEFEIF (ORCPT ); Sat, 6 May 2017 00:08:05 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:50914 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932944AbdEFEHz (ORCPT ); Sat, 6 May 2017 00:07:55 -0400 Date: Fri, 5 May 2017 21:07:47 -0700 From: Greg KH To: kernel-hardening@lists.openwall.com, Petr Mladek , Sergey Senozhatsky Cc: linux-kernel@vger.kernel.org, Catalin Marinas , Will Deacon , Steven Rostedt , William Roberts , Chris Fries , Dave Weinstein Subject: [RFC 5/6] lib: vsprintf: Add "%paP", "%padP" options Message-ID: <20170506040747.GF32707@kroah.com> References: <20170506040641.GA32707@kroah.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170506040641.GA32707@kroah.com> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chris Fries Add %paP and %padP for physical address that need to always be shown regardless of kptr restrictions. Cc: William Roberts Cc: Dave Weinstein Signed-off-by: Chris Fries Signed-off-by: Greg Kroah-Hartman --- Documentation/printk-formats.txt | 10 ++++++---- lib/vsprintf.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt index 8994c65aa3b0..7ee51269096f 100644 --- a/Documentation/printk-formats.txt +++ b/Documentation/printk-formats.txt @@ -82,18 +82,20 @@ Struct Resources: Physical addresses types phys_addr_t: - %pa[p] 0x01234567 or 0x0123456789abcdef + %pa[p][P] 0x01234567 or 0x0123456789abcdef For printing a phys_addr_t type (and its derivatives, such as resource_size_t) which can vary based on build options, regardless of - the width of the CPU data path. Passed by reference. + the width of the CPU data path. Passed by reference. Use the trailing + 'P' if it needs to be always shown. DMA addresses types dma_addr_t: - %pad 0x01234567 or 0x0123456789abcdef + %pad[P] 0x01234567 or 0x0123456789abcdef For printing a dma_addr_t type which can vary based on build options, - regardless of the width of the CPU data path. Passed by reference. + regardless of the width of the CPU data path. Passed by reference. Use + the trailing 'P' if it needs to be always shown. Raw buffer as an escaped string: diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 404d477d4bd2..37f9d615e622 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1394,23 +1394,29 @@ static noinline_for_stack char *address_val(char *buf, char *end, const void *addr, const char *fmt) { unsigned long long num; + int cleanse = kptr_restrict_cleanse_addresses(); + int decleanse_idx = 1; int size; switch (fmt[1]) { case 'd': num = *(const dma_addr_t *)addr; size = sizeof(dma_addr_t); + decleanse_idx = 2; break; case 'p': + decleanse_idx = 2; + /* fall thru */ default: num = *(const phys_addr_t *)addr; size = sizeof(phys_addr_t); break; } - return special_hex_number(buf, end, - kptr_restrict_cleanse_addresses() ? 0UL : num, - size); + /* 'P' on the tail means don't restrict the pointer. */ + cleanse = cleanse && (fmt[decleanse_idx] != 'P'); + + return special_hex_number(buf, end, cleanse ? 0UL : num, size); } static noinline_for_stack -- 2.12.2 From mboxrd@z Thu Jan 1 00:00:00 1970 Date: Fri, 5 May 2017 21:07:47 -0700 From: Greg KH Message-ID: <20170506040747.GF32707@kroah.com> References: <20170506040641.GA32707@kroah.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170506040641.GA32707@kroah.com> Subject: [kernel-hardening] [RFC 5/6] lib: vsprintf: Add "%paP", "%padP" options To: kernel-hardening@lists.openwall.com, Petr Mladek , Sergey Senozhatsky Cc: linux-kernel@vger.kernel.org, Catalin Marinas , Will Deacon , Steven Rostedt , William Roberts , Chris Fries , Dave Weinstein List-ID: From: Chris Fries Add %paP and %padP for physical address that need to always be shown regardless of kptr restrictions. Cc: William Roberts Cc: Dave Weinstein Signed-off-by: Chris Fries Signed-off-by: Greg Kroah-Hartman --- Documentation/printk-formats.txt | 10 ++++++---- lib/vsprintf.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt index 8994c65aa3b0..7ee51269096f 100644 --- a/Documentation/printk-formats.txt +++ b/Documentation/printk-formats.txt @@ -82,18 +82,20 @@ Struct Resources: Physical addresses types phys_addr_t: - %pa[p] 0x01234567 or 0x0123456789abcdef + %pa[p][P] 0x01234567 or 0x0123456789abcdef For printing a phys_addr_t type (and its derivatives, such as resource_size_t) which can vary based on build options, regardless of - the width of the CPU data path. Passed by reference. + the width of the CPU data path. Passed by reference. Use the trailing + 'P' if it needs to be always shown. DMA addresses types dma_addr_t: - %pad 0x01234567 or 0x0123456789abcdef + %pad[P] 0x01234567 or 0x0123456789abcdef For printing a dma_addr_t type which can vary based on build options, - regardless of the width of the CPU data path. Passed by reference. + regardless of the width of the CPU data path. Passed by reference. Use + the trailing 'P' if it needs to be always shown. Raw buffer as an escaped string: diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 404d477d4bd2..37f9d615e622 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1394,23 +1394,29 @@ static noinline_for_stack char *address_val(char *buf, char *end, const void *addr, const char *fmt) { unsigned long long num; + int cleanse = kptr_restrict_cleanse_addresses(); + int decleanse_idx = 1; int size; switch (fmt[1]) { case 'd': num = *(const dma_addr_t *)addr; size = sizeof(dma_addr_t); + decleanse_idx = 2; break; case 'p': + decleanse_idx = 2; + /* fall thru */ default: num = *(const phys_addr_t *)addr; size = sizeof(phys_addr_t); break; } - return special_hex_number(buf, end, - kptr_restrict_cleanse_addresses() ? 0UL : num, - size); + /* 'P' on the tail means don't restrict the pointer. */ + cleanse = cleanse && (fmt[decleanse_idx] != 'P'); + + return special_hex_number(buf, end, cleanse ? 0UL : num, size); } static noinline_for_stack -- 2.12.2