Re: [PATCH] powerpc copy_siginfo_from_user32

2008-04-25 Thread Christoph Hellwig
On Sat, Apr 19, 2008 at 03:19:24PM -0700, Roland McGrath wrote:
 Hi.  I posted this before, but I don't see it in any of your powerpc.git
 trees.  Can you push this upstream ASAP?  It would make life easier for me
 trying to merge some more generic changes (that would break powerpc builds
 without this going in first).

Any chance you could re-submit the patch to switch powerpc to the
generic PTRACE_GETSIGINFO using this aswell?

___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


[PATCH] powerpc copy_siginfo_from_user32

2008-04-19 Thread Roland McGrath
Hi.  I posted this before, but I don't see it in any of your powerpc.git
trees.  Can you push this upstream ASAP?  It would make life easier for me
trying to merge some more generic changes (that would break powerpc builds
without this going in first).

Thanks,
Roland

---
[PATCH] powerpc copy_siginfo_from_user32

Define the copy_siginfo_from_user32 entry point for powerpc, so
that generic CONFIG_COMPAT code can call it.  We already had the
code rolled into compat_sys_rt_sigqueueinfo, this just moves it
out into the canonical function that other arch's define.

Signed-off-by: Roland McGrath [EMAIL PROTECTED]
---
 arch/powerpc/kernel/signal_32.c |   19 ---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index d840bc7..ad69434 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -621,6 +621,18 @@ int copy_siginfo_to_user32(struct compat_siginfo __user 
*d, siginfo_t *s)
 
 #define copy_siginfo_to_user   copy_siginfo_to_user32
 
+int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
+{
+   memset(to, 0, sizeof *to);
+
+   if (copy_from_user(to, from, 3*sizeof(int)) ||
+   copy_from_user(to-_sifields._pad,
+  from-_sifields._pad, SI_PAD_SIZE32))
+   return -EFAULT;
+
+   return 0;
+}
+
 /*
  * Note: it is necessary to treat pid and sig as unsigned ints, with the
  * corresponding cast to a signed int to insure that the proper conversion
@@ -634,9 +646,10 @@ long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, 
compat_siginfo_t __user *uinfo
int ret;
mm_segment_t old_fs = get_fs();
 
-   if (copy_from_user (info, uinfo, 3*sizeof(int)) ||
-   copy_from_user (info._sifields._pad, uinfo-_sifields._pad, 
SI_PAD_SIZE32))
-   return -EFAULT;
+   ret = copy_siginfo_from_user32(info, uinfo);
+   if (unlikely(ret))
+   return ret;
+
set_fs (KERNEL_DS);
/* The __user pointer cast is valid becasuse of the set_fs() */
ret = sys_rt_sigqueueinfo((int)pid, (int)sig, (siginfo_t __user *) 
info);
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev