Fix uc_* namespace (bug 21457)

Submitted by Joseph S. Myers on Aug. 9, 2017, 3:59 p.m.

Details

Message ID alpine.DEB.2.20.1708091559300.18502@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph S. Myers Aug. 9, 2017, 3:59 p.m.
The standard members of ucontext_t, in all standard versions with that
type, are uc_link, uc_sigmask, uc_stack and uc_mcontext.

The uc_* namespace is mostly reserved for additions to the structure.
However, in XPG4.2, it's only reserved when <ucontext.h> is included,
not when <signal.h> is included, while <signal.h> is required to
define ucontext_t (but not allowed to make visible other symbols from
<ucontext.h>).  Thus, nonstandard members should avoid uc_* names.
Some already do use __uc_*, but others don't; most architectures (all
except ia64, I think) have a member uc_flags and some have additional
members beyond that.

This patch makes nonstandard members have an __ prefix unless
__USE_MISC is defined.  Members whose names indicate they are solely
padding / reserved for future use are renamed unconditionally to use
the __glibc_reserved1 naming convention.

This is part of the preparation for a revised version of the
mcontext_t / sigcontext patch to be able to eliminate all 13 of the
miscellaneous XFAILs in conform/Makefile, rather than only 11 of them
as at present (at least one further fix on top of this one will be
needed for that as well).

Tested for x86_64, and with build-many-glibcs.py.

2017-08-09  Joseph Myers  <joseph@codesourcery.com>

	[BZ #21457]
	* sysdeps/arm/sys/ucontext.h (__ctx): Move undefine further down.
	(ucontext_t): Use __ctx with uc_flags.  Rename uc_filler to
	__glibc_reserved1.
	* sysdeps/generic/sys/ucontext.h (__ctx): New macro.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/i386/sys/ucontext.h (__ctx): Move undefine further down.
	(__ctxt): Likewise.
	(ucontext_t): Use __ctx with uc_flags.  Rename uc_filler to
	__glibc_reserved1.
	* sysdeps/m68k/sys/ucontext.h (__ctx): Move undefine further down.
	(ucontext_t): Use __ctx with uc_flags.  Rename uc_filler to
	__glibc_reserved1.
	* sysdeps/mips/sys/ucontext.h (__ctx): Move undefine further down.
	(ucontext_t): Use __ctx with uc_flags.  Rename uc_filler to
	__glibc_reserved1.
	* sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h (__ctx): New
	macro.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/alpha/sys/ucontext.h (__ctx): New macro.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/arm/sys/ucontext.h (__ctx): New macro.
	(ucontext_t): Use __ctx with uc_flags and uc_regspace.
	* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h (__ctx): New macro.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h (__ctx): Move
	undefine further down.
	(ucontext_t): Use __ctx with uc_flags.  Rename uc_filler to
	__glibc_reserved1.
	* sysdeps/unix/sysv/linux/mips/sys/ucontext.h (__ctx): Move
	undefine further down.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h (__ctx): Move
	undefine further down.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h (ucontext_t): Use
	__ctx with uc_flags, uc_regs_ptr, uc_regs and uc_reg_space.
	Rename uc_pad to __glibc_reserved1.
	* sysdeps/unix/sysv/linux/s390/sys/ucontext.h (__ctx): Move
	undefine further down.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h (__ctx): Move undefine
	further down.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h (ucontext_t): Use
	__ctx with uc_flags.
	* sysdeps/unix/sysv/linux/tile/sys/ucontext.h (__ctx): New macro.
	(ucontext_t): Use __ctx with uc_flags.
	* sysdeps/unix/sysv/linux/x86/sys/ucontext.h (ucontext_t): Use
	__ctx with uc_flags.

Comments

Adhemerval Zanella Aug. 9, 2017, 5:30 p.m.
On 09/08/2017 12:59, Joseph Myers wrote:
> The standard members of ucontext_t, in all standard versions with that
> type, are uc_link, uc_sigmask, uc_stack and uc_mcontext.
> 
> The uc_* namespace is mostly reserved for additions to the structure.
> However, in XPG4.2, it's only reserved when <ucontext.h> is included,
> not when <signal.h> is included, while <signal.h> is required to
> define ucontext_t (but not allowed to make visible other symbols from
> <ucontext.h>).  Thus, nonstandard members should avoid uc_* names.
> Some already do use __uc_*, but others don't; most architectures (all
> except ia64, I think) have a member uc_flags and some have additional
> members beyond that.
> 
> This patch makes nonstandard members have an __ prefix unless
> __USE_MISC is defined.  Members whose names indicate they are solely
> padding / reserved for future use are renamed unconditionally to use
> the __glibc_reserved1 naming convention.
> 
> This is part of the preparation for a revised version of the
> mcontext_t / sigcontext patch to be able to eliminate all 13 of the
> miscellaneous XFAILs in conform/Makefile, rather than only 11 of them
> as at present (at least one further fix on top of this one will be
> needed for that as well).
> 
> Tested for x86_64, and with build-many-glibcs.py.

LGTM.

Patch hide | download patch | download mbox

diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/sys/ucontext.h
index 464a353..da749a9 100644
--- a/sysdeps/arm/sys/ucontext.h
+++ b/sysdeps/arm/sys/ucontext.h
@@ -95,17 +95,17 @@  typedef struct
     fpregset_t __ctx(fpregs);
   } mcontext_t;
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     sigset_t uc_sigmask;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
-    long int uc_filler[5];
+    long int __glibc_reserved1[5];
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/generic/sys/ucontext.h
index e4679d3..ec5ab94 100644
--- a/sysdeps/generic/sys/ucontext.h
+++ b/sysdeps/generic/sys/ucontext.h
@@ -31,14 +31,22 @@ 
 
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h
index be8c7e5..27f5e48 100644
--- a/sysdeps/i386/sys/ucontext.h
+++ b/sysdeps/i386/sys/ucontext.h
@@ -122,18 +122,18 @@  typedef struct
     fpregset_t __ctx(fpregs);
   } mcontext_t;
 
-#undef __ctx
-#undef __ctxt
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     sigset_t uc_sigmask;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
-    long int uc_filler[5];
+    long int __glibc_reserved1[5];
   } ucontext_t;
 
+#undef __ctx
+#undef __ctxt
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h
index 00c4af4..9d2b2c6 100644
--- a/sysdeps/m68k/sys/ucontext.h
+++ b/sysdeps/m68k/sys/ucontext.h
@@ -106,8 +106,6 @@  typedef struct
   gregset_t __ctx(gregs);
 } mcontext_t;
 
-#undef __ctx
-
 #ifdef __USE_MISC
 # define MCONTEXT_VERSION 1
 #endif
@@ -115,12 +113,14 @@  typedef struct
 /* Userlevel context.  */
 typedef struct ucontext_t
 {
-  unsigned long int uc_flags;
+  unsigned long int __ctx(uc_flags);
   struct ucontext_t *uc_link;
   sigset_t uc_sigmask;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  long int uc_filler[201];
+  long int __glibc_reserved1[201];
 } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h
index d69656b..8248f59 100644
--- a/sysdeps/mips/sys/ucontext.h
+++ b/sysdeps/mips/sys/ucontext.h
@@ -156,21 +156,21 @@  typedef struct
   fpregset_t __ctx(fpregs);
 } mcontext_t;
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
 {
 #if _MIPS_SIM == _ABIO32
-  unsigned long int uc_flags;
+  unsigned long int __ctx(uc_flags);
 #else
-  __uint64_t uc_flags;
+  __uint64_t __ctx(uc_flags);
 #endif
   struct ucontext_t *uc_link;
   sigset_t uc_sigmask;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  int uc_filler[48];
+  int __glibc_reserved1[48];
 } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
index 4f602fc..62ba382 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
@@ -46,14 +46,22 @@  typedef elf_fpregset_t	fpregset_t;
    during non-RT signal handlers).  */
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long uc_flags;
+    unsigned long __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     sigset_t uc_sigmask;
     mcontext_t uc_mcontext;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
index bf95205..af20177 100644
--- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
@@ -53,10 +53,16 @@  typedef fpreg_t fpregset_t[__NFPREG];
 /* A machine context is exactly a sigcontext.  */
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     unsigned long __uc_osf_sigmask;
     stack_t uc_stack;
