[PATCH] sanitize TLS API

Christoph Hellwig (hch@lst.de)
Tue, 30 Jul 2002 17:43:37 +0200


Currently sys_set_thread_area has a magic flags argument that might
change it's behaivour completly.

Split out the TLS_FLAG_CLEAR case that has nothing in common with the
rest into it's own syscall, sys_clear_thread_area and change the
second argument to int writable.

--- 1.39/arch/i386/kernel/entry.S Tue Jul 30 00:08:08 2002
+++ edited/arch/i386/kernel/entry.S Tue Jul 30 11:46:01 2002
@@ -753,6 +753,7 @@
.long sys_sched_setaffinity
.long sys_sched_getaffinity
.long sys_set_thread_area
+ .long sys_clear_thread_area

.rept NR_syscalls-(.-sys_call_table)/4
.long sys_ni_syscall
--- 1.29/arch/i386/kernel/process.c Mon Jul 29 04:07:12 2002
+++ edited/arch/i386/kernel/process.c Tue Jul 30 12:34:21 2002
@@ -831,38 +831,15 @@
/*
* Set the Thread-Local Storage area:
*/
-asmlinkage int sys_set_thread_area(unsigned long base, unsigned long flags)
+asmlinkage int sys_set_thread_area(unsigned long base, int writable)
{
struct thread_struct *t = &current->thread;
- int writable = 0;
- int cpu;
+ int cpu = get_cpu();

- /* do not allow unused flags */
- if (flags & ~TLS_FLAGS_MASK)
- return -EINVAL;
-
- /*
- * Clear the TLS?
- */
- if (flags & TLS_FLAG_CLEAR) {
- cpu = get_cpu();
- t->tls_desc.a = t->tls_desc.b = 0;
- load_TLS_desc(t, cpu);
- put_cpu();
- return 0;
- }
-
- if (flags & TLS_FLAG_WRITABLE)
- writable = 1;
-
- /*
- * We must not get preempted while modifying the TLS.
- */
- cpu = get_cpu();
+ writable = !!writable; /* must be one or zero */

- t->tls_desc.a = ((base & 0x0000ffff) << 16) | 0xffff;
-
- t->tls_desc.b = (base & 0xff000000) | ((base & 0x00ff0000) >> 16) |
+ t->tls_desc.a = ((base & 0x0000ffff) << 16) | 0xffff;
+ t->tls_desc.b = (base & 0xff000000) | ((base & 0x00ff0000) >> 16) |
0xf0000 | (writable << 9) | (1 << 15) |
(1 << 22) | (1 << 23) | 0x7000;

@@ -872,3 +849,17 @@
return TLS_ENTRY*8 + 3;
}

+
+/*
+ * Clear the Thread-Local Storage area:
+ */
+asmlinkage void sys_clear_thread_area(void)
+{
+ struct thread_struct *t = &current->thread;
+ int cpu = get_cpu();
+
+ t->tls_desc.a = t->tls_desc.b = 0;
+ load_TLS_desc(t, cpu);
+
+ put_cpu();
+}
--- 1.7/include/asm-i386/desc.h Mon Jul 29 04:07:52 2002
+++ edited/include/asm-i386/desc.h Tue Jul 30 11:48:40 2002
@@ -86,11 +86,6 @@
_set_tssldt_desc(&cpu_gdt_table[cpu][LDT_ENTRY], (int)addr, ((size << 3)-1), 0x82);
}

-#define TLS_FLAGS_MASK 0x00000003
-
-#define TLS_FLAG_WRITABLE 0x00000001
-#define TLS_FLAG_CLEAR 0x00000002
-
static inline void load_TLS_desc(struct thread_struct *t, unsigned int cpu)
{
cpu_gdt_table[cpu][TLS_ENTRY] = t->tls_desc;
--- 1.11/include/asm-i386/unistd.h Tue Jul 30 00:08:09 2002
+++ edited/include/asm-i386/unistd.h Tue Jul 30 11:47:20 2002
@@ -247,6 +247,8 @@
#define __NR_futex 240
#define __NR_sched_setaffinity 241
#define __NR_sched_getaffinity 242
+#define __NR_set_thread_area 243
+#define __NR_clear_thread_area 244

/* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */

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