Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xattr: guard against simultaneous glibc header inclusion

If the glibc xattr.h header is included after the uapi header,
compilation fails due to an enum re-using a #define from the uapi
header.

Protect against this by guarding the define and enum inclusions against
each other.

(See https://lists.debian.org/debian-glibc/2014/03/msg00029.html
and https://sourceware.org/glibc/wiki/Synchronizing_Headers
for more information.)

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Allan McRae <allan@archlinux.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Serge Hallyn and committed by
Linus Torvalds
ea1a8217 e9107f88

+16
+9
include/uapi/linux/libc-compat.h
··· 85 85 86 86 #endif /* _NETINET_IN_H */ 87 87 88 + /* Definitions for xattr.h */ 89 + #if defined(_SYS_XATTR_H) 90 + #define __UAPI_DEF_XATTR 0 91 + #else 92 + #define __UAPI_DEF_XATTR 1 93 + #endif 88 94 89 95 /* If we did not see any headers from any supported C libraries, 90 96 * or we are being included in the kernel, then define everything ··· 103 97 #define __UAPI_DEF_SOCKADDR_IN6 1 104 98 #define __UAPI_DEF_IPV6_MREQ 1 105 99 #define __UAPI_DEF_IPPROTO_V6 1 100 + 101 + /* Definitions for xattr.h */ 102 + #define __UAPI_DEF_XATTR 1 106 103 107 104 #endif /* __GLIBC__ */ 108 105
+7
include/uapi/linux/xattr.h
··· 7 7 Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. 8 8 Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> 9 9 */ 10 + 11 + #include <linux/libc-compat.h> 12 + 10 13 #ifndef _UAPI_LINUX_XATTR_H 11 14 #define _UAPI_LINUX_XATTR_H 12 15 16 + #ifdef __UAPI_DEF_XATTR 17 + #define __USE_KERNEL_XATTR_DEFS 18 + 13 19 #define XATTR_CREATE 0x1 /* set value, fail if attr already exists */ 14 20 #define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */ 21 + #endif 15 22 16 23 /* Namespaces */ 17 24 #define XATTR_OS2_PREFIX "os2."