This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Fix sem_* tdelete, tfind, tsearch, twalk namespace (bug 18536)
- From: Joseph Myers <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Mon, 15 Jun 2015 16:50:33 +0000
- Subject: Fix sem_* tdelete, tfind, tsearch, twalk namespace (bug 18536)
- Authentication-results: sourceware.org; auth=none
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.
2015-06-15 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.
diff --git a/conform/Makefile b/conform/Makefile
index 9347b0f..873326b 100644
--- a/conform/Makefile
+++ b/conform/Makefile
@@ -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
diff --git a/include/search.h b/include/search.h
index 24eafc0..a941959 100644
--- a/include/search.h
+++ b/include/search.h
@@ -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
diff --git a/misc/Versions b/misc/Versions
index ec5aea7..534d1a3 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -153,5 +153,6 @@ libc {
__madvise;
__mktemp;
__libc_ifunc_impl_list;
+ __tdelete; __tfind; __tsearch; __twalk;
}
}
diff --git a/misc/tsearch.c b/misc/tsearch.c
index d4052e8..869dc9b 100644
--- a/misc/tsearch.c
+++ b/misc/tsearch.c
@@ -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)
diff --git a/nptl/sem_close.c b/nptl/sem_close.c
index 3f1ccbe..7f1df14 100644
--- a/nptl/sem_close.c
+++ b/nptl/sem_close.c
@@ -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));
diff --git a/nptl/sem_open.c b/nptl/sem_open.c
index bfd2dea..ecd051a 100644
--- a/nptl/sem_open.c
+++ b/nptl/sem_open.c
@@ -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
diff --git a/sysdeps/sparc/sparc32/sem_open.c b/sysdeps/sparc/sparc32/sem_open.c
index af9233c..2698d19 100644
--- a/sysdeps/sparc/sparc32/sem_open.c
+++ b/sysdeps/sparc/sparc32/sem_open.c
@@ -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
--
Joseph S. Myers
joseph@codesourcery.com