x86-64: decode clone LDT user_desc entries for x86 processes
authorElliott Hughes <enh@google.com>
Sat, 5 Apr 2014 18:56:17 +0000 (11:56 -0700)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 9 Apr 2014 12:36:47 +0000 (12:36 +0000)
* mem.c [X86_64]: Include asm/ldt.h.
[X86_64] (print_ldt_entry, sys_modify_ldt, sys_set_thread_area,
sys_get_thread_area): Define.
* process.c [X86_64]: Include asm/ldt.h.
(sys_clone) [X86_64]: Decode LDT entry if current_personality == 1.

Signed-off-by: Elliott Hughes <enh@google.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
mem.c
process.c

diff --git a/mem.c b/mem.c
index 267773cc455bfa6d5977bd42f1f95d885594fe41..264faab4240c5c2a0e15db76aaccd0786546ba21 100644 (file)
--- a/mem.c
+++ b/mem.c
 #include "defs.h"
 #include <asm/mman.h>
 #include <sys/mman.h>
-#if defined(I386)
+#if defined(I386) || defined(X86_64)
 # include <asm/ldt.h>
 # ifdef HAVE_STRUCT_USER_DESC
 #  define modify_ldt_ldt_s user_desc
 # endif
-#endif
+#endif /* I386 || X86_64 */
 
 static unsigned long
 get_pagesize()
@@ -543,7 +543,7 @@ sys_getpagesize(struct tcb *tcp)
 }
 #endif
 
-#if defined(I386)
+#if defined(I386) || defined(X86_64)
 void
 print_ldt_entry(struct modify_ldt_ldt_s *ldt_entry)
 {
@@ -635,7 +635,7 @@ sys_get_thread_area(struct tcb *tcp)
        return 0;
 
 }
-#endif /* I386 */
+#endif /* I386 || X86_64 */
 
 #if defined(M68K)
 int
index e840fe20d913dac95711ad0be8e413739f5583fb..600a86b1c62c45f37cad55ad6634353d2c2728f4 100644 (file)
--- a/process.c
+++ b/process.c
@@ -491,13 +491,13 @@ static const struct xlat clone_flags[] = {
        XLAT_END
 };
 
-#ifdef I386
+#if defined I386 || defined X86_64
 # include <asm/ldt.h>
 #  ifdef HAVE_STRUCT_USER_DESC
 #   define modify_ldt_ldt_s user_desc
 #  endif
 extern void print_ldt_entry();
-#endif
+#endif /* I386 || X86_64 */
 
 #if defined IA64
 # define ARG_FLAGS     0
@@ -556,18 +556,23 @@ sys_clone(struct tcb *tcp)
                if (flags & CLONE_PARENT_SETTID)
                        tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
                if (flags & CLONE_SETTLS) {
-#ifdef I386
-                       struct modify_ldt_ldt_s copy;
-                       if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
-                               tprintf(", {entry_number:%d, ",
-                                       copy.entry_number);
-                               if (!verbose(tcp))
-                                       tprints("...}");
-                               else
-                                       print_ldt_entry(&copy);
+#if defined I386 || defined X86_64
+# ifndef I386
+                       if (current_personality == 1)
+# endif
+                       {
+                               struct modify_ldt_ldt_s copy;
+                               if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
+                                       tprintf(", {entry_number:%d, ",
+                                               copy.entry_number);
+                                       if (!verbose(tcp))
+                                               tprints("...}");
+                                       else
+                                               print_ldt_entry(&copy);
+                               }
                        }
                        else
-#endif
+#endif /* I386 || X86_64 */
                                tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
                }
                if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))