mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
Fix sem_* tdelete, tfind, tsearch, twalk namespace (bug 18536).
The sem_* functions bring in references to tdelete, tfind, tsearch and twalk. But the t* functions are XSI-shaded, while sem_* aren't. This patch fixes this by using __t* instead, exporting those functions from libc at version GLIBC_PRIVATE (since sem_* are in libpthread) and using libc_hidden_* for the benefit of calls within libc. Tested for x86_64 and x86 (testsuite, and comparison of disassembly of installed stripped shared libraries). libpthread gets changes from PLT reordering; addresses in libc change because of PLT / dynamic symbol table changes. [BZ #18536] * misc/tsearch.c (__tsearch): Use libc_hidden_def. (__tfind): Likewise. (__tdelete): Likewise. (__twalk): Likewise. * misc/Versions (libc): Add __tdelete, __tfind, __tsearch and __twalk to GLIBC_PRIVATE. * include/search.h (__tsearch): Use libc_hidden_proto. (__tfind): Likewise. (__tdelete): Likewise. (__twalk): Likewise. * nptl/sem_close.c (sem_close): Call __twalk instead of twalk. Call __tdelete instead of tdelete. * nptl/sem_open.c (check_add_mapping): Call __tfind instead of tfind. Call __tsearch instead of tsearch. * sysdeps/sparc/sparc32/sem_open.c (check_add_mapping): Likewise. * conform/Makefile (test-xfail-POSIX/semaphore.h/linknamespace): Remove variable. (test-xfail-POSIX2008/semaphore.h/linknamespace): Likewise.
This commit is contained in:
parent
be7dc2b77e
commit
d051b143f7
20
ChangeLog
20
ChangeLog
@ -1,5 +1,25 @@
|
||||
2015-06-17 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
[BZ #18536]
|
||||
* misc/tsearch.c (__tsearch): Use libc_hidden_def.
|
||||
(__tfind): Likewise.
|
||||
(__tdelete): Likewise.
|
||||
(__twalk): Likewise.
|
||||
* misc/Versions (libc): Add __tdelete, __tfind, __tsearch and
|
||||
__twalk to GLIBC_PRIVATE.
|
||||
* include/search.h (__tsearch): Use libc_hidden_proto.
|
||||
(__tfind): Likewise.
|
||||
(__tdelete): Likewise.
|
||||
(__twalk): Likewise.
|
||||
* nptl/sem_close.c (sem_close): Call __twalk instead of twalk.
|
||||
Call __tdelete instead of tdelete.
|
||||
* nptl/sem_open.c (check_add_mapping): Call __tfind instead of
|
||||
tfind. Call __tsearch instead of tsearch.
|
||||
* sysdeps/sparc/sparc32/sem_open.c (check_add_mapping): Likewise.
|
||||
* conform/Makefile (test-xfail-POSIX/semaphore.h/linknamespace):
|
||||
Remove variable.
|
||||
(test-xfail-POSIX2008/semaphore.h/linknamespace): Likewise.
|
||||
|
||||
[BZ #18534]
|
||||
* stdio-common/dprintf.c (__dprintf): Use libc_hidden_def.
|
||||
(dprintf): Define as a weak alias of __dprintf, not a strong
|
||||
|
2
NEWS
2
NEWS
@ -22,7 +22,7 @@ Version 2.22
|
||||
18324, 18333, 18346, 18397, 18409, 18410, 18412, 18418, 18422, 18434,
|
||||
18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
|
||||
18507, 18512, 18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532,
|
||||
18533, 18534.
|
||||
18533, 18534, 18536.
|
||||
|
||||
* Cache information can be queried via sysconf() function on s390 e.g. with
|
||||
_SC_LEVEL1_ICACHE_SIZE as argument.
|
||||
|
@ -348,11 +348,9 @@ test-xfail-XPG3/unistd.h/linknamespace = yes
|
||||
test-xfail-XPG4/fmtmsg.h/linknamespace = yes
|
||||
test-xfail-XPG4/unistd.h/linknamespace = yes
|
||||
test-xfail-POSIX/mqueue.h/linknamespace = yes
|
||||
test-xfail-POSIX/semaphore.h/linknamespace = yes
|
||||
test-xfail-UNIX98/fmtmsg.h/linknamespace = yes
|
||||
test-xfail-UNIX98/mqueue.h/linknamespace = yes
|
||||
test-xfail-UNIX98/unistd.h/linknamespace = yes
|
||||
test-xfail-UNIX98/wchar.h/linknamespace = yes
|
||||
test-xfail-XOPEN2K/fmtmsg.h/linknamespace = yes
|
||||
test-xfail-POSIX2008/semaphore.h/linknamespace = yes
|
||||
test-xfail-XOPEN2K8/fmtmsg.h/linknamespace = yes
|
||||
|
@ -14,11 +14,15 @@ libc_hidden_proto (lfind)
|
||||
extern void __hdestroy (void);
|
||||
extern void *__tsearch (const void *__key, void **__rootp,
|
||||
__compar_fn_t compar);
|
||||
libc_hidden_proto (__tsearch)
|
||||
extern void *__tfind (const void *__key, void *const *__rootp,
|
||||
__compar_fn_t compar);
|
||||
libc_hidden_proto (__tfind)
|
||||
extern void *__tdelete (const void *__key, void **__rootp,
|
||||
__compar_fn_t compar);
|
||||
libc_hidden_proto (__tdelete)
|
||||
extern void __twalk (const void *__root, __action_fn_t action);
|
||||
libc_hidden_proto (__twalk)
|
||||
extern void __tdestroy (void *__root, __free_fn_t freefct);
|
||||
#endif
|
||||
#endif
|
||||
|
@ -153,5 +153,6 @@ libc {
|
||||
__madvise;
|
||||
__mktemp;
|
||||
__libc_ifunc_impl_list;
|
||||
__tdelete; __tfind; __tsearch; __twalk;
|
||||
}
|
||||
}
|
||||
|
@ -293,6 +293,7 @@ __tsearch (const void *key, void **vrootp, __compar_fn_t compar)
|
||||
|
||||
return q;
|
||||
}
|
||||
libc_hidden_def (__tsearch)
|
||||
weak_alias (__tsearch, tsearch)
|
||||
|
||||
|
||||
@ -325,6 +326,7 @@ __tfind (key, vrootp, compar)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
libc_hidden_def (__tfind)
|
||||
weak_alias (__tfind, tfind)
|
||||
|
||||
|
||||
@ -585,6 +587,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
|
||||
free (unchained);
|
||||
return retval;
|
||||
}
|
||||
libc_hidden_def (__tdelete)
|
||||
weak_alias (__tdelete, tdelete)
|
||||
|
||||
|
||||
@ -625,6 +628,7 @@ __twalk (const void *vroot, __action_fn_t action)
|
||||
if (root != NULL && action != NULL)
|
||||
trecurse (root, action, 0);
|
||||
}
|
||||
libc_hidden_def (__twalk)
|
||||
weak_alias (__twalk, twalk)
|
||||
|
||||
|
||||
|
@ -51,7 +51,7 @@ sem_close (sem)
|
||||
/* Locate the entry for the mapping the caller provided. */
|
||||
rec = NULL;
|
||||
the_sem = sem;
|
||||
twalk (__sem_mappings, walker);
|
||||
__twalk (__sem_mappings, walker);
|
||||
if (rec != NULL)
|
||||
{
|
||||
/* Check the reference counter. If it is going to be zero, free
|
||||
@ -59,7 +59,7 @@ sem_close (sem)
|
||||
if (--rec->refcnt == 0)
|
||||
{
|
||||
/* Remove the record from the tree. */
|
||||
(void) tdelete (rec, &__sem_mappings, __sem_search);
|
||||
(void) __tdelete (rec, &__sem_mappings, __sem_search);
|
||||
|
||||
result = munmap (rec->sem, sizeof (sem_t));
|
||||
|
||||
|
@ -79,7 +79,8 @@ check_add_mapping (const char *name, size_t namelen, int fd, sem_t *existing)
|
||||
fake->dev = st.st_dev;
|
||||
fake->ino = st.st_ino;
|
||||
|
||||
struct inuse_sem **foundp = tfind (fake, &__sem_mappings, __sem_search);
|
||||
struct inuse_sem **foundp = __tfind (fake, &__sem_mappings,
|
||||
__sem_search);
|
||||
if (foundp != NULL)
|
||||
{
|
||||
/* There is already a mapping. Use it. */
|
||||
@ -108,7 +109,7 @@ check_add_mapping (const char *name, size_t namelen, int fd, sem_t *existing)
|
||||
|
||||
/* Insert the new value. */
|
||||
if (existing != MAP_FAILED
|
||||
&& tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||
&& __tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||
/* Successful. */
|
||||
result = existing;
|
||||
else
|
||||
|
@ -79,7 +79,8 @@ check_add_mapping (const char *name, size_t namelen, int fd, sem_t *existing)
|
||||
fake->dev = st.st_dev;
|
||||
fake->ino = st.st_ino;
|
||||
|
||||
struct inuse_sem **foundp = tfind (fake, &__sem_mappings, __sem_search);
|
||||
struct inuse_sem **foundp = __tfind (fake, &__sem_mappings,
|
||||
__sem_search);
|
||||
if (foundp != NULL)
|
||||
{
|
||||
/* There is already a mapping. Use it. */
|
||||
@ -108,7 +109,7 @@ check_add_mapping (const char *name, size_t namelen, int fd, sem_t *existing)
|
||||
|
||||
/* Insert the new value. */
|
||||
if (existing != MAP_FAILED
|
||||
&& tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||
&& __tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||
/* Successful. */
|
||||
result = existing;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user