fix rejection of dns responses with pointers past 512 byte offset
[musl] / src / internal / pthread_impl.h
index 3c85544..de2b9d8 100644 (file)
@@ -5,20 +5,31 @@
 #include <signal.h>
 #include <errno.h>
 #include <limits.h>
+#include <sys/mman.h>
 #include "libc.h"
 #include "syscall.h"
 #include "atomic.h"
 #include "futex.h"
 
+#include "pthread_arch.h"
+
 #define pthread __pthread
 
 struct pthread {
        /* Part 1 -- these fields may be external or
         * internal (accessed via asm) ABI. Do not change. */
        struct pthread *self;
-       void **dtv, *unused1, *unused2;
+#ifndef TLS_ABOVE_TP
+       uintptr_t *dtv;
+#endif
+       struct pthread *prev, *next; /* non-ABI */
        uintptr_t sysinfo;
-       uintptr_t canary, canary2;
+#ifndef TLS_ABOVE_TP
+#ifdef CANARY_PAD
+       uintptr_t canary_pad;
+#endif
+       uintptr_t canary;
+#endif
 
        /* Part 2 -- implementation details, non-ABI. */
        int tid;
@@ -27,15 +38,12 @@ struct pthread {
        volatile int cancel;
        volatile unsigned char canceldisable, cancelasync;
        unsigned char tsd_used:1;
-       unsigned char unblock_cancel:1;
        unsigned char dlerror_flag:1;
        unsigned char *map_base;
        size_t map_size;
        void *stack;
        size_t stack_size;
        size_t guard_size;
-       void *start_arg;
-       void *(*start)(void *);
        void *result;
        struct __ptcb *cancelbuf;
        void **tsd;
@@ -44,6 +52,7 @@ struct pthread {
                long off;
                volatile void *volatile pending;
        } robust_list;
+       int h_errno_val;
        volatile int timer_id;
        locale_t locale;
        volatile int killlock[1];
@@ -52,16 +61,10 @@ struct pthread {
 
        /* Part 3 -- the positions of these fields relative to
         * the end of the structure is external and internal ABI. */
-       uintptr_t canary_at_end;
-       void **dtv_copy;
-};
-
-struct start_sched_args {
-       void *start_arg;
-       void *(*start_fn)(void *);
-       sigset_t mask;
-       pthread_attr_t *attr;
-       volatile int futex;
+#ifdef TLS_ABOVE_TP
+       uintptr_t canary;
+       uintptr_t *dtv;
+#endif
 };
 
 enum {
@@ -69,12 +72,6 @@ enum {
        DT_EXITING,
        DT_JOINABLE,
        DT_DETACHED,
-       DT_DYNAMIC,
-};
-
-struct __timer {
-       int timerid;
-       pthread_t thread;
 };
 
 #define __SU (sizeof(size_t)/sizeof(int))
@@ -109,16 +106,22 @@ struct __timer {
 #define _b_waiters2 __u.__vi[4]
 #define _b_inst __u.__p[3]
 
-#include "pthread_arch.h"
-
-#ifndef CANARY
-#define CANARY canary
+#ifndef TP_OFFSET
+#define TP_OFFSET 0
 #endif
 
 #ifndef DTP_OFFSET
 #define DTP_OFFSET 0
 #endif
 
+#ifdef TLS_ABOVE_TP
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
+#define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET))
+#else
+#define TP_ADJ(p) (p)
+#define __pthread_self() ((pthread_t)__get_tp())
+#endif
+
 #ifndef tls_mod_off_t
 #define tls_mod_off_t size_t
 #endif
@@ -136,23 +139,32 @@ struct __timer {
         0x80000000 })
 
 void *__tls_get_addr(tls_mod_off_t *);
-hidden void *__tls_get_new(tls_mod_off_t *);
-int __init_tp(void *);
-void *__copy_tls(unsigned char *);
-void __reset_tls();
+hidden int __init_tp(void *);
+hidden void *__copy_tls(unsigned char *);
+hidden void __reset_tls();
 
-hidden int __clone(int (*)(void *), void *, int, void *, ...);
-int __set_thread_area(void *);
-int __libc_sigaction(int, const struct sigaction *, struct sigaction *);
-void __unmapself(void *, size_t);
+hidden void __membarrier_init(void);
+hidden void __dl_thread_cleanup(void);
+hidden void __testcancel();
+hidden void __do_cleanup_push(struct __ptcb *);
+hidden void __do_cleanup_pop(struct __ptcb *);
+hidden void __pthread_tsd_run_dtors();
+
+hidden void __pthread_key_delete_synccall(void (*)(void *), void *);
+hidden int __pthread_key_delete_impl(pthread_key_t);
 
-void __vm_wait(void);
-void __vm_lock(void);
-void __vm_unlock(void);
+extern hidden volatile size_t __pthread_tsd_size;
+extern hidden void *__pthread_tsd_main[];
+extern hidden volatile int __eintr_valid_flag;
 
-int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
-int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
-void __wait(volatile int *, volatile int *, int, int);
+hidden int __clone(int (*)(void *), void *, int, void *, ...);
+hidden int __set_thread_area(void *);
+hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *);
+hidden void __unmapself(void *, size_t);
+
+hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden void __wait(volatile int *, volatile int *, int, int);
 static inline void __wake(volatile void *addr, int cnt, int priv)
 {
        if (priv) priv = FUTEX_PRIVATE;
@@ -167,16 +179,26 @@ static inline void __futexwait(volatile void *addr, int val, int priv)
        __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0);
 }
 
-void __acquire_ptc(void);
-void __release_ptc(void);
-void __inhibit_ptc(void);
+hidden void __acquire_ptc(void);
+hidden void __release_ptc(void);
+hidden void __inhibit_ptc(void);
+
+hidden void __tl_lock(void);
+hidden void __tl_unlock(void);
+hidden void __tl_sync(pthread_t);
+
+extern hidden volatile int __thread_list_lock;
+
+extern hidden volatile int __abort_lock[1];
+
+extern hidden unsigned __default_stacksize;
+extern hidden unsigned __default_guardsize;
 
-void __block_all_sigs(void *);
-void __block_app_sigs(void *);
-void __restore_sigs(void *);
+#define DEFAULT_STACK_SIZE 131072
+#define DEFAULT_GUARD_SIZE 8192
 
-#define DEFAULT_STACK_SIZE 81920
-#define DEFAULT_GUARD_SIZE 4096
+#define DEFAULT_STACK_MAX (8<<20)
+#define DEFAULT_GUARD_MAX (1<<20)
 
 #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1)