update glibc-2.17-325.el7_9.src.rpm
This commit is contained in:
parent
8c29e492e2
commit
c7b30c9b24
5 changed files with 473 additions and 534 deletions
|
@ -1,42 +0,0 @@
|
||||||
From bc2f1d9fe282f49dc4e2e34f4e16e8f2550cbe5e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Chunmei Xu <xuchunmei@linux.alibaba.com>
|
|
||||||
Date: Wed, 15 Apr 2020 19:28:27 +0800
|
|
||||||
Subject: [PATCH] update glibc headers with the define EPOLLEXCLUSIVE
|
|
||||||
|
|
||||||
backport from https://github.com/bminor/glibc/commit/981569c74cbb6bafa2ddcefa6dd9dbdc938ff1c8?spm=a2o8d.corp_prod_issue_detail_v2.0.0.39f52ecf5LPs8j
|
|
||||||
|
|
||||||
Signed-off-by: Chunmei Xu <xuchunmei@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
ChangeLog | 5 +++++
|
|
||||||
sysdeps/unix/sysv/linux/sys/epoll.h | 2 ++
|
|
||||||
2 files changed, 7 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/ChangeLog b/ChangeLog
|
|
||||||
index 0f4f951..61a32c1 100644
|
|
||||||
--- a/ChangeLog
|
|
||||||
+++ b/ChangeLog
|
|
||||||
@@ -1,3 +1,8 @@
|
|
||||||
+2016-03-14 Joseph Myers <joseph@codesourcery.com>
|
|
||||||
+
|
|
||||||
+ * * sysdeps/unix/sysv/linux/sys/epoll.h (enum EPOLL_EVENTS): Add
|
|
||||||
+ EPOLLEXCLUSIVE.
|
|
||||||
+
|
|
||||||
2019-01-01 Joseph Myers <joseph@codesourcery.com>
|
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/syscall-names.list: Update kernel
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h
|
|
||||||
index 6c2f10a..67da9f7 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/sys/epoll.h
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/sys/epoll.h
|
|
||||||
@@ -61,6 +61,8 @@ enum EPOLL_EVENTS
|
|
||||||
#define EPOLLHUP EPOLLHUP
|
|
||||||
EPOLLRDHUP = 0x2000,
|
|
||||||
#define EPOLLRDHUP EPOLLRDHUP
|
|
||||||
+ EPOLLEXCLUSIVE = 1u << 28,
|
|
||||||
+#define EPOLLEXCLUSIVE EPOLLEXCLUSIVE
|
|
||||||
EPOLLWAKEUP = 1u << 29,
|
|
||||||
#define EPOLLWAKEUP EPOLLWAKEUP
|
|
||||||
EPOLLONESHOT = 1u << 30,
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
|
@ -1,479 +0,0 @@
|
||||||
# TCache backport from glibc 2.26.
|
|
||||||
# * A per-thread cache has been added to malloc. Access to the cache requires
|
|
||||||
# no locks and therefore significantly accelerates the fast path to allocate
|
|
||||||
# and free small amounts of memory. Refilling an empty cache requires locking
|
|
||||||
# the underlying arena. Performance measurements show significant gains in a
|
|
||||||
# wide variety of user workloads. Workloads were captured using a special
|
|
||||||
# instrumented malloc and analyzed with a malloc simulator. Contributed by
|
|
||||||
# DJ Delorie with the help of Florian Weimer, and Carlos O'Donell.
|
|
||||||
#Commit ID:
|
|
||||||
# d5c3fafc: Add per-thread cache to malloc
|
|
||||||
|
|
||||||
--- a/malloc/Makefile 2020-06-15 16:27:45.280396150 +0800
|
|
||||||
+++ b/malloc/Makefile 2020-06-15 17:25:17.790755014 +0800
|
|
||||||
@@ -169,6 +169,8 @@
|
|
||||||
tst-mcheck-ENV = MALLOC_CHECK_=3
|
|
||||||
tst-malloc-usable-ENV = MALLOC_CHECK_=3
|
|
||||||
|
|
||||||
+CPPFLAGS-malloc.c += -DUSE_TCACHE=1
|
|
||||||
+
|
|
||||||
# Uncomment this for test releases. For public releases it is too expensive.
|
|
||||||
#CPPFLAGS-malloc.o += -DMALLOC_DEBUG=1
|
|
||||||
|
|
||||||
diff -ru a/malloc/malloc.c b/malloc/malloc.c
|
|
||||||
--- a/malloc/malloc.c 2020-06-15 16:35:48.561998295 +0800
|
|
||||||
+++ b/malloc/malloc.c 2020-06-15 16:37:06.044822440 +0800
|
|
||||||
@@ -295,6 +295,31 @@
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+/* We want 64 entries. This is an arbitrary limit, which tunables can reduce. */
|
|
||||||
+# define TCACHE_MAX_BINS 64
|
|
||||||
+# define MAX_TCACHE_SIZE tidx2usize (TCACHE_MAX_BINS-1)
|
|
||||||
+
|
|
||||||
+/* Only used to pre-fill the tunables. */
|
|
||||||
+# define tidx2usize(idx) (((size_t) idx) * MALLOC_ALIGNMENT + MINSIZE - SIZE_SZ)
|
|
||||||
+
|
|
||||||
+/* When "x" is from chunksize(). */
|
|
||||||
+# define csize2tidx(x) (((x) - MINSIZE + MALLOC_ALIGNMENT - 1) / MALLOC_ALIGNMENT)
|
|
||||||
+/* When "x" is a user-provided size. */
|
|
||||||
+# define usize2tidx(x) csize2tidx (request2size (x))
|
|
||||||
+
|
|
||||||
+/* With rounding and alignment, the bins are...
|
|
||||||
+ idx 0 bytes 0..24 (64-bit) or 0..12 (32-bit)
|
|
||||||
+ idx 1 bytes 25..40 or 13..20
|
|
||||||
+ idx 2 bytes 41..56 or 21..28
|
|
||||||
+ etc. */
|
|
||||||
+
|
|
||||||
+/* This is another arbitrary limit, which tunables can change. Each
|
|
||||||
+ tcache bin will hold at most this number of chunks. */
|
|
||||||
+# define TCACHE_FILL_COUNT 7
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
#include <malloc/malloc-internal.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -1780,6 +1805,17 @@
|
|
||||||
|
|
||||||
/* First address handed out by MORECORE/sbrk. */
|
|
||||||
char* sbrk_base;
|
|
||||||
+
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+ /* Maximum number of buckets to use. */
|
|
||||||
+ size_t tcache_bins;
|
|
||||||
+ size_t tcache_max_bytes;
|
|
||||||
+ /* Maximum number of chunks in each bucket. */
|
|
||||||
+ size_t tcache_count;
|
|
||||||
+ /* Maximum number of chunks to remove from the unsorted list, which
|
|
||||||
+ aren't used to prefill the cache. */
|
|
||||||
+ size_t tcache_unsorted_limit;
|
|
||||||
+ #endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* There are several instances of this struct ("arenas") in this
|
|
||||||
@@ -1805,6 +1841,13 @@
|
|
||||||
.trim_threshold = DEFAULT_TRIM_THRESHOLD,
|
|
||||||
# define NARENAS_FROM_NCORES(n) ((n) * (sizeof(long) == 4 ? 2 : 8))
|
|
||||||
.arena_test = NARENAS_FROM_NCORES (1)
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+ ,
|
|
||||||
+ .tcache_count = TCACHE_FILL_COUNT,
|
|
||||||
+ .tcache_bins = TCACHE_MAX_BINS,
|
|
||||||
+ .tcache_max_bytes = tidx2usize (TCACHE_MAX_BINS-1),
|
|
||||||
+ .tcache_unsorted_limit = 0 /* No limit. */
|
|
||||||
+ #endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2888,6 +2931,125 @@
|
|
||||||
#endif /* HAVE_MREMAP */
|
|
||||||
|
|
||||||
/*------------------------ Public wrappers. --------------------------------*/
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+
|
|
||||||
+/* We overlay this structure on the user-data portion of a chunk when
|
|
||||||
+ the chunk is stored in the per-thread cache. */
|
|
||||||
+typedef struct tcache_entry
|
|
||||||
+{
|
|
||||||
+ struct tcache_entry *next;
|
|
||||||
+} tcache_entry;
|
|
||||||
+
|
|
||||||
+/* There is one of these for each thread, which contains the
|
|
||||||
+ per-thread cache (hence "tcache_perthread_struct"). Keeping
|
|
||||||
+ overall size low is mildly important. Note that COUNTS and ENTRIES
|
|
||||||
+ are redundant (we could have just counted the linked list each
|
|
||||||
+ time), this is for performance reasons. */
|
|
||||||
+typedef struct tcache_perthread_struct
|
|
||||||
+{
|
|
||||||
+ char counts[TCACHE_MAX_BINS];
|
|
||||||
+ tcache_entry *entries[TCACHE_MAX_BINS];
|
|
||||||
+} tcache_perthread_struct;
|
|
||||||
+
|
|
||||||
+static __thread char tcache_shutting_down = 0;
|
|
||||||
+static __thread tcache_perthread_struct *tcache = NULL;
|
|
||||||
+
|
|
||||||
+/* Caller must ensure that we know tc_idx is valid and there's room
|
|
||||||
+ for more chunks. */
|
|
||||||
+static void
|
|
||||||
+tcache_put (mchunkptr chunk, size_t tc_idx)
|
|
||||||
+{
|
|
||||||
+ tcache_entry *e = (tcache_entry *) chunk2mem (chunk);
|
|
||||||
+ assert (tc_idx < TCACHE_MAX_BINS);
|
|
||||||
+ e->next = tcache->entries[tc_idx];
|
|
||||||
+ tcache->entries[tc_idx] = e;
|
|
||||||
+ ++(tcache->counts[tc_idx]);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Caller must ensure that we know tc_idx is valid and there's
|
|
||||||
+ available chunks to remove. */
|
|
||||||
+static void *
|
|
||||||
+tcache_get (size_t tc_idx)
|
|
||||||
+{
|
|
||||||
+ tcache_entry *e = tcache->entries[tc_idx];
|
|
||||||
+ assert (tc_idx < TCACHE_MAX_BINS);
|
|
||||||
+ if(tc_idx < TCACHE_MAX_BINS){
|
|
||||||
+ assert (tcache->entries[tc_idx] > 0);
|
|
||||||
+ tcache->entries[tc_idx] = e->next;
|
|
||||||
+ tcache->counts[tc_idx]-=1;
|
|
||||||
+ }
|
|
||||||
+ return (void *) e;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void __attribute__ ((section ("__libc_thread_freeres_fn")))
|
|
||||||
+tcache_thread_freeres (void)
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+ tcache_perthread_struct *tcache_tmp = tcache;
|
|
||||||
+
|
|
||||||
+ if (!tcache)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ tcache = NULL;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < TCACHE_MAX_BINS; ++i)
|
|
||||||
+ {
|
|
||||||
+ while (tcache_tmp->entries[i])
|
|
||||||
+ {
|
|
||||||
+ tcache_entry *e = tcache_tmp->entries[i];
|
|
||||||
+ tcache_tmp->entries[i] = e->next;
|
|
||||||
+ __libc_free (e);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ __libc_free (tcache_tmp);
|
|
||||||
+
|
|
||||||
+ tcache_shutting_down = 1;
|
|
||||||
+}
|
|
||||||
+text_set_element (__libc_thread_subfreeres, tcache_thread_freeres);
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+tcache_init(void)
|
|
||||||
+{
|
|
||||||
+ mstate ar_ptr;
|
|
||||||
+ void *victim = 0;
|
|
||||||
+ const size_t bytes = sizeof (tcache_perthread_struct);
|
|
||||||
+
|
|
||||||
+ if (tcache_shutting_down)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ arena_get (ar_ptr, bytes);
|
|
||||||
+ victim = _int_malloc (ar_ptr, bytes);
|
|
||||||
+ if (!victim && ar_ptr != NULL)
|
|
||||||
+ {
|
|
||||||
+ ar_ptr = arena_get_retry (ar_ptr, bytes);
|
|
||||||
+ victim = _int_malloc (ar_ptr, bytes);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ if (ar_ptr != NULL)
|
|
||||||
+ __libc_lock_unlock (ar_ptr->mutex);
|
|
||||||
+
|
|
||||||
+ /* In a low memory situation, we may not be able to allocate memory
|
|
||||||
+ - in which case, we just keep trying later. However, we
|
|
||||||
+ typically do this very early, so either there is sufficient
|
|
||||||
+ memory, or there isn't enough memory to do non-trivial
|
|
||||||
+ allocations anyway. */
|
|
||||||
+ if (victim)
|
|
||||||
+ {
|
|
||||||
+ tcache = (tcache_perthread_struct *) victim;
|
|
||||||
+ memset (tcache, 0, sizeof (tcache_perthread_struct));
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#define MAYBE_INIT_TCACHE() \
|
|
||||||
+ if (__glibc_unlikely (tcache == NULL)) \
|
|
||||||
+ tcache_init();
|
|
||||||
+
|
|
||||||
+#else
|
|
||||||
+#define MAYBE_INIT_TCACHE()
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
void*
|
|
||||||
__libc_malloc(size_t bytes)
|
|
||||||
@@ -2899,7 +3061,25 @@
|
|
||||||
= force_reg (__malloc_hook);
|
|
||||||
if (__builtin_expect (hook != NULL, 0))
|
|
||||||
return (*hook)(bytes, RETURN_ADDRESS (0));
|
|
||||||
-
|
|
||||||
+
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ /* int_free also calls request2size, be careful to not pad twice. */
|
|
||||||
+ size_t tbytes = request2size (bytes);
|
|
||||||
+ size_t tc_idx = csize2tidx (tbytes);
|
|
||||||
+
|
|
||||||
+ MAYBE_INIT_TCACHE ();
|
|
||||||
+
|
|
||||||
+ DIAG_PUSH_NEEDS_COMMENT;
|
|
||||||
+ if (tc_idx < mp_.tcache_bins
|
|
||||||
+ /*&& tc_idx < TCACHE_MAX_BINS*/ /* to appease gcc */
|
|
||||||
+ && tcache
|
|
||||||
+ && tcache->entries[tc_idx] != NULL)
|
|
||||||
+ {
|
|
||||||
+ return tcache_get (tc_idx);
|
|
||||||
+ }
|
|
||||||
+ DIAG_POP_NEEDS_COMMENT;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
arena_get(ar_ptr, bytes);
|
|
||||||
|
|
||||||
victim = _int_malloc(ar_ptr, bytes);
|
|
||||||
@@ -3333,6 +3513,10 @@
|
|
||||||
mchunkptr fwd; /* misc temp for linking */
|
|
||||||
mchunkptr bck; /* misc temp for linking */
|
|
||||||
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ size_t tcache_unsorted_count; /* count of unsorted chunks processed */
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
const char *errstr = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -3361,6 +3545,16 @@
|
|
||||||
This code is safe to execute even if av is not yet initialized, so we
|
|
||||||
can try it without checking, which saves some time on this fast path.
|
|
||||||
*/
|
|
||||||
+#define REMOVE_FB(fb, victim, pp) \
|
|
||||||
+ do \
|
|
||||||
+ { \
|
|
||||||
+ victim = pp; \
|
|
||||||
+ if (victim == NULL) \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ while ((pp = catomic_compare_and_exchange_val_acq (fb, victim->fd, victim)) \
|
|
||||||
+ != victim); \
|
|
||||||
+
|
|
||||||
|
|
||||||
if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
|
|
||||||
idx = fastbin_index(nb);
|
|
||||||
@@ -3385,6 +3579,26 @@
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
check_remalloced_chunk(av, victim, nb);
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ /* While we're here, if we see other chunks of the same size,
|
|
||||||
+ stash them in the tcache. */
|
|
||||||
+ size_t tc_idx = csize2tidx (nb);
|
|
||||||
+ if (tcache && tc_idx < mp_.tcache_bins)
|
|
||||||
+ {
|
|
||||||
+ mchunkptr tc_victim;
|
|
||||||
+
|
|
||||||
+ /* While bin not empty and tcache not full, copy chunks over. */
|
|
||||||
+ while (tcache->counts[tc_idx] < mp_.tcache_count
|
|
||||||
+ && (pp = *fb) != NULL)
|
|
||||||
+ {
|
|
||||||
+ REMOVE_FB (fb, tc_victim, pp);
|
|
||||||
+ if (tc_victim != 0)
|
|
||||||
+ {
|
|
||||||
+ tcache_put (tc_victim, tc_idx);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
void *p = chunk2mem(victim);
|
|
||||||
alloc_perturb (p, bytes);
|
|
||||||
return p;
|
|
||||||
@@ -3420,6 +3634,34 @@
|
|
||||||
if (av != &main_arena)
|
|
||||||
victim->size |= NON_MAIN_ARENA;
|
|
||||||
check_malloced_chunk(av, victim, nb);
|
|
||||||
+
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+ /* While we're here, if we see other chunks of the same size,
|
|
||||||
+ stash them in the tcache. */
|
|
||||||
+ size_t tc_idx = csize2tidx (nb);
|
|
||||||
+ if (tcache && tc_idx < mp_.tcache_bins)
|
|
||||||
+ {
|
|
||||||
+ mchunkptr tc_victim;
|
|
||||||
+
|
|
||||||
+ /* While bin not empty and tcache not full, copy chunks over. */
|
|
||||||
+ while (tcache->counts[tc_idx] < mp_.tcache_count
|
|
||||||
+ && (tc_victim = last (bin)) != bin)
|
|
||||||
+ {
|
|
||||||
+ if (tc_victim != 0)
|
|
||||||
+ {
|
|
||||||
+ bck = tc_victim->bk;
|
|
||||||
+ set_inuse_bit_at_offset (tc_victim, nb);
|
|
||||||
+ if (av != &main_arena)
|
|
||||||
+ tc_victim->size |= NON_MAIN_ARENA;
|
|
||||||
+ bin->bk = bck;
|
|
||||||
+ bck->fd = bin;
|
|
||||||
+
|
|
||||||
+ tcache_put (tc_victim, tc_idx);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
void *p = chunk2mem(victim);
|
|
||||||
alloc_perturb (p, bytes);
|
|
||||||
return p;
|
|
||||||
@@ -3456,6 +3698,15 @@
|
|
||||||
do so and retry. This happens at most once, and only when we would
|
|
||||||
otherwise need to expand memory to service a "small" request.
|
|
||||||
*/
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ INTERNAL_SIZE_T tcache_nb = 0;
|
|
||||||
+ size_t tc_idx = csize2tidx (nb);
|
|
||||||
+ if (tcache && tc_idx < mp_.tcache_bins)
|
|
||||||
+ tcache_nb = nb;
|
|
||||||
+ int return_cached = 0;
|
|
||||||
+
|
|
||||||
+ tcache_unsorted_count = 0;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
|
|
||||||
@@ -3517,11 +3768,31 @@
|
|
||||||
if (size == nb) {
|
|
||||||
set_inuse_bit_at_offset(victim, size);
|
|
||||||
if (av != &main_arena)
|
|
||||||
- victim->size |= NON_MAIN_ARENA;
|
|
||||||
+ victim->size |= NON_MAIN_ARENA; //this might be changed into set_non_main_arena (victim);
|
|
||||||
+
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ /* Fill cache first, return to user only if cache fills.
|
|
||||||
+ We may return one of these chunks later. */
|
|
||||||
+ if (tcache_nb
|
|
||||||
+ && tcache->counts[tc_idx] < mp_.tcache_count)
|
|
||||||
+ {
|
|
||||||
+ tcache_put (victim, tc_idx);
|
|
||||||
+ return_cached = 1;
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
check_malloced_chunk(av, victim, nb);
|
|
||||||
void *p = chunk2mem(victim);
|
|
||||||
alloc_perturb (p, bytes);
|
|
||||||
return p;
|
|
||||||
+
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
}
|
|
||||||
|
|
||||||
/* place chunk in bin */
|
|
||||||
@@ -3579,11 +3850,31 @@
|
|
||||||
victim->fd = fwd;
|
|
||||||
fwd->bk = victim;
|
|
||||||
bck->fd = victim;
|
|
||||||
+
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ /* If we've processed as many chunks as we're allowed while
|
|
||||||
+ filling the cache, return one of the cached ones. */
|
|
||||||
+ ++tcache_unsorted_count;
|
|
||||||
+ if (return_cached
|
|
||||||
+ && mp_.tcache_unsorted_limit > 0
|
|
||||||
+ && tcache_unsorted_count > mp_.tcache_unsorted_limit)
|
|
||||||
+ {
|
|
||||||
+ return tcache_get (tc_idx);
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#define MAX_ITERS 10000
|
|
||||||
if (++iters >= MAX_ITERS)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+ /* If all the small chunks we found ended up cached, return one now. */
|
|
||||||
+ if (return_cached)
|
|
||||||
+ {
|
|
||||||
+ return tcache_get (tc_idx);
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
If a large request, scan through the chunks of current bin in
|
|
||||||
@@ -3855,6 +4146,20 @@
|
|
||||||
|
|
||||||
check_inuse_chunk(av, p);
|
|
||||||
|
|
||||||
+#if USE_TCACHE
|
|
||||||
+ {
|
|
||||||
+ size_t tc_idx = csize2tidx (size);
|
|
||||||
+
|
|
||||||
+ if (tcache
|
|
||||||
+ && tc_idx < mp_.tcache_bins
|
|
||||||
+ && tcache->counts[tc_idx] < mp_.tcache_count)
|
|
||||||
+ {
|
|
||||||
+ tcache_put (p, tc_idx);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
If eligible, place chunk on a fastbin so it can be found
|
|
||||||
and used quickly in malloc.
|
|
||||||
@@ -4797,6 +5102,44 @@
|
|
||||||
}
|
|
||||||
(void)mutex_unlock(&av->mutex);
|
|
||||||
return res;
|
|
||||||
+
|
|
||||||
+ //warning: this shoule be add here
|
|
||||||
+ //but since it wasn't even used in 2.26, I decide to omit
|
|
||||||
+ /*
|
|
||||||
+ #if USE_TCACHE
|
|
||||||
+static inline int
|
|
||||||
+__always_inline
|
|
||||||
+do_set_tcache_max (size_t value)
|
|
||||||
+{
|
|
||||||
+ if (value >= 0 && value <= MAX_TCACHE_SIZE)
|
|
||||||
+ {
|
|
||||||
+ LIBC_PROBE (memory_tunable_tcache_max_bytes, 2, value, mp_.tcache_max_bytes);
|
|
||||||
+ mp_.tcache_max_bytes = value;
|
|
||||||
+ mp_.tcache_bins = csize2tidx (request2size(value)) + 1;
|
|
||||||
+ }
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline int
|
|
||||||
+__always_inline
|
|
||||||
+do_set_tcache_count (size_t value)
|
|
||||||
+{
|
|
||||||
+ LIBC_PROBE (memory_tunable_tcache_count, 2, value, mp_.tcache_count);
|
|
||||||
+ mp_.tcache_count = value;
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline int
|
|
||||||
+__always_inline
|
|
||||||
+do_set_tcache_unsorted_limit (size_t value)
|
|
||||||
+{
|
|
||||||
+ LIBC_PROBE (memory_tunable_tcache_unsorted_limit, 2, value, mp_.tcache_unsorted_limit);
|
|
||||||
+ mp_.tcache_unsorted_limit = value;
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+*/
|
|
||||||
+
|
|
||||||
}
|
|
||||||
libc_hidden_def (__libc_mallopt)
|
|
||||||
|
|
109
glibc-rh1927536.patch
Normal file
109
glibc-rh1927536.patch
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
Move __isnanl_pseudo to its own file in sysdeps/x86/isnanl-pseudo.c so
|
||||||
|
that it only links into libc.so. This way it is only available to
|
||||||
|
functions in libc and should not affect libm.
|
||||||
|
|
||||||
|
diff --git a/include/math.h b/include/math.h
|
||||||
|
index 4eddc81be0dccad9..c42c8101dd8ebc88 100644
|
||||||
|
--- a/include/math.h
|
||||||
|
+++ b/include/math.h
|
||||||
|
@@ -7,8 +7,7 @@
|
||||||
|
extern int __matherr (struct exception *__exc);
|
||||||
|
|
||||||
|
# if IS_IN (libc)
|
||||||
|
-extern int __isnanl_pseudo (long double);
|
||||||
|
-hidden_proto (__isnanl_pseudo)
|
||||||
|
+extern int __isnanl_pseudo (long double) attribute_hidden;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if IS_IN (libc) || IS_IN (libm)
|
||||||
|
diff --git a/sysdeps/i386/fpu/s_isnanl.c b/sysdeps/i386/fpu/s_isnanl.c
|
||||||
|
index dc83d7a85fb3318b..816396d8fbc79dde 100644
|
||||||
|
--- a/sysdeps/i386/fpu/s_isnanl.c
|
||||||
|
+++ b/sysdeps/i386/fpu/s_isnanl.c
|
||||||
|
@@ -41,23 +41,3 @@ int __isnanl(long double x)
|
||||||
|
}
|
||||||
|
hidden_def (__isnanl)
|
||||||
|
weak_alias (__isnanl, isnanl)
|
||||||
|
-
|
||||||
|
-#if IS_IN (libc)
|
||||||
|
-/* Exact backport from glibc-2.33, used only in printf_fp.c. */
|
||||||
|
-int __isnanl_pseudo (long double x)
|
||||||
|
-{
|
||||||
|
- int32_t se,hx,lx,pn;
|
||||||
|
- GET_LDOUBLE_WORDS(se,hx,lx,x);
|
||||||
|
- se = (se & 0x7fff) << 1;
|
||||||
|
- /* Detect pseudo-normal numbers, i.e. exponent is non-zero and the top
|
||||||
|
- bit of the significand is not set. */
|
||||||
|
- pn = (uint32_t)((~hx & 0x80000000) & (se|(-se)))>>31;
|
||||||
|
- /* Clear the significand bit when computing mantissa. */
|
||||||
|
- lx |= hx & 0x7fffffff;
|
||||||
|
- se |= (uint32_t)(lx|(-lx))>>31;
|
||||||
|
- se = 0xfffe - se;
|
||||||
|
-
|
||||||
|
- return (int)(((uint32_t)(se)) >> 16) | pn;
|
||||||
|
-}
|
||||||
|
-hidden_def (__isnanl_pseudo)
|
||||||
|
-#endif
|
||||||
|
diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile
|
||||||
|
index f1da941dbbadadb3..d2f7b05db6ff6f72 100644
|
||||||
|
--- a/sysdeps/x86/Makefile
|
||||||
|
+++ b/sysdeps/x86/Makefile
|
||||||
|
@@ -22,3 +22,7 @@ endif
|
||||||
|
ifeq ($(subdir),math)
|
||||||
|
tests += tst-ldbl-nonnormal-printf
|
||||||
|
endif # $(subdir) == math
|
||||||
|
+
|
||||||
|
+ifeq ($(subdir),stdio-common)
|
||||||
|
+sysdep_routines += isnanl-pseudo
|
||||||
|
+endif
|
||||||
|
diff --git a/sysdeps/x86/isnanl-pseudo.c b/sysdeps/x86/isnanl-pseudo.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..95aba4672ba51a16
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/x86/isnanl-pseudo.c
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+/* s_isnanl.c -- long double version for i387 of s_isnan.c.
|
||||||
|
+ * Conversion to long double by Ulrich Drepper,
|
||||||
|
+ * Cygnus Support, drepper@cygnus.com.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * ====================================================
|
||||||
|
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
|
+ * Permission to use, copy, modify, and distribute this
|
||||||
|
+ * software is freely granted, provided that this notice
|
||||||
|
+ * is preserved.
|
||||||
|
+ * ====================================================
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#if defined(LIBM_SCCS) && !defined(lint)
|
||||||
|
+static char rcsid[] = "$NetBSD: $";
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * isnanl(x) returns 1 is x is nan, else 0;
|
||||||
|
+ * no branching!
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <math.h>
|
||||||
|
+#include <math_private.h>
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+attribute_hidden
|
||||||
|
+__isnanl_pseudo(long double x)
|
||||||
|
+{
|
||||||
|
+ int32_t se,hx,lx,pn;
|
||||||
|
+ GET_LDOUBLE_WORDS(se,hx,lx,x);
|
||||||
|
+ se = (se & 0x7fff) << 1;
|
||||||
|
+ /* Detect pseudo-normal numbers, i.e. exponent is non-zero and the top
|
||||||
|
+ bit of the significand is not set. */
|
||||||
|
+ pn = (uint32_t)((~hx & 0x80000000) & (se|(-se)))>>31;
|
||||||
|
+ /* Clear the significand bit when computing mantissa. */
|
||||||
|
+ lx |= hx & 0x7fffffff;
|
||||||
|
+ se |= (uint32_t)(lx|(-lx))>>31;
|
||||||
|
+ se = 0xfffe - se;
|
||||||
|
+
|
||||||
|
+ return (int)(((uint32_t)(se)) >> 16) | pn;
|
||||||
|
+}
|
251
glibc-rh1993930.patch
Normal file
251
glibc-rh1993930.patch
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
Downstream-only patch to introduce the
|
||||||
|
/etc/sysconfig/strcasecmp-nonascii configuration file, which switches
|
||||||
|
to an implementation of strcasecmp, strcasecmp_l, strncasecmp,
|
||||||
|
strncasecmp_l that always performs case-conversion as per tolower.
|
||||||
|
|
||||||
|
The original glibc 2.17 version of these functions only ignored
|
||||||
|
case within the ASCII range due to upstream bug 15736, but it is
|
||||||
|
too late to change this regression (compared to Red Hat Enterprise
|
||||||
|
Linux 6) in Red Hat Enterprise Linux 7.
|
||||||
|
|
||||||
|
This patch only covers i686 and x86_64. s390x is not affected.
|
||||||
|
ppc64le would require additional changes.
|
||||||
|
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/init-arch.h b/sysdeps/i386/i686/multiarch/init-arch.h
|
||||||
|
index cd2d0befee728b50..60d0eed17d004871 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/init-arch.h
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/init-arch.h
|
||||||
|
@@ -1 +1,21 @@
|
||||||
|
#include <sysdeps/x86_64/multiarch/init-arch.h>
|
||||||
|
+
|
||||||
|
+#ifdef __ASSEMBLER__
|
||||||
|
+/* Performan an access system call to check whether the configuration
|
||||||
|
+ file exists. If it does, load SYMBOL into %eax and jump to LABEL. */
|
||||||
|
+# define CHECK_STRCASECMP_CONFIG_FILE(symbol, label) \
|
||||||
|
+ pushl %ebx; \
|
||||||
|
+ cfi_adjust_cfa_offset (4); \
|
||||||
|
+ cfi_rel_offset (%ebx, 0); \
|
||||||
|
+ LOAD_PIC_REG (dx); \
|
||||||
|
+ movl $__NR_access, %eax; \
|
||||||
|
+ lea __sysconfig_strcasecmp_nonascii@GOTOFF(%edx), %ebx; \
|
||||||
|
+ xor %ecx, %ecx; \
|
||||||
|
+ int $0x80; \
|
||||||
|
+ test %eax, %eax; \
|
||||||
|
+ lea symbol@GOTOFF(%edx), %eax; \
|
||||||
|
+ popl %ebx; \
|
||||||
|
+ cfi_adjust_cfa_offset (-4); \
|
||||||
|
+ cfi_restore (%ebx); \
|
||||||
|
+ jz label
|
||||||
|
+#endif
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strcasecmp-c.c b/sysdeps/i386/i686/multiarch/strcasecmp-c.c
|
||||||
|
index 753c6ec84ab9f8ea..b50c527525a347d0 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strcasecmp-c.c
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strcasecmp-c.c
|
||||||
|
@@ -10,3 +10,8 @@ strong_alias (__strcasecmp_nonascii, __strcasecmp_ia32)
|
||||||
|
/* The needs of strcasecmp in libc are minimal, no need to go through
|
||||||
|
the IFUNC. */
|
||||||
|
strong_alias (__strcasecmp_nonascii, __GI___strcasecmp)
|
||||||
|
+
|
||||||
|
+/* Used by the assembler IFUNC selectors. Presence of this file
|
||||||
|
+ indicates that the C implementation shall be used. */
|
||||||
|
+const char __sysconfig_strcasecmp_nonascii[] attribute_hidden =
|
||||||
|
+ "/etc/sysconfig/strcasecmp-nonascii";
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strcasecmp.S b/sysdeps/i386/i686/multiarch/strcasecmp.S
|
||||||
|
index 7efef3b1b0545b5d..9c21a2d5d8b713a1 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strcasecmp.S
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strcasecmp.S
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
.text
|
||||||
|
ENTRY(__strcasecmp)
|
||||||
|
.type __strcasecmp, @gnu_indirect_function
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE (__strcasecmp_nonascii, 2f)
|
||||||
|
LOAD_GOT_AND_RTLD_GLOBAL_RO
|
||||||
|
LOAD_FUNC_GOT_EAX (__strcasecmp_ia32)
|
||||||
|
HAS_CPU_FEATURE (SSSE3)
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strcasecmp_l.S b/sysdeps/i386/i686/multiarch/strcasecmp_l.S
|
||||||
|
index 711c09b0dc1fa62e..512e9bd66ed66b23 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strcasecmp_l.S
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strcasecmp_l.S
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
/* Multiple versions of strcasecmp_l
|
||||||
|
All versions must be listed in ifunc-impl-list.c. */
|
||||||
|
#define STRCMP __strcasecmp_l
|
||||||
|
+#define STRCMP_NONASCII __strcasecmp_l_nonascii
|
||||||
|
#define USE_AS_STRCASECMP_L
|
||||||
|
#include "strcmp.S"
|
||||||
|
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strcmp.S b/sysdeps/i386/i686/multiarch/strcmp.S
|
||||||
|
index 19967e8db0990c2c..7fc791a18089da6f 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strcmp.S
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strcmp.S
|
||||||
|
@@ -54,6 +54,9 @@
|
||||||
|
.text
|
||||||
|
ENTRY(STRCMP)
|
||||||
|
.type STRCMP, @gnu_indirect_function
|
||||||
|
+#if defined (USE_AS_STRCASECMP_L) || defined (USE_AS_STRNCASECMP_L)
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE (STRCMP_NONASCII, 2f)
|
||||||
|
+#endif
|
||||||
|
LOAD_GOT_AND_RTLD_GLOBAL_RO
|
||||||
|
LOAD_FUNC_GOT_EAX (__STRCMP_IA32)
|
||||||
|
HAS_CPU_FEATURE (SSSE3)
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strncase.S b/sysdeps/i386/i686/multiarch/strncase.S
|
||||||
|
index 952c7c60994f3023..36495559de590179 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strncase.S
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strncase.S
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
.text
|
||||||
|
ENTRY(__strncasecmp)
|
||||||
|
.type __strncasecmp, @gnu_indirect_function
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE (__strncasecmp_nonascii, 2f)
|
||||||
|
LOAD_GOT_AND_RTLD_GLOBAL_RO
|
||||||
|
LOAD_FUNC_GOT_EAX (__strncasecmp_ia32)
|
||||||
|
HAS_CPU_FEATURE (SSSE3)
|
||||||
|
diff --git a/sysdeps/i386/i686/multiarch/strncase_l.S b/sysdeps/i386/i686/multiarch/strncase_l.S
|
||||||
|
index 8a74ee8574c720ae..b77951b26b98b8c8 100644
|
||||||
|
--- a/sysdeps/i386/i686/multiarch/strncase_l.S
|
||||||
|
+++ b/sysdeps/i386/i686/multiarch/strncase_l.S
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
/* Multiple versions of strncasecmp_l
|
||||||
|
All versions must be listed in ifunc-impl-list.c. */
|
||||||
|
#define STRCMP __strncasecmp_l
|
||||||
|
+#define STRCMP_NONASCII __strncasecmp_l_nonascii
|
||||||
|
#define USE_AS_STRNCASECMP_L
|
||||||
|
#include "strcmp.S"
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
|
||||||
|
index c6766bb2b443a28a..d75ec12e6f1237c9 100644
|
||||||
|
--- a/sysdeps/x86_64/Makefile
|
||||||
|
+++ b/sysdeps/x86_64/Makefile
|
||||||
|
@@ -14,7 +14,8 @@ tests += tst-mallocalign1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),string)
|
||||||
|
-sysdep_routines += cacheinfo strcasecmp_l-nonascii strncase_l-nonascii
|
||||||
|
+sysdep_routines += cacheinfo strcasecmp_l-nonascii strncase_l-nonascii \
|
||||||
|
+ strcasecmp-nonascii strncase-nonascii
|
||||||
|
gen-as-const-headers += locale-defines.sym
|
||||||
|
endif
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strcasecmp_l.S b/sysdeps/x86_64/multiarch/strcasecmp_l.S
|
||||||
|
index 49f5b9fd952d3cdc..0feefe1ac81cefac 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strcasecmp_l.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strcasecmp_l.S
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
/* Multiple versions of strcasecmp and strcasecmp_l
|
||||||
|
All versions must be listed in ifunc-impl-list.c. */
|
||||||
|
#define STRCMP __strcasecmp_l
|
||||||
|
+#define STRCMP_NONASCII __strcasecmp_l_nonascii
|
||||||
|
#define USE_AS_STRCASECMP_L
|
||||||
|
#include "strcmp.S"
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strcmp.S b/sysdeps/x86_64/multiarch/strcmp.S
|
||||||
|
index 48b4db8c430a514f..ede41c8f61e8b472 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strcmp.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strcmp.S
|
||||||
|
@@ -76,6 +76,17 @@
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* Performan an access system call to check whether the configuration
|
||||||
|
+ file exists. If it does, load SYMBOL into %rax and jump to LABEL. */
|
||||||
|
+#define CHECK_STRCASECMP_CONFIG_FILE(symbol, label) \
|
||||||
|
+ movl $__NR_access, %eax; \
|
||||||
|
+ leaq __sysconfig_strcasecmp_nonascii(%rip), %rdi; \
|
||||||
|
+ xor %esi, %esi; \
|
||||||
|
+ syscall ; \
|
||||||
|
+ test %eax, %eax; \
|
||||||
|
+ leaq symbol(%rip), %rax; \
|
||||||
|
+ jz label
|
||||||
|
+
|
||||||
|
/* Define multiple versions only for the definition in libc. Don't
|
||||||
|
define multiple versions for strncmp in static library since we
|
||||||
|
need strncmp before the initialization happened. */
|
||||||
|
@@ -83,6 +94,9 @@
|
||||||
|
.text
|
||||||
|
ENTRY(STRCMP)
|
||||||
|
.type STRCMP, @gnu_indirect_function
|
||||||
|
+# if defined (USE_AS_STRCASECMP_L) || defined (USE_AS_STRNCASECMP_L)
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE(STRCMP_NONASCII, 2f)
|
||||||
|
+# endif
|
||||||
|
LOAD_RTLD_GLOBAL_RO_RDX
|
||||||
|
leaq STRCMP_SSE42(%rip), %rax
|
||||||
|
HAS_CPU_FEATURE (SSE4_2)
|
||||||
|
@@ -97,6 +111,7 @@ END(STRCMP)
|
||||||
|
# ifdef USE_AS_STRCASECMP_L
|
||||||
|
ENTRY(__strcasecmp)
|
||||||
|
.type __strcasecmp, @gnu_indirect_function
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE(__strcasecmp_nonascii, 2f)
|
||||||
|
LOAD_RTLD_GLOBAL_RO_RDX
|
||||||
|
# ifdef HAVE_AVX_SUPPORT
|
||||||
|
leaq __strcasecmp_avx(%rip), %rax
|
||||||
|
@@ -117,6 +132,7 @@ weak_alias (__strcasecmp, strcasecmp)
|
||||||
|
# ifdef USE_AS_STRNCASECMP_L
|
||||||
|
ENTRY(__strncasecmp)
|
||||||
|
.type __strncasecmp, @gnu_indirect_function
|
||||||
|
+ CHECK_STRCASECMP_CONFIG_FILE(__strncasecmp_nonascii, 2f)
|
||||||
|
LOAD_RTLD_GLOBAL_RO_RDX
|
||||||
|
# ifdef HAVE_AVX_SUPPORT
|
||||||
|
leaq __strncasecmp_avx(%rip), %rax
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strncase_l.S b/sysdeps/x86_64/multiarch/strncase_l.S
|
||||||
|
index 9c0149788e9c11b5..259ce6b5ef57e178 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strncase_l.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strncase_l.S
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
/* Multiple versions of strncasecmp and strncasecmp_l
|
||||||
|
All versions must be listed in ifunc-impl-list.c. */
|
||||||
|
#define STRCMP __strncasecmp_l
|
||||||
|
+#define STRCMP_NONASCII __strncasecmp_l_nonascii
|
||||||
|
#define USE_AS_STRNCASECMP_L
|
||||||
|
#include "strcmp.S"
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86_64/strcasecmp-nonascii.c b/sysdeps/x86_64/strcasecmp-nonascii.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..7e81a7bdb6f52c47
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/x86_64/strcasecmp-nonascii.c
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+#if IS_IN (libc)
|
||||||
|
+# include <string.h>
|
||||||
|
+
|
||||||
|
+extern int __strcasecmp_nonascii (const char *__s1, const char *__s2);
|
||||||
|
+
|
||||||
|
+# define __strcasecmp __strcasecmp_nonascii
|
||||||
|
+# include <string/strcasecmp.c>
|
||||||
|
+
|
||||||
|
+/* Used by the assembler IFUNC selectors. Presence of this file
|
||||||
|
+ indicates that the C implementation shall be used. */
|
||||||
|
+const char __sysconfig_strcasecmp_nonascii[] attribute_hidden =
|
||||||
|
+ "/etc/sysconfig/strcasecmp-nonascii";
|
||||||
|
+#endif
|
||||||
|
diff --git a/sysdeps/x86_64/strcasecmp_l-nonascii.c b/sysdeps/x86_64/strcasecmp_l-nonascii.c
|
||||||
|
index 30e8969603ea7817..4abd55ae2a54f94a 100644
|
||||||
|
--- a/sysdeps/x86_64/strcasecmp_l-nonascii.c
|
||||||
|
+++ b/sysdeps/x86_64/strcasecmp_l-nonascii.c
|
||||||
|
@@ -1,8 +1,10 @@
|
||||||
|
-#include <string.h>
|
||||||
|
+#if IS_IN (libc)
|
||||||
|
+# include <string.h>
|
||||||
|
|
||||||
|
extern int __strcasecmp_l_nonascii (const char *__s1, const char *__s2,
|
||||||
|
__locale_t __loc);
|
||||||
|
|
||||||
|
-#define __strcasecmp_l __strcasecmp_l_nonascii
|
||||||
|
-#define USE_IN_EXTENDED_LOCALE_MODEL 1
|
||||||
|
-#include <string/strcasecmp.c>
|
||||||
|
+# define __strcasecmp_l __strcasecmp_l_nonascii
|
||||||
|
+# define USE_IN_EXTENDED_LOCALE_MODEL 1
|
||||||
|
+# include <string/strcasecmp.c>
|
||||||
|
+#endif
|
||||||
|
diff --git a/sysdeps/x86_64/strncase-nonascii.c b/sysdeps/x86_64/strncase-nonascii.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..4db45017c189b87a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/x86_64/strncase-nonascii.c
|
||||||
|
@@ -0,0 +1,7 @@
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+extern int __strncasecmp_nonascii (const char *__s1, const char *__s2,
|
||||||
|
+ size_t __n);
|
||||||
|
+
|
||||||
|
+#define __strncasecmp __strncasecmp_nonascii
|
||||||
|
+#include <string/strncase.c>
|
126
glibc.spec
126
glibc.spec
|
@ -1,6 +1,6 @@
|
||||||
%define glibcsrcdir glibc-2.17-c758a686
|
%define glibcsrcdir glibc-2.17-c758a686
|
||||||
%define glibcversion 2.17
|
%define glibcversion 2.17
|
||||||
%define glibcrelease 323.1%{?dist}.1
|
%define glibcrelease 325%{?dist}
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# We support the following options:
|
# We support the following options:
|
||||||
# --with/--without,
|
# --with/--without,
|
||||||
|
@ -249,11 +249,6 @@ Patch0068: glibc-rh1349982.patch
|
||||||
# These changes were brought forward from RHEL 6 for compatibility
|
# These changes were brought forward from RHEL 6 for compatibility
|
||||||
Patch0069: glibc-rh1448107.patch
|
Patch0069: glibc-rh1448107.patch
|
||||||
|
|
||||||
# Armhfp build issue
|
|
||||||
Patch9997: centos-arm32-NO_LONG_DOUBLE_MATH.patch
|
|
||||||
Patch9998: glibc-armhfp-ELF_MACHINE_NO_REL-undefined.patch
|
|
||||||
Patch9999: glibc-rh1256317-armhfp-build-issue.patch
|
|
||||||
|
|
||||||
Patch1000: glibc-rh905877.patch
|
Patch1000: glibc-rh905877.patch
|
||||||
Patch1001: glibc-rh958652.patch
|
Patch1001: glibc-rh958652.patch
|
||||||
Patch1002: glibc-rh977870.patch
|
Patch1002: glibc-rh977870.patch
|
||||||
|
@ -1645,9 +1640,12 @@ Patch2857: glibc-rh1812119-2.patch
|
||||||
Patch2858: glibc-rh1883162.patch
|
Patch2858: glibc-rh1883162.patch
|
||||||
Patch2859: glibc-rh1925204-1.patch
|
Patch2859: glibc-rh1925204-1.patch
|
||||||
Patch2860: glibc-rh1925204-2.patch
|
Patch2860: glibc-rh1925204-2.patch
|
||||||
|
Patch2861: glibc-rh1927536.patch
|
||||||
Patch10001: 10001-glibc-anolis-update-headers-with-the-define-EPOLLEXCLUSIVE.patch
|
Patch2862: glibc-rh1993930.patch
|
||||||
Patch10002: 10002-glibc-anolis-tcache.patch
|
# Armhfp build issue
|
||||||
|
Patch9997: centos-arm32-NO_LONG_DOUBLE_MATH.patch
|
||||||
|
Patch9998: glibc-armhfp-ELF_MACHINE_NO_REL-undefined.patch
|
||||||
|
Patch9999: glibc-rh1256317-armhfp-build-issue.patch
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# End of glibc patches.
|
# End of glibc patches.
|
||||||
|
@ -3018,6 +3016,8 @@ package or when debugging this package.
|
||||||
%patch2858 -p1
|
%patch2858 -p1
|
||||||
%patch2859 -p1
|
%patch2859 -p1
|
||||||
%patch2860 -p1
|
%patch2860 -p1
|
||||||
|
%patch2861 -p1
|
||||||
|
%patch2862 -p1
|
||||||
|
|
||||||
%ifarch %{arm}
|
%ifarch %{arm}
|
||||||
%patch9998 -p1
|
%patch9998 -p1
|
||||||
|
@ -3025,8 +3025,6 @@ package or when debugging this package.
|
||||||
%patch9997 -p1
|
%patch9997 -p1
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%patch10001 -p1
|
|
||||||
%patch10002 -p1
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# %%prep - Additional prep required...
|
# %%prep - Additional prep required...
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
@ -4213,8 +4211,110 @@ rm -f *.filelist*
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Thu Sep 09 2021 Hang Zhao <1209176326@qq.com> - 2.17-323.1.1
|
* Thu Aug 19 2021 Florian Weimer <fweimer@redhat.com> - 2.17-325
|
||||||
- Update to glibc-2.17-323.1.al7.1
|
- Support /etc/sysconfig/strcasecmp-nonascii for enabling non-ASCII case
|
||||||
|
conversion in strcasecmp, strncasecmp (#1993930)
|
||||||
|
|
||||||
|
* Fri Mar 26 2021 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.17-324
|
||||||
|
- Move __isnanl_pseudo into its own file and link only into libc (#1927536)
|
||||||
|
|
||||||
|
* Fri Feb 05 2021 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.17-323
|
||||||
|
- Fix isnanl check in printf. (#1925204)
|
||||||
|
|
||||||
|
* Wed Jan 06 2021 Carlos O'Donell <carlos@redhat.com> - 2.17-322
|
||||||
|
- Enable file-based IFUNC selection on NVMe devices (#1883162)
|
||||||
|
|
||||||
|
* Wed Jan 06 2021 Carlos O'Donell <carlos@redhat.com> - 2.17-321
|
||||||
|
- CVE-2020-10029: Prevent stack corruption from crafted input in cosl, sinl,
|
||||||
|
sincosl, and tanl function. (#1812119)
|
||||||
|
|
||||||
|
* Tue Jan 05 2021 Carlos O'Donell <carlos@redhat.com> - 2.17-320
|
||||||
|
- CVE-2020-29573: Harden printf family of functions (#1869380)
|
||||||
|
|
||||||
|
* Tue Jan 05 2021 Carlos O'Donell <carlos@redhat.com> - 2.17-319
|
||||||
|
- Revert fix for #1772307 to improve Intel Xeon performance (#1889977)
|
||||||
|
|
||||||
|
* Tue Jan 05 2021 Carlos O'Donell <carlos@redhat.com> - 2.17-318
|
||||||
|
- CVE-2019-25013: Fix EUC-KR conversion module defect (#1912543)
|
||||||
|
|
||||||
|
* Tue May 12 2020 Florian Weimer <fweimer@redhat.com> - 2.17-317
|
||||||
|
- Do not clobber errno in nss_compat (#1834816)
|
||||||
|
|
||||||
|
* Thu Jan 30 2020 Carlos O'Donell <carlos@redhat.com> - 2.17-316
|
||||||
|
- Adjust security hardening changes for 64-bit POWER BE due to
|
||||||
|
toolchain limitations (#1793853)
|
||||||
|
|
||||||
|
* Wed Jan 29 2020 Florian Weimer <fweimer@redhat.com> - 2.17-315
|
||||||
|
- argp: Do not override GCC keywords with macros (#1763325)
|
||||||
|
|
||||||
|
* Wed Jan 29 2020 Florian Weimer <fweimer@redhat.com> - 2.17-314
|
||||||
|
- Disable libio vtable validation for interposed pre-2.1 stdio handles (#1775816)
|
||||||
|
|
||||||
|
* Tue Jan 28 2020 Florian Weimer <fweimer@redhat.com> - 2.17-313
|
||||||
|
- Remove problematic Obsoletes: (#1795573)
|
||||||
|
|
||||||
|
* Fri Jan 24 2020 Patsy Griffin <patsy@redhat.com> - 2.17-312
|
||||||
|
- Update syscall-names.list to current version 5.4. (#1747465)
|
||||||
|
|
||||||
|
* Tue Jan 21 2020 DJ Delorie <dj@redhat.com> - 2.17-311
|
||||||
|
- Improve bcopy performance on Intel Haswell (#1772307)
|
||||||
|
|
||||||
|
* Tue Jan 21 2020 DJ Delorie <dj@redhat.com> - 2.17-310
|
||||||
|
- Filter "ignore" autofs mount entries in getmntent (#1728915)
|
||||||
|
|
||||||
|
* Tue Jan 21 2020 Arjun Shankar <arjun@redhat.com> - 2.17-309
|
||||||
|
- Fix race condition in tst-waitid (#1235112)
|
||||||
|
|
||||||
|
* Tue Jan 21 2020 Arjun Shankar <arjun@redhat.com> - 2.17-308
|
||||||
|
- CVE-2019-19126: rtld: Check __libc_enable_secure before honoring
|
||||||
|
LD_PREFER_MAP_32BIT_EXEC (#1775599)
|
||||||
|
|
||||||
|
* Tue Oct 22 2019 Florian Weimer <fweimer@redhat.com> - 2.17-307
|
||||||
|
- Fix assert after attempting to dlopen main programs (#1740039)
|
||||||
|
|
||||||
|
* Fri Aug 2 2019 Carlos O'Donell <carlos@redhat.com> - 2.17-306
|
||||||
|
- Fix dlopen crash when LD_LIBRARY_PATH is set (#1484832)
|
||||||
|
|
||||||
|
* Thu Aug 1 2019 Florian Weimer <fweimer@redhat.com> - 2.17-305
|
||||||
|
- Fix race condition in malloc_info (#1065574)
|
||||||
|
|
||||||
|
* Thu Aug 1 2019 Florian Weimer <fweimer@redhat.com> - 2.17-304
|
||||||
|
- Account for size of locale-archive in RPM package (#1714888)
|
||||||
|
|
||||||
|
* Thu Aug 1 2019 Florian Weimer <fweimer@redhat.com> - 2.17-303
|
||||||
|
- Do not mark locale archive as %%config (#1717512)
|
||||||
|
|
||||||
|
* Wed Jul 31 2019 DJ Delorie <dj@redhat.com> - 2.17-302
|
||||||
|
- Allow endpwent without getpwent (#1698015)
|
||||||
|
|
||||||
|
* Wed Jul 31 2019 DJ Delorie <dj@redhat.com> - 2.17-301
|
||||||
|
- Ensure binary locale files are identical across multilibs (#1691534)
|
||||||
|
|
||||||
|
* Wed Jul 31 2019 DJ Delorie <dj@redhat.com> - 2.17-300
|
||||||
|
- Fix off-by-one in nscd getservbyport call (#1634021)
|
||||||
|
|
||||||
|
* Tue Jul 30 2019 Patsy Griffin <pfrankli@redhat.com> - 2.17-299
|
||||||
|
- Update glibc headers for Linux 4.0, 4.1 definitions and
|
||||||
|
Linux 4.2 netinet/in.h values. (#1579451)
|
||||||
|
|
||||||
|
* Mon Jul 29 2019 Patsy Griffin <pfrankli@redhat.com> - 2.17-298
|
||||||
|
- Improve NSS testing including new MERGE feature testing (#1636229)
|
||||||
|
|
||||||
|
* Fri Jul 26 2019 Patsy Griffin <pfrankli@redhat.com> - 2.17-297
|
||||||
|
- Add compiler barriers around modifications of the robust mutex list
|
||||||
|
for pthread_mutex_trylock. (#1672771)
|
||||||
|
|
||||||
|
* Fri Jul 26 2019 Arjun Shankar <arjun@redhat.com> - 2.17-296
|
||||||
|
- Fix crash in posix/bug-ga2 test when there is no IPv6 interface (#1451308)
|
||||||
|
|
||||||
|
* Fri Jul 26 2019 Arjun Shankar <arjun@redhat.com> - 2.17-295
|
||||||
|
- resolv: Switch DNS servers on all ICMP errors (#1670041)
|
||||||
|
|
||||||
|
* Thu Jul 25 2019 Arjun Shankar <arjun@redhat.com> - 2.17-294
|
||||||
|
- Build glibc with additional hardening (#1406732)
|
||||||
|
|
||||||
|
* Wed Jul 24 2019 Arjun Shankar <arjun@redhat.com> - 2.17-293
|
||||||
|
- iconv: Add support for IBM858 character encoding (#1414263)
|
||||||
|
|
||||||
* Tue Apr 30 2019 Arjun Shankar <arjun@redhat.com> - 2.17-292
|
* Tue Apr 30 2019 Arjun Shankar <arjun@redhat.com> - 2.17-292
|
||||||
- Avoid iconv hang on invalid multi-byte sequences (#1427734)
|
- Avoid iconv hang on invalid multi-byte sequences (#1427734)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue