Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/compat personality() now interprets its parameter as having



details:   https://anonhg.NetBSD.org/src/rev/0f5500c1a1e7
branches:  trunk
changeset: 758342:0f5500c1a1e7
user:      chs <chs%NetBSD.org@localhost>
date:      Tue Nov 02 18:18:07 2010 +0000

description:
personality() now interprets its parameter as having
the base personality type in the low byte and
various flags in the upper bytes.  for now just mask off
the flags to make sure the base type is one we accept.
store the current personality in the emuldata so that
we can return the expected value for PER_QUERY.

diffstat:

 sys/compat/linux/common/linux_emuldata.h |   3 ++-
 sys/compat/linux/common/linux_misc.c     |  21 ++++++++++++++++-----
 sys/compat/linux/common/linux_misc.h     |  10 +++++++---
 sys/compat/linux32/common/linux32_misc.c |  18 +++++-------------
 4 files changed, 30 insertions(+), 22 deletions(-)

diffs (131 lines):

diff -r 87b5f2404dda -r 0f5500c1a1e7 sys/compat/linux/common/linux_emuldata.h
--- a/sys/compat/linux/common/linux_emuldata.h  Tue Nov 02 18:15:39 2010 +0000
+++ b/sys/compat/linux/common/linux_emuldata.h  Tue Nov 02 18:18:07 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_emuldata.h,v 1.17 2010/07/07 01:30:35 chs Exp $  */
+/*     $NetBSD: linux_emuldata.h,v 1.18 2010/11/02 18:18:07 chs Exp $  */
 
 /*-
  * Copyright (c) 1998,2002 The NetBSD Foundation, Inc.
@@ -48,6 +48,7 @@
        void    *led_child_tidptr;      /* Used during clone() */
        void    *led_clear_tid;         /* Own TID to clear on exit */
        struct linux_robust_list_head *led_robust_head;
+       long    led_personality;
 };
 
 #endif /* !_COMMON_LINUX_EMULDATA_H */
diff -r 87b5f2404dda -r 0f5500c1a1e7 sys/compat/linux/common/linux_misc.c
--- a/sys/compat/linux/common/linux_misc.c      Tue Nov 02 18:15:39 2010 +0000
+++ b/sys/compat/linux/common/linux_misc.c      Tue Nov 02 18:18:07 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_misc.c,v 1.217 2010/09/11 20:53:04 chs Exp $     */
+/*     $NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $     */
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.217 2010/09/11 20:53:04 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -929,16 +929,27 @@
        /* {
                syscallarg(unsigned long) per;
        } */
+       struct linux_emuldata *led;
+       int per;
 
-       switch (SCARG(uap, per)) {
+       per = SCARG(uap, per);
+       led = l->l_emuldata;
+       if (per == LINUX_PER_QUERY) {
+               retval[0] = led->led_personality;
+               return 0;
+       }
+        
+       switch (per & LINUX_PER_MASK) {
        case LINUX_PER_LINUX:
-       case LINUX_PER_QUERY:
+       case LINUX_PER_LINUX32:
+               led->led_personality = per;
                break;
+
        default:
                return EINVAL;
        }
 
-       retval[0] = LINUX_PER_LINUX;
+       retval[0] = per;
        return 0;
 }
 
diff -r 87b5f2404dda -r 0f5500c1a1e7 sys/compat/linux/common/linux_misc.h
--- a/sys/compat/linux/common/linux_misc.h      Tue Nov 02 18:15:39 2010 +0000
+++ b/sys/compat/linux/common/linux_misc.h      Tue Nov 02 18:18:07 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_misc.h,v 1.19 2009/01/19 13:31:40 njoly Exp $    */
+/*     $NetBSD: linux_misc.h,v 1.20 2010/11/02 18:18:07 chs Exp $      */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -123,9 +123,13 @@
 extern const int linux_fstypes_cnt;
 
 /* Personality types. */
-#define LINUX_PER_LINUX                0x00000000
-#define LINUX_PER_LINUX32      0x00000008
 #define LINUX_PER_QUERY                0xffffffff
+#define LINUX_PER_LINUX                0x00
+#define LINUX_PER_LINUX32      0x08
+#define LINUX_PER_MASK         0xff
+
+/* Personality flags. */
+#define LINUX_PER_ADDR_NO_RANDOMIZE    0x00040000
 
 #ifdef _KERNEL
 __BEGIN_DECLS
diff -r 87b5f2404dda -r 0f5500c1a1e7 sys/compat/linux32/common/linux32_misc.c
--- a/sys/compat/linux32/common/linux32_misc.c  Tue Nov 02 18:15:39 2010 +0000
+++ b/sys/compat/linux32/common/linux32_misc.c  Tue Nov 02 18:18:07 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux32_misc.c,v 1.20 2010/11/02 18:14:06 chs Exp $    */
+/*     $NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $    */
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.20 2010/11/02 18:14:06 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -223,18 +223,10 @@
        /* {
                syscallarg(netbsd32_u_long) per;
        } */
+       struct linux_sys_personality_args ua;
 
-       switch (SCARG(uap, per)) {
-       case LINUX_PER_LINUX:
-       case LINUX_PER_LINUX32:
-       case LINUX_PER_QUERY:
-               break;
-       default:
-               return EINVAL;
-       }
-
-       retval[0] = LINUX_PER_LINUX;
-       return 0;
+       NETBSD32TOX_UAP(per, long);
+       return linux_sys_personality(l, &ua, retval);
 }
 
 int



Home | Main Index | Thread Index | Old Index