@@ -64,4 +70,6 @@  typedef struct ucontext_t
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
index 1083d66..2abceef 100644
--- a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
@@ -100,15 +100,23 @@  typedef struct _libc_fpstate fpregset_t;
    during non-RT signal handlers).  */
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long uc_flags;
+    unsigned long __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
-    unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
+    unsigned long __ctx(uc_regspace)[128] __attribute__((__aligned__(8)));
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
index 2fd7e91..91b7b16 100644
--- a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
@@ -54,14 +54,22 @@  typedef struct fpregset
 /* Context to describe whole processor state.  */
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
index 1f807b5..3d3e8d4 100644
--- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
@@ -111,8 +111,6 @@  typedef struct
   fpregset_t __ctx(fpregs);
 } mcontext_t;
 
-#undef __ctx
-
 #ifdef __USE_MISC
 # define MCONTEXT_VERSION 2
 #endif
@@ -120,12 +118,14 @@  typedef struct
 /* Userlevel context.  */
 typedef struct ucontext_t
 {
-  unsigned long uc_flags;
+  unsigned long __ctx(uc_flags);
   struct ucontext_t *uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  unsigned long uc_filler[80];
+  unsigned long __glibc_reserved1[80];
   sigset_t uc_sigmask;
 } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
index d17aa71..27ae9a9 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
@@ -110,16 +110,16 @@  typedef struct
   } mcontext_t;
 #endif
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
index 09e473c..b6ad1a3 100644
--- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
@@ -47,16 +47,16 @@  typedef struct
     unsigned long __ctx(regs)[32];
   } mcontext_t;
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long uc_flags;
+    unsigned long __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
index 54fe9df..3a56082 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
@@ -150,7 +150,7 @@  typedef struct {
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
 #if __WORDSIZE == 32
@@ -177,13 +177,14 @@  typedef struct ucontext_t
      * old ucontext_t; it ensures that uc_mcontext.regs and uc_sigmask
      * are at the same offset as previously.
      */
-    int uc_pad[7];
-    union uc_regs_ptr {
+    int __glibc_reserved1[7];
+    union __ctx(uc_regs_ptr) {
       struct __ctx(pt_regs) *__ctx(regs);
-      mcontext_t *uc_regs;
+      mcontext_t *__ctx(uc_regs);
     } uc_mcontext;
     sigset_t    uc_sigmask;
-    char uc_reg_space[sizeof(mcontext_t) + 12];  /* last for extensibility */
+    /* last for extensibility */
+    char __ctx(uc_reg_space)[sizeof(mcontext_t) + 12];
 #else /* 64-bit */
     sigset_t    uc_sigmask;
     mcontext_t  uc_mcontext;  /* last for extensibility */
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
index d6bf4d8..88b74b6 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
@@ -80,17 +80,17 @@  typedef struct
     fpregset_t __ctx(fpregs);
   } mcontext_t;
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
index 2f42d3a..c838d80 100644
--- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
@@ -112,16 +112,16 @@  typedef struct
     unsigned int __ctx(ownedfp);
   } mcontext_t;
 
-#undef __ctx
-
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
index 9932ed4..9a3eacd 100644
--- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
@@ -94,7 +94,7 @@  typedef struct {
 
 typedef struct ucontext_t {
 	struct ucontext_t	*uc_link;
-	unsigned long		uc_flags;
+	unsigned long		__ctx(uc_flags);
 	unsigned long		__uc_sigmask;
 	mcontext_t		uc_mcontext;
 	stack_t			uc_stack;
@@ -294,7 +294,7 @@  typedef struct
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long   uc_flags;
+    unsigned long   __ctx(uc_flags);
     struct ucontext_t *uc_link;
     sigset_t	    uc_sigmask;
     stack_t         uc_stack;
diff --git a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
index fcbe3ff..b70dae7 100644
--- a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
@@ -59,14 +59,22 @@  enum
 /* A machine context is exactly a sigcontext.  */
 typedef struct sigcontext mcontext_t;
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
     sigset_t uc_sigmask;
   } ucontext_t;
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
index f4f5c94..6d8137e 100644
--- a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
@@ -141,7 +141,7 @@  typedef struct
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;
@@ -245,7 +245,7 @@  typedef struct
 /* Userlevel context.  */
 typedef struct ucontext_t
   {
-    unsigned long int uc_flags;
+    unsigned long int __ctx(uc_flags);
     struct ucontext_t *uc_link;
     stack_t uc_stack;
     mcontext_t uc_mcontext;