Deprecate inclusion of <sys/sysmacros.h> by <sys/types.h>

The macros defined by <sys/sysmacros.h> are not part of POSIX nor XSI, and
their names frequently collide with user code; see for instance glibc bug
19239 and Red Hat bug 130601.  <stdlib.h> includes <sys/types.h> under
_GNU_SOURCE, and C++ code presently cannot avoid being compiled under
_GNU_SOURCE, exacerbating the problem.

	* NEWS: Inclusion of <sys/sysmacros.h> by <sys/types.h> is deprecated.
	* misc/sys/sysmacros.h: If __SYSMACROS_DEPRECATED_INCLUSION is defined,
	define major, minor, and makedev to issue deprecation warnings on use.
	If __SYSMACROS_DEPRECATED_INCLUSION is *not* defined, suppress
	previously-activated deprecation warnings for these macros and prevent
	subsequent inclusions of this header from having any effect.
	* posix/sys/types.h: Define __SYSMACROS_DEPRECATED_INCLUSION before
	including <sys/sysmacros.h>, and undefine it again afterward.
This commit is contained in:
Zack Weinberg 2016-05-10 11:07:42 -04:00
parent 63eb8df85a
commit dbab6577c6
4 changed files with 88 additions and 4 deletions

View File

@ -1,3 +1,15 @@
2016-08-03 Zack Weinberg <zackw@panix.com>
[BZ #19239]
* NEWS: Inclusion of <sys/sysmacros.h> by <sys/types.h> is deprecated.
* misc/sys/sysmacros.h: If __SYSMACROS_DEPRECATED_INCLUSION is defined,
define major, minor, and makedev to issue deprecation warnings on use.
If __SYSMACROS_DEPRECATED_INCLUSION is *not* defined, suppress
previously-activated deprecation warnings for these macros and prevent
subsequent inclusions of this header from having any effect.
* posix/sys/types.h: Define __SYSMACROS_DEPRECATED_INCLUSION before
including <sys/sysmacros.h>, and undefine it again afterward.
2016-08-03 Zack Weinberg <zackw@panix.com> 2016-08-03 Zack Weinberg <zackw@panix.com>
* sysdeps/generic/sys/sysmacros.h: Delete file. * sysdeps/generic/sys/sysmacros.h: Delete file.

10
NEWS
View File

@ -17,6 +17,16 @@ Version 2.25
from that TS. Note that most features from that TS are not supported by from that TS. Note that most features from that TS are not supported by
the GNU C Library. the GNU C Library.
* The inclusion of <sys/sysmacros.h> by <sys/types.h> is deprecated. This
means that in a future release, the macros “major”, “minor”, and “makedev”
will only be available from <sys/sysmacros.h>.
These macros are not part of POSIX nor XSI, and their names frequently
collide with user code; see for instance glibc bug 19239 and Red Hat bug
130601. <stdlib.h> includes <sys/types.h> under _GNU_SOURCE, and C++ code
presently cannot avoid being compiled under _GNU_SOURCE, exacerbating the
problem.
Security related changes: Security related changes:
[Add security related changes here] [Add security related changes here]

View File

@ -16,6 +16,23 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifndef _SYS_SYSMACROS_H_OUTER
#ifndef __SYSMACROS_DEPRECATED_INCLUSION
# define _SYS_SYSMACROS_H_OUTER 1
#endif
/* If <sys/sysmacros.h> is included after <sys/types.h>, these macros
will already be defined, and we need to redefine them without the
deprecation warnings. (If they are included in the opposite order,
the outer #ifndef will suppress this entire file and the macros
will be usable without warnings.) */
#undef major
#undef minor
#undef makedev
/* This is the macro that must be defined to satisfy the misuse check
in bits/sysmacros.h. */
#ifndef _SYS_SYSMACROS_H #ifndef _SYS_SYSMACROS_H
#define _SYS_SYSMACROS_H 1 #define _SYS_SYSMACROS_H 1
@ -23,32 +40,65 @@
#include <bits/types.h> #include <bits/types.h>
#include <bits/sysmacros.h> #include <bits/sysmacros.h>
/* The extra "\n " moves gcc's [-Wdeprecated-declarations] annotation
onto the next line. */
#define __SYSMACROS_DEPRECATION_MSG(symbol) \
"\n In the GNU C Library, `" #symbol "' is defined by <sys/sysmacros.h>." \
"\n For historical compatibility, it is currently defined by" \
"\n <sys/types.h> as well, but we plan to remove this soon." \
"\n To use `" #symbol "', include <sys/sysmacros.h> directly." \
"\n If you did not intend to use a system-defined macro `" #symbol "'," \
"\n you should #undef it after including <sys/types.h>." \
"\n "
#define __SYSMACROS_DECL_TEMPL(rtype, name, proto) \ #define __SYSMACROS_DECL_TEMPL(rtype, name, proto) \
extern rtype gnu_dev_##name proto __THROW __attribute_const__; extern rtype gnu_dev_##name proto __THROW __attribute_const__;
#define __SYSMACROS_FST_DECL_TEMPL(rtype, name, proto) \
extern rtype __REDIRECT_NTH (__##name##_from_sys_types, proto, \
gnu_dev_##name) \
__attribute_const__ \
__attribute_deprecated_msg__ (__SYSMACROS_DEPRECATION_MSG (name));
#define __SYSMACROS_IMPL_TEMPL(rtype, name, proto) \ #define __SYSMACROS_IMPL_TEMPL(rtype, name, proto) \
__extension__ __extern_inline __attribute_const__ rtype \ __extension__ __extern_inline __attribute_const__ rtype \
__NTH (gnu_dev_##name proto) __NTH (gnu_dev_##name proto)
#define __SYSMACROS_FST_IMPL_TEMPL(rtype, name, proto) \
__extension__ __extern_inline __attribute_const__ rtype \
__NTH (__##name##_from_sys_types proto)
__BEGIN_DECLS __BEGIN_DECLS
__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL) __SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL)
__SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL) __SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL)
__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL) __SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL)
__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_FST_DECL_TEMPL)
__SYSMACROS_DECLARE_MINOR (__SYSMACROS_FST_DECL_TEMPL)
__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_FST_DECL_TEMPL)
#ifdef __USE_EXTERN_INLINES #ifdef __USE_EXTERN_INLINES
__SYSMACROS_DEFINE_MAJOR (__SYSMACROS_IMPL_TEMPL) __SYSMACROS_DEFINE_MAJOR (__SYSMACROS_IMPL_TEMPL)
__SYSMACROS_DEFINE_MINOR (__SYSMACROS_IMPL_TEMPL) __SYSMACROS_DEFINE_MINOR (__SYSMACROS_IMPL_TEMPL)
__SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_IMPL_TEMPL) __SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_IMPL_TEMPL)
__SYSMACROS_DEFINE_MAJOR (__SYSMACROS_FST_IMPL_TEMPL)
__SYSMACROS_DEFINE_MINOR (__SYSMACROS_FST_IMPL_TEMPL)
__SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_FST_IMPL_TEMPL)
#endif #endif
__END_DECLS __END_DECLS
#endif /* _SYS_SYSMACROS_H */
#ifndef __SYSMACROS_NEED_IMPLEMENTATION #ifndef __SYSMACROS_NEED_IMPLEMENTATION
# undef __SYSMACROS_DECL_TEMPL # undef __SYSMACROS_DECL_TEMPL
# undef __SYSMACROS_FST_DECL_TEMPL
# undef __SYSMACROS_IMPL_TEMPL # undef __SYSMACROS_IMPL_TEMPL
# undef __SYSMACROS_FST_IMPL_TEMPL
# undef __SYSMACROS_DECLARE_MAJOR # undef __SYSMACROS_DECLARE_MAJOR
# undef __SYSMACROS_DECLARE_MINOR # undef __SYSMACROS_DECLARE_MINOR
# undef __SYSMACROS_DECLARE_MAKEDEV # undef __SYSMACROS_DECLARE_MAKEDEV
@ -57,8 +107,14 @@ __END_DECLS
# undef __SYSMACROS_DEFINE_MAKEDEV # undef __SYSMACROS_DEFINE_MAKEDEV
#endif #endif
#define major(dev) gnu_dev_major (dev) #ifdef __SYSMACROS_DEPRECATED_INCLUSION
#define minor(dev) gnu_dev_minor (dev) # define major(dev) __major_from_sys_types (dev)
#define makedev(maj, min) gnu_dev_makedev (maj, min) # define minor(dev) __minor_from_sys_types (dev)
# define makedev(maj, min) __makedev_from_sys_types (maj, min)
#else
# define major(dev) gnu_dev_major (dev)
# define minor(dev) gnu_dev_minor (dev)
# define makedev(maj, min) gnu_dev_makedev (maj, min)
#endif
#endif /* sys/sysmacros.h */ #endif /* sys/sysmacros.h */

View File

@ -218,8 +218,14 @@ typedef int register_t __attribute__ ((__mode__ (__word__)));
/* It also defines `fd_set' and the FD_* macros for `select'. */ /* It also defines `fd_set' and the FD_* macros for `select'. */
# include <sys/select.h> # include <sys/select.h>
/* BSD defines these symbols, so we follow. */ /* BSD defines `major', `minor', and `makedev' in this header.
However, these symbols are likely to collide with user code, so we are
going to stop defining them here in an upcoming release. Code that needs
these macros should include <sys/sysmacros.h> directly. Code that does
not need these macros should #undef them after including this header. */
# define __SYSMACROS_DEPRECATED_INCLUSION
# include <sys/sysmacros.h> # include <sys/sysmacros.h>
# undef __SYSMACROS_DEPRECATED_INCLUSION
#endif /* Use misc. */ #endif /* Use misc. */