Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix qsort_r namespace (bug 17571).
qsort_r is defined in the same file as qsort, but is not an ISO C
function, so should be a weak alias for __qsort_r.  The uses in
getaddrinfo should also call __qsort_r, since getaddrinfo is a POSIX
function and qsort_r isn't.  This patch implements this.  Because nscd
uses the getaddrinfo sources outside libc, as do the tst-rfc3484
tests, a #define of __qsort_r to qsort_r is added there alongside the
similar defines for other libc-internal symbols used in getaddrinfo.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).

	[BZ #17571]
	* stdlib/msort.c (qsort_r): Rename to __qsort_r and define as weak
	alias of __qsort_r.
	(qsort): Call __qsort_r instead of qsort_r.
	* include/stdlib.h (qsort_r): Do not call libc_hidden_proto.
	(__qsort_r): Declare.  Call libc_hidden_proto.
	* sysdeps/posix/getaddrinfo.c (getaddrinfo): Call __qsort_r
	instead of qsort_r.
	* nscd/gai.c (__qsort_r): Define to qsort_r.
	* posix/tst-rfc3484.c (__qsort_r): Likewise.
	* posix/tst-rfc3484-2.c (__qsort_r): Likewise.
	* posix/tst-rfc3484-3.c (__qsort_r): Likewise.
  • Loading branch information
Joseph Myers committed Nov 12, 2014
1 parent c52ff39 commit bef8fd6
Show file tree
Hide file tree
Showing 9 changed files with 26 additions and 7 deletions.
13 changes: 13 additions & 0 deletions ChangeLog
@@ -1,5 +1,18 @@
2014-11-12 Joseph Myers <joseph@codesourcery.com>

[BZ #17571]
* stdlib/msort.c (qsort_r): Rename to __qsort_r and define as weak
alias of __qsort_r.
(qsort): Call __qsort_r instead of qsort_r.
* include/stdlib.h (qsort_r): Do not call libc_hidden_proto.
(__qsort_r): Declare. Call libc_hidden_proto.
* sysdeps/posix/getaddrinfo.c (getaddrinfo): Call __qsort_r
instead of qsort_r.
* nscd/gai.c (__qsort_r): Define to qsort_r.
* posix/tst-rfc3484.c (__qsort_r): Likewise.
* posix/tst-rfc3484-2.c (__qsort_r): Likewise.
* posix/tst-rfc3484-3.c (__qsort_r): Likewise.

[BZ #17570]
* malloc/malloc.c (malloc_info): Rename to __malloc_info and
define as weak alias of __malloc_info.
Expand Down
2 changes: 1 addition & 1 deletion NEWS
Expand Up @@ -11,7 +11,7 @@ Version 2.21

6652, 12926, 14132, 14138, 14171, 15215, 15884, 17266, 17344, 17363,
17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, 17508, 17522,
17555, 17570, 17583, 17584.
17555, 17570, 17571, 17583, 17584.

* New locales: tu_IN, bh_IN.

Expand Down
3 changes: 2 additions & 1 deletion include/stdlib.h
Expand Up @@ -37,7 +37,8 @@ extern __typeof (secure_getenv) __libc_secure_getenv;
libc_hidden_proto (__libc_secure_getenv)
libc_hidden_proto (bsearch)
libc_hidden_proto (qsort)
libc_hidden_proto (qsort_r)
extern __typeof (qsort_r) __qsort_r;
libc_hidden_proto (__qsort_r)
libc_hidden_proto (lrand48_r)
libc_hidden_proto (wctomb)

Expand Down
1 change: 1 addition & 0 deletions nscd/gai.c
Expand Up @@ -28,6 +28,7 @@
#define __sendto sendto
#define __strchrnul strchrnul
#define __getline getline
#define __qsort_r qsort_r
/* nscd uses 1MB or 2MB thread stacks. */
#define __libc_use_alloca(size) (size <= __MAX_ALLOCA_CUTOFF)

Expand Down
1 change: 1 addition & 0 deletions posix/tst-rfc3484-2.c
Expand Up @@ -10,6 +10,7 @@
#define __inet_aton inet_aton
#define __gethostbyaddr_r gethostbyaddr_r
#define __gethostbyname2_r gethostbyname2_r
#define __qsort_r qsort_r

void
attribute_hidden
Expand Down
1 change: 1 addition & 0 deletions posix/tst-rfc3484-3.c
Expand Up @@ -10,6 +10,7 @@
#define __inet_aton inet_aton
#define __gethostbyaddr_r gethostbyaddr_r
#define __gethostbyname2_r gethostbyname2_r
#define __qsort_r qsort_r

void
attribute_hidden
Expand Down
1 change: 1 addition & 0 deletions posix/tst-rfc3484.c
Expand Up @@ -10,6 +10,7 @@
#define __inet_aton inet_aton
#define __gethostbyaddr_r gethostbyaddr_r
#define __gethostbyname2_r gethostbyname2_r
#define __qsort_r qsort_r

void
attribute_hidden
Expand Down
7 changes: 4 additions & 3 deletions stdlib/msort.c
Expand Up @@ -162,7 +162,7 @@ msort_with_tmp (const struct msort_param *p, void *b, size_t n)


void
qsort_r (void *b, size_t n, size_t s, __compar_d_fn_t cmp, void *arg)
__qsort_r (void *b, size_t n, size_t s, __compar_d_fn_t cmp, void *arg)
{
size_t size = n * s;
char *tmp = NULL;
Expand Down Expand Up @@ -298,12 +298,13 @@ qsort_r (void *b, size_t n, size_t s, __compar_d_fn_t cmp, void *arg)
}
free (tmp);
}
libc_hidden_def (qsort_r)
libc_hidden_def (__qsort_r)
weak_alias (__qsort_r, qsort_r)


void
qsort (void *b, size_t n, size_t s, __compar_fn_t cmp)
{
return qsort_r (b, n, s, (__compar_d_fn_t) cmp, NULL);
return __qsort_r (b, n, s, (__compar_d_fn_t) cmp, NULL);
}
libc_hidden_def (qsort)
4 changes: 2 additions & 2 deletions sysdeps/posix/getaddrinfo.c
Expand Up @@ -2626,11 +2626,11 @@ getaddrinfo (const char *name, const char *service,
__libc_lock_lock (lock);
if (__libc_once_get (old_once) && gaiconf_reload_flag)
gaiconf_reload ();
qsort_r (order, nresults, sizeof (order[0]), rfc3484_sort, &src);
__qsort_r (order, nresults, sizeof (order[0]), rfc3484_sort, &src);
__libc_lock_unlock (lock);
}
else
qsort_r (order, nresults, sizeof (order[0]), rfc3484_sort, &src);
__qsort_r (order, nresults, sizeof (order[0]), rfc3484_sort, &src);

/* Queue the results up as they come out of sorting. */
q = p = results[order[0]].dest_addr;
Expand Down

0 comments on commit bef8fd6

Please sign in to comment.