lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <545CF847.3020409@linaro.org>
Date:	Fri, 07 Nov 2014 16:50:15 +0000
From:	Daniel Thompson <daniel.thompson@...aro.org>
To:	Joe Perches <joe@...ches.com>
CC:	Jason Wessel <jason.wessel@...driver.com>,
	linux-kernel@...r.kernel.org, kgdb-bugreport@...ts.sourceforge.net,
	Andrew Morton <akpm@...ux-foundation.org>,
	Ingo Molnar <mingo@...hat.com>, patches@...aro.org,
	linaro-kernel@...ts.linaro.org,
	John Stultz <john.stultz@...aro.org>,
	Sumit Semwal <sumit.semwal@...aro.org>, stable@...r.kernel.org
Subject: Re: [PATCH v2 3.18-rc3] kdb: Avoid printing KERN_ levels to consoles

On 07/11/14 16:04, Joe Perches wrote:
> On Fri, 2014-11-07 at 12:01 +0000, Daniel Thompson wrote:
>> Currently when kdb traps printk messages then the raw log level prefix
>> (consisting of '\001' followed by a numeral) does not get stripped off
>> before the message is issued to the various I/O handlers supported by
>> kdb. This causes annoying visual noise as well as causing problems
>> grepping for ^. It is also a change of behaviour compared to normal usage
>> of printk() usage. For example <SysRq>-h ends up with different output to
>> that of kdb's "sr h".
>>
>> This patch addresses the problem by stripping log levels from messages
>> before they are issued to the I/O handlers. printk() which can also
>> act as an i/o handler in some cases is special cased; if the caller
>> provided a log level then this will be preserved when sent to printk().
>>
>> The addition of non-printable characters to the output of kdb commands is a
>> regression, albeit and extremely elderly one, introduced by commit
>> 04d2c8c83d0e ("printk: convert the format for KERN_<LEVEL> to a 2 byte
>> pattern"). Note also that this patch does *not* restore the original
>> behaviour from v3.5. Instead it makes printk() from within a kdb command
>> display the message without any prefix (i.e. like printk() normally does).
> []
>> diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
> []
>> @@ -711,7 +712,10 @@ kdb_printit:
>>  	if (logging) {
>>  		saved_loglevel = console_loglevel;
>>  		console_loglevel = CONSOLE_LOGLEVEL_SILENT;
>> -		printk(KERN_INFO "%s", kdb_buffer);
>> +		if (cp == kdb_buffer)
>> +			printk(KERN_INFO "%s", kdb_buffer);
>> +		else
>> +			printk("%s", kdb_buffer);
> 
> The first part of the patch seem fine, but I'm
> confused about this bit above.
> 
> Here, isn't the "if (cp == kdb_buffer)" unnecessary?
> 
> if "(cp != kdb_buffer)", the buffer does have
> a prefix and it's emitted.
> 
> If (cp == kdb_buffer), the buffer does _not_ have
> a prefix (meaning it's either a naked printk or
> a continuation line. (KERN_CONT is "")
> 
> So why insert KERN_INFO?

vkdb_printf() and  printk() can appear either way round in a stack
trace. Each is capable of calling the other and a flag (kdb_trap_printk)
is used to prevent mutual recursion.

Messages that originate from with kdb itself start life as direct call
to (v)kdb_printf() and are not prefixed. If these messages are logged
then they are supposed to be tagged KERN_INFO hence the little dance here.

Before my patch then printk() messages would receive a double log header
if they were copied to the log (they would unconditionally have
KERN_INFO tacked in front of them). My patch does better and preserves
log levels where this is possible. However there are cases when logging
printk() continuations that data could be tagged with an unexpected log
level.

A complete solution would require a means to know whether vkdb_printf()
were entered directly or from printk(). A flag passed to vkdb_printf()
would achieve this. I'll take a look.


Daniel.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