siginfo broken in glibc
Andreas Jaeger
aj@suse.de
Wed Jan 19 03:02:00 GMT 2000
Here's a patch against kernel 2.3.39. It fixes struct siginfo. The
patch should have the following features:
- Full binary compatibility between older and newer kernels on ix86
and arm - and compatibility with current glibc
- Fixes m68k - but m68k was broken in glibc anyway.
Could I have a short feedback if this works on ix86, arm and m68k?
Chris, what do you think? I'd like to send this to Linus asap.
The other platforms shouldn't have a problem.
Andreas
diff -ur linux/arch/arm/kernel/signal.c linux-2.3.39/arch/arm/kernel/signal.c
--- linux/arch/arm/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/arch/arm/kernel/signal.c Wed Jan 19 11:17:53 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>
@@ -501,7 +500,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.3.39/arch/i386/kernel/signal.c
--- linux/arch/i386/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/arch/i386/kernel/signal.c Wed Jan 19 11:18:11 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.3.39/arch/m68k/kernel/signal.c
--- linux/arch/m68k/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/arch/m68k/kernel/signal.c Wed Jan 19 11:18:33 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.3.39/include/asm-arm/siginfo.h
--- linux/include/asm-arm/siginfo.h Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/include/asm-arm/siginfo.h Wed Jan 19 11:15:01 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.3.39/include/asm-i386/siginfo.h
--- linux/include/asm-i386/siginfo.h Tue Jan 11 03:29:05 2000
+++ linux-2.3.39/include/asm-i386/siginfo.h Wed Jan 19 11:13:21 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.3.39/include/asm-m68k/siginfo.h
--- linux/include/asm-m68k/siginfo.h Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/include/asm-m68k/siginfo.h Wed Jan 19 11:13:06 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/kernel/signal.c linux-2.3.39/kernel/signal.c
--- linux/kernel/signal.c Tue Jan 11 03:15:58 2000
+++ linux-2.3.39/kernel/signal.c Wed Jan 19 11:20:02 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>
@@ -144,7 +143,6 @@
info->si_code = 0;
info->si_pid = 0;
info->si_uid = 0;
- SET_UID16(info->si_uid16, 0);
} else {
struct signal_queue *q, **pp;
pp = ¤t->sigqueue;
@@ -180,7 +178,6 @@
info->si_code = 0;
info->si_pid = 0;
info->si_uid = 0;
- SET_UID16(info->si_uid16, 0);
}
}
@@ -343,7 +340,6 @@
q->info.si_code = SI_USER;
q->info.si_pid = current->pid;
q->info.si_uid = current->uid;
- SET_UID16(q->info.si_uid16, current->uid);
break;
case 1:
q->info.si_signo = sig;
@@ -351,7 +347,6 @@
q->info.si_code = SI_KERNEL;
q->info.si_pid = 0;
q->info.si_uid = 0;
- SET_UID16(q->info.si_uid16, 0);
break;
default:
q->info = *info;
@@ -801,7 +796,6 @@
info.si_code = SI_USER;
info.si_pid = current->pid;
info.si_uid = current->uid;
- SET_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
More information about the Libc-alpha
mailing list