Re: [Linux-kernel-mentees] [PATCH net] rds: Prevent kernel-infoleak in rds_notify_queue_get()

From: Jack Leadford
Date: Sat Aug 08 2020 - 18:57:47 EST


Hello!

Thanks to Jason for getting this conversation back on track.

Yes: in general, {} or a partial initializer /will/ zero padding bits.

However, there is a bug in some versions of GCC where {} will /not/ zero
padding bits; actually, Jason's test program in this mail https://lore.kernel.org/lkml/20200731143604.GF24045@xxxxxxxx/
has the right ingredients to trigger the bug, but the GCC
versions used are outside of the bug window. :)

For more details on these cases and more (including said GCC bug), see my paper at:

https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2019/october/padding-the-struct-how-a-compiler-optimization-can-disclose-stack-memory/

Hopefully this paper can serve as a helpful reference when these cases are encountered in the kernel.

Thank you.

Jack Leadford

On 8/3/20 4:06 PM, Jason Gunthorpe wrote:
On Sun, Aug 02, 2020 at 03:45:40PM -0700, Joe Perches wrote:
On Sun, 2020-08-02 at 19:28 -0300, Jason Gunthorpe wrote:
On Sun, Aug 02, 2020 at 03:23:58PM -0700, Joe Perches wrote:
On Sun, 2020-08-02 at 19:10 -0300, Jason Gunthorpe wrote:
On Sat, Aug 01, 2020 at 08:38:33AM +0300, Leon Romanovsky wrote:

I'm using {} instead of {0} because of this GCC bug.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119

This is why the {} extension exists..

There is no guarantee that the gcc struct initialization {}
extension also zeros padding.

We just went over this. Yes there is, C11 requires it.

c11 is not c90. The kernel uses c90.

The kernel already relies on a lot of C11/C99 features and
behaviors. For instance Linus just bumped the minimum compiler version
so that C11's _Generic is usable.

Why do you think this particular part of C11 shouldn't be relied on?

Jason