aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2016-08-03 16:15:38 +0200
committerFlorian Weimer <fweimer@redhat.com>2016-08-03 16:15:38 +0200
commita2ff21f825adb8821eeb6145197fa8b9a8a60a58 (patch)
tree65f74b90eb0a005a278f80586b0ee001d358021b /sysdeps
parent5bc17330eb7667b96fee8baf3729c3310fa28b40 (diff)
downloadglibc-a2ff21f825adb8821eeb6145197fa8b9a8a60a58.tar
glibc-a2ff21f825adb8821eeb6145197fa8b9a8a60a58.tar.gz
glibc-a2ff21f825adb8821eeb6145197fa8b9a8a60a58.tar.bz2
glibc-a2ff21f825adb8821eeb6145197fa8b9a8a60a58.zip
elf: Avoid using memalign for TLS allocations [BZ #17730]
Instead of a flag which indicates the pointer can be freed, dtv_t now includes the pointer which should be freed. Due to padding, the size of dtv_t does not increase. To avoid using memalign, the new allocate_dtv_entry function allocates a sufficiently large buffer so that a sub-buffer can be found in it which starts with an aligned pointer. Both the aligned and original pointers are kept, the latter for calling free later.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/dl-dtv.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/sysdeps/generic/dl-dtv.h b/sysdeps/generic/dl-dtv.h
index 36c5c58cdd..39d8fe27de 100644
--- a/sysdeps/generic/dl-dtv.h
+++ b/sysdeps/generic/dl-dtv.h
@@ -19,15 +19,17 @@
#ifndef _DL_DTV_H
#define _DL_DTV_H
+struct dtv_pointer
+{
+ void *val; /* Pointer to data, or TLS_DTV_UNALLOCATED. */
+ void *to_free; /* Unaligned pointer, for deallocation. */
+};
+
/* Type for the dtv. */
typedef union dtv
{
size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
+ struct dtv_pointer pointer;
} dtv_t;
/* Value used for dtv entries for which the allocation is delayed. */