mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03: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:
20
ChangeLog
20
ChangeLog
@ -1,5 +1,25 @@
|
|||||||
2015-06-17 Joseph Myers <joseph@codesourcery.com>
|
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]
|
[BZ #18534]
|
||||||
* stdio-common/dprintf.c (__dprintf): Use libc_hidden_def.
|
* stdio-common/dprintf.c (__dprintf): Use libc_hidden_def.
|
||||||
(dprintf): Define as a weak alias of __dprintf, not a strong
|
(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,
|
18324, 18333, 18346, 18397, 18409, 18410, 18412, 18418, 18422, 18434,
|
||||||
18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
|
18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
|
||||||
18507, 18512, 18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532,
|
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
|
* Cache information can be queried via sysconf() function on s390 e.g. with
|
||||||
_SC_LEVEL1_ICACHE_SIZE as argument.
|
_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/fmtmsg.h/linknamespace = yes
|
||||||
test-xfail-XPG4/unistd.h/linknamespace = yes
|
test-xfail-XPG4/unistd.h/linknamespace = yes
|
||||||
test-xfail-POSIX/mqueue.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/fmtmsg.h/linknamespace = yes
|
||||||
test-xfail-UNIX98/mqueue.h/linknamespace = yes
|
test-xfail-UNIX98/mqueue.h/linknamespace = yes
|
||||||
test-xfail-UNIX98/unistd.h/linknamespace = yes
|
test-xfail-UNIX98/unistd.h/linknamespace = yes
|
||||||
test-xfail-UNIX98/wchar.h/linknamespace = yes
|
test-xfail-UNIX98/wchar.h/linknamespace = yes
|
||||||
test-xfail-XOPEN2K/fmtmsg.h/linknamespace = yes
|
test-xfail-XOPEN2K/fmtmsg.h/linknamespace = yes
|
||||||
test-xfail-POSIX2008/semaphore.h/linknamespace = yes
|
|
||||||
test-xfail-XOPEN2K8/fmtmsg.h/linknamespace = yes
|
test-xfail-XOPEN2K8/fmtmsg.h/linknamespace = yes
|
||||||
|
@ -14,11 +14,15 @@ libc_hidden_proto (lfind)
|
|||||||
extern void __hdestroy (void);
|
extern void __hdestroy (void);
|
||||||
extern void *__tsearch (const void *__key, void **__rootp,
|
extern void *__tsearch (const void *__key, void **__rootp,
|
||||||
__compar_fn_t compar);
|
__compar_fn_t compar);
|
||||||
|
libc_hidden_proto (__tsearch)
|
||||||
extern void *__tfind (const void *__key, void *const *__rootp,
|
extern void *__tfind (const void *__key, void *const *__rootp,
|
||||||
__compar_fn_t compar);
|
__compar_fn_t compar);
|
||||||
|
libc_hidden_proto (__tfind)
|
||||||
extern void *__tdelete (const void *__key, void **__rootp,
|
extern void *__tdelete (const void *__key, void **__rootp,
|
||||||
__compar_fn_t compar);
|
__compar_fn_t compar);
|
||||||
|
libc_hidden_proto (__tdelete)
|
||||||
extern void __twalk (const void *__root, __action_fn_t action);
|
extern void __twalk (const void *__root, __action_fn_t action);
|
||||||
|
libc_hidden_proto (__twalk)
|
||||||
extern void __tdestroy (void *__root, __free_fn_t freefct);
|
extern void __tdestroy (void *__root, __free_fn_t freefct);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -153,5 +153,6 @@ libc {
|
|||||||
__madvise;
|
__madvise;
|
||||||
__mktemp;
|
__mktemp;
|
||||||
__libc_ifunc_impl_list;
|
__libc_ifunc_impl_list;
|
||||||
|
__tdelete; __tfind; __tsearch; __twalk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -293,6 +293,7 @@ __tsearch (const void *key, void **vrootp, __compar_fn_t compar)
|
|||||||
|
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
libc_hidden_def (__tsearch)
|
||||||
weak_alias (__tsearch, tsearch)
|
weak_alias (__tsearch, tsearch)
|
||||||
|
|
||||||
|
|
||||||
@ -325,6 +326,7 @@ __tfind (key, vrootp, compar)
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
libc_hidden_def (__tfind)
|
||||||
weak_alias (__tfind, tfind)
|
weak_alias (__tfind, tfind)
|
||||||
|
|
||||||
|
|
||||||
@ -585,6 +587,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
|
|||||||
free (unchained);
|
free (unchained);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
libc_hidden_def (__tdelete)
|
||||||
weak_alias (__tdelete, tdelete)
|
weak_alias (__tdelete, tdelete)
|
||||||
|
|
||||||
|
|
||||||
@ -625,6 +628,7 @@ __twalk (const void *vroot, __action_fn_t action)
|
|||||||
if (root != NULL && action != NULL)
|
if (root != NULL && action != NULL)
|
||||||
trecurse (root, action, 0);
|
trecurse (root, action, 0);
|
||||||
}
|
}
|
||||||
|
libc_hidden_def (__twalk)
|
||||||
weak_alias (__twalk, twalk)
|
weak_alias (__twalk, twalk)
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ sem_close (sem)
|
|||||||
/* Locate the entry for the mapping the caller provided. */
|
/* Locate the entry for the mapping the caller provided. */
|
||||||
rec = NULL;
|
rec = NULL;
|
||||||
the_sem = sem;
|
the_sem = sem;
|
||||||
twalk (__sem_mappings, walker);
|
__twalk (__sem_mappings, walker);
|
||||||
if (rec != NULL)
|
if (rec != NULL)
|
||||||
{
|
{
|
||||||
/* Check the reference counter. If it is going to be zero, free
|
/* Check the reference counter. If it is going to be zero, free
|
||||||
@ -59,7 +59,7 @@ sem_close (sem)
|
|||||||
if (--rec->refcnt == 0)
|
if (--rec->refcnt == 0)
|
||||||
{
|
{
|
||||||
/* Remove the record from the tree. */
|
/* 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));
|
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->dev = st.st_dev;
|
||||||
fake->ino = st.st_ino;
|
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)
|
if (foundp != NULL)
|
||||||
{
|
{
|
||||||
/* There is already a mapping. Use it. */
|
/* 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. */
|
/* Insert the new value. */
|
||||||
if (existing != MAP_FAILED
|
if (existing != MAP_FAILED
|
||||||
&& tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
&& __tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||||
/* Successful. */
|
/* Successful. */
|
||||||
result = existing;
|
result = existing;
|
||||||
else
|
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->dev = st.st_dev;
|
||||||
fake->ino = st.st_ino;
|
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)
|
if (foundp != NULL)
|
||||||
{
|
{
|
||||||
/* There is already a mapping. Use it. */
|
/* 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. */
|
/* Insert the new value. */
|
||||||
if (existing != MAP_FAILED
|
if (existing != MAP_FAILED
|
||||||
&& tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
&& __tsearch (newp, &__sem_mappings, __sem_search) != NULL)
|
||||||
/* Successful. */
|
/* Successful. */
|
||||||
result = existing;
|
result = existing;
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user