Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Joseph Myers committed Jun 17, 2015
1 parent be7dc2b commit d051b14
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 9 deletions.
20 changes: 20 additions & 0 deletions 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
Expand Down
2 changes: 1 addition & 1 deletion NEWS
Expand Up @@ -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.
Expand Down
2 changes: 0 additions & 2 deletions conform/Makefile
Expand Up @@ -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
4 changes: 4 additions & 0 deletions include/search.h
Expand Up @@ -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
1 change: 1 addition & 0 deletions misc/Versions
Expand Up @@ -153,5 +153,6 @@ libc {
__madvise;
__mktemp;
__libc_ifunc_impl_list;
__tdelete; __tfind; __tsearch; __twalk;
}
}
4 changes: 4 additions & 0 deletions misc/tsearch.c
Expand Up @@ -293,6 +293,7 @@ __tsearch (const void *key, void **vrootp, __compar_fn_t compar)

return q;
}
libc_hidden_def (__tsearch)
weak_alias (__tsearch, tsearch)


Expand Down Expand Up @@ -325,6 +326,7 @@ __tfind (key, vrootp, compar)
}
return NULL;
}
libc_hidden_def (__tfind)
weak_alias (__tfind, tfind)


Expand Down Expand Up @@ -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)


Expand Down Expand Up @@ -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)


Expand Down
4 changes: 2 additions & 2 deletions nptl/sem_close.c
Expand Up @@ -51,15 +51,15 @@ 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
all the resources. */
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));

Expand Down
5 changes: 3 additions & 2 deletions nptl/sem_open.c
Expand Up @@ -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. */
Expand Down Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions sysdeps/sparc/sparc32/sem_open.c
Expand Up @@ -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. */
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit d051b14

Please sign in to comment.