Fix struct siginfo

From: Andreas Jaeger (aj@suse.de)
Date: Wed Jan 19 2000 - 07:23:45 EST


Here's a patch against kernel 2.3.40pre6. It fixes struct siginfo. The
patch should have the following features:
- Full binary compatibility between older and newer kernels on ix86
  and arm. Since glibc already accesses uid as 32bit value in struct
  siginfo this gives compatibility with glibc.
- Fixes m68k - but m68k was broken in glibc anyway. I don't think
  anybody could have used this at all on m68k.

The other platforms don't have a problem.

The fix for struct siginfo in 2.3.39 was not necessary since uid_t was
already aligned on a 32bit boundary for ix86 and arm. This patch
basically just reverts the patches for struct siginfo which went into
2.3.39. Since siginfo is sent directly to a signal function without
any interference of the C library, we have to be very careful changing
it.

Linus, please apply this for 2.3.40.

Thanks,
Andreas

diff -ur linux/arch/arm/kernel/signal.c linux-2.4.40-6/arch/arm/kernel/signal.c
--- linux/arch/arm/kernel/signal.c Wed Jan 19 12:17:36 2000
+++ linux-2.4.40-6/arch/arm/kernel/signal.c Wed Jan 19 12:14:24 2000
@@ -18,7 +18,6 @@
 #include <linux/stddef.h>
 #include <linux/binfmts.h>
 #include <linux/tty.h>
-#include <linux/highuid.h>
 
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
@@ -502,7 +501,6 @@
                                 info.si_code = SI_USER;
                                 info.si_pid = current->p_pptr->pid;
                                 info.si_uid = current->p_pptr->uid;
- info.si_uid16 = high2lowuid(current->p_pptr->uid);
                         }
 
                         /* If the (new) signal is now blocked, requeue it. */
diff -ur linux/arch/i386/kernel/signal.c linux-2.4.40-6/arch/i386/kernel/signal.c
--- linux/arch/i386/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.4.40-6/arch/i386/kernel/signal.c Wed Jan 19 12:14:24 2000
@@ -19,7 +19,6 @@
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/stddef.h>
-#include <linux/highuid.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 
@@ -643,7 +642,6 @@
                                 info.si_code = SI_USER;
                                 info.si_pid = current->p_pptr->pid;
                                 info.si_uid = current->p_pptr->uid;
- info.si_uid16 = high2lowuid(current->p_pptr->uid);
                         }
 
                         /* If the (new) signal is now blocked, requeue it. */
diff -ur linux/arch/m68k/kernel/signal.c linux-2.4.40-6/arch/m68k/kernel/signal.c
--- linux/arch/m68k/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.4.40-6/arch/m68k/kernel/signal.c Wed Jan 19 12:14:24 2000
@@ -37,7 +37,6 @@
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/stddef.h>
-#include <linux/highuid.h>
 
 #include <asm/setup.h>
 #include <asm/uaccess.h>
@@ -1049,7 +1048,6 @@
                                 info.si_code = SI_USER;
                                 info.si_pid = current->p_pptr->pid;
                                 info.si_uid = current->p_pptr->uid;
- info.si_uid16 = high2lowuid(current->p_pptr->uid);
                         }
 
                         /* If the (new) signal is now blocked, requeue it. */
diff -ur linux/include/asm-arm/siginfo.h linux-2.4.40-6/include/asm-arm/siginfo.h
--- linux/include/asm-arm/siginfo.h Tue Jan 11 03:15:58 2000
+++ linux-2.4.40-6/include/asm-arm/siginfo.h Wed Jan 19 12:14:24 2000
@@ -24,8 +24,7 @@
                 /* kill() */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
- uid_t _uid32; /* sender's uid */
+ uid_t _uid; /* sender's uid */
                 } _kill;
 
                 /* POSIX.1b timers */
@@ -37,19 +36,17 @@
                 /* POSIX.1b signals */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         sigval_t _sigval;
- uid_t _uid32; /* sender's uid */
                 } _rt;
 
                 /* SIGCHLD */
                 struct {
                         pid_t _pid; /* which child */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         int _status; /* exit code */
                         clock_t _utime;
                         clock_t _stime;
- uid_t _uid32; /* sender's uid */
                 } _sigchld;
 
                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
@@ -65,18 +62,11 @@
         } _sifields;
 } siginfo_t;
 
-#define UID16_SIGINFO_COMPAT_NEEDED
-
 /*
  * How these fields are to be accessed.
  */
 #define si_pid _sifields._kill._pid
-#ifdef __KERNEL__
-#define si_uid _sifields._kill._uid32
-#define si_uid16 _sifields._kill._uid
-#else
 #define si_uid _sifields._kill._uid
-#endif /* __KERNEL__ */
 #define si_status _sifields._sigchld._status
 #define si_utime _sifields._sigchld._utime
 #define si_stime _sifields._sigchld._stime
diff -ur linux/include/asm-i386/siginfo.h linux-2.4.40-6/include/asm-i386/siginfo.h
--- linux/include/asm-i386/siginfo.h Tue Jan 11 03:29:05 2000
+++ linux-2.4.40-6/include/asm-i386/siginfo.h Wed Jan 19 12:14:24 2000
@@ -24,8 +24,7 @@
                 /* kill() */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
- uid_t _uid32; /* sender's uid */
+ uid_t _uid; /* sender's uid */
                 } _kill;
 
                 /* POSIX.1b timers */
@@ -37,19 +36,17 @@
                 /* POSIX.1b signals */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         sigval_t _sigval;
- uid_t _uid32; /* sender's uid */
                 } _rt;
 
                 /* SIGCHLD */
                 struct {
                         pid_t _pid; /* which child */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         int _status; /* exit code */
                         clock_t _utime;
                         clock_t _stime;
- uid_t _uid32; /* sender's uid */
                 } _sigchld;
 
                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
@@ -65,18 +62,11 @@
         } _sifields;
 } siginfo_t;
 
-#define UID16_SIGINFO_COMPAT_NEEDED
-
 /*
  * How these fields are to be accessed.
  */
 #define si_pid _sifields._kill._pid
-#ifdef __KERNEL__
-#define si_uid _sifields._kill._uid32
-#define si_uid16 _sifields._kill._uid
-#else
 #define si_uid _sifields._kill._uid
-#endif /* __KERNEL__ */
 #define si_status _sifields._sigchld._status
 #define si_utime _sifields._sigchld._utime
 #define si_stime _sifields._sigchld._stime
diff -ur linux/include/asm-m68k/siginfo.h linux-2.4.40-6/include/asm-m68k/siginfo.h
--- linux/include/asm-m68k/siginfo.h Tue Jan 11 03:15:58 2000
+++ linux-2.4.40-6/include/asm-m68k/siginfo.h Wed Jan 19 12:14:24 2000
@@ -24,8 +24,7 @@
                 /* kill() */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
- uid_t _uid32; /* sender's uid */
+ uid_t _uid; /* sender's uid */
                 } _kill;
 
                 /* POSIX.1b timers */
@@ -37,19 +36,17 @@
                 /* POSIX.1b signals */
                 struct {
                         pid_t _pid; /* sender's pid */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         sigval_t _sigval;
- uid_t _uid32; /* sender's uid */
                 } _rt;
 
                 /* SIGCHLD */
                 struct {
                         pid_t _pid; /* which child */
- old_uid_t _uid; /* backwards compatibility */
+ uid_t _uid; /* sender's uid */
                         int _status; /* exit code */
                         clock_t _utime;
                         clock_t _stime;
- uid_t _uid32; /* sender's uid */
                 } _sigchld;
 
                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
@@ -65,18 +62,11 @@
         } _sifields;
 } siginfo_t;
 
-#define UID16_SIGINFO_COMPAT_NEEDED
-
 /*
  * How these fields are to be accessed.
  */
 #define si_pid _sifields._kill._pid
-#ifdef __KERNEL__
-#define si_uid _sifields._kill._uid32
-#define si_uid16 _sifields._kill._uid
-#else
 #define si_uid _sifields._kill._uid
-#endif /* __KERNEL__ */
 #define si_status _sifields._sigchld._status
 #define si_utime _sifields._sigchld._utime
 #define si_stime _sifields._sigchld._stime
diff -ur linux/include/linux/highuid.h linux-2.4.40-6/include/linux/highuid.h
--- linux/include/linux/highuid.h Wed Jan 19 12:17:42 2000
+++ linux-2.4.40-6/include/linux/highuid.h Wed Jan 19 12:17:23 2000
@@ -63,13 +63,6 @@
 #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid)
 #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid)
 
-/* specific to kernel/signal.c */
-#ifdef UID16_SIGINFO_COMPAT_NEEDED
-#define SET_SIGINFO_UID16(var, uid) var = high2lowuid(uid)
-#else
-#define SET_SIGINFO_UID16(var, uid) do { ; } while (0)
-#endif
-
 #else
 
 #define SET_UID16(var, uid) do { ; } while (0)
@@ -81,8 +74,6 @@
 #define SET_OLDSTAT_GID(stat, gid) (stat).st_gid = gid
 #define SET_STAT_UID(stat, uid) (stat).st_uid = uid
 #define SET_STAT_GID(stat, gid) (stat).st_gid = gid
-
-#define SET_SIGINFO_UID16(var, uid) do { ; } while (0)
 
 #endif /* CONFIG_UID16 */
 
diff -ur linux/kernel/signal.c linux-2.4.40-6/kernel/signal.c
--- linux/kernel/signal.c Wed Jan 19 12:17:43 2000
+++ linux-2.4.40-6/kernel/signal.c Wed Jan 19 12:16:38 2000
@@ -12,7 +12,6 @@
 #include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <linux/sched.h>
-#include <linux/highuid.h>
 
 #include <asm/uaccess.h>
 
@@ -166,7 +165,6 @@
                         info->si_code = 0;
                         info->si_pid = 0;
                         info->si_uid = 0;
- SET_SIGINFO_UID16(info->si_uid16, 0);
                 }
 
                 if (reset)
@@ -325,7 +323,6 @@
                                 q->info.si_code = SI_USER;
                                 q->info.si_pid = current->pid;
                                 q->info.si_uid = current->uid;
- SET_SIGINFO_UID16(q->info.si_uid16, current->uid);
                                 break;
                         case 1:
                                 q->info.si_signo = sig;
@@ -333,7 +330,6 @@
                                 q->info.si_code = SI_KERNEL;
                                 q->info.si_pid = 0;
                                 q->info.si_uid = 0;
- SET_SIGINFO_UID16(q->info.si_uid16, 0);
                                 break;
                         default:
                                 q->info = *info;
@@ -783,7 +779,6 @@
         info.si_code = SI_USER;
         info.si_pid = current->pid;
         info.si_uid = current->uid;
- SET_SIGINFO_UID16(info.si_uid16, current->uid);
 
         return kill_something_info(sig, &info, pid);
 }

-- 
 Andreas Jaeger
  SuSE Labs aj@suse.de
   private aj@arthur.rhein-neckar.de

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jan 23 2000 - 21:00:20 EST