Re: [PATCH] do not export kernel's NULL #define to userspace

From: Lubos Lunak
Date: Wed Mar 21 2012 - 14:37:22 EST


On Wednesday 21 of March 2012, Arnd Bergmann wrote:
> On Wednesday 21 March 2012, Lubos Lunak wrote:
> > > If so, we might have to replace it with a __KERNEL_NULL constant
> > > or something, like we do for the stuff in linux/types.h, so we
> > > don't accidentally break user applications that rely on the
> > > header files to be self-contained.
> > >
> > > I think there is at least a NULL usage in linux/wireless.h and some
> > > netfilter headers.
> >
> > I see. How about the attached patch then?
>
> Strictly speaking, you should not include standard headers from kernel
> provided headers, and the problems would be similar to those before
> your patch: anyone who currently doesn't include <stddef.h> but has
> their own definition of NULL will still get a conflict from including
> a kernel header that includes <linux/stddef.h>.

I guess I should point out that I'm not a kernel developer, I simply want to
fix the problem that kernel headers redefine NULL to something suboptimal in
userspace. So I don't know what the requirements on the headers are from the
kernel side (and I wonder why you need your own NULL in the kernel when it
comes with the compiler).

Let me provide one more patch then, which only surrounds the NULL definition
by #ifndef NULL instead of bluntly doing #undef NULL. That way kernel should
keep using this NULL definition, while it won't be forced in userspace.

--
Lubos Lunak
l.lunak@xxxxxxx
From 96e2b6caa5c52daade79635270ce96ce764fcd31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= <l.lunak@xxxxxxx>
Date: Wed, 21 Mar 2012 19:32:02 +0100
Subject: [PATCH] do not redefine userspace's NULL #define
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

GCC's NULL is actually __null, which allows detecting some questionable
NULL usage and warn about it. Moreover each platform/compiler should have
its own stddef.h anyway (which is different from linux/stddef.h).
So there's no good reason to override what the compiler provides.
Keep the #define conditionally, in order to keep the headers self-contained.

Signed-off-by: LuboÅ LuÅÃk <l.lunak@xxxxxxx>
---
include/linux/stddef.h | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/include/linux/stddef.h b/include/linux/stddef.h
index 6a40c76..ce225a9 100644
--- a/include/linux/stddef.h
+++ b/include/linux/stddef.h
@@ -3,12 +3,13 @@

#include <linux/compiler.h>

-#undef NULL
+#ifndef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
+#endif

#ifdef __KERNEL__

--
1.7.7