Fix getlogin_r namespace (bug 18527).

Various functions in XPG4 bring in references to getlogin_r, which is
not in XPG4; this is also a bug for some older POSIX versions which
aren't yet covered by the linknamespace tests.  This patch fixes this
by making getlogin_r into a weak alias for __getlogin_r and using
__getlogin_r as needed.

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

	[BZ #18527]
	* login/getlogin_r.c (getlogin_r): Rename to __getlogin_r and
	define as weak alias of __getlogin_r.  Use libc_hidden_weak.
	* sysdeps/mach/hurd/getlogin_r.c (getlogin_r): Likewise.
	* sysdeps/unix/getlogin_r.c (getlogin_r): Likewise.
	* sysdeps/unix/sysv/linux/getlogin_r.c (getlogin_r): Likewise.
	* include/unistd.h (__getlogin_r): Declare.  Use
	libc_hidden_proto.
	* posix/glob.c (glob): Call __getlogin_r instead of getlogin_r.
	* conform/Makefile (test-xfail-XPG3/glob.h/linknamespace): Remove
	variable.
	(test-xfail-XPG3/wordexp.h/linknamespace): Likewise.
	(test-xfail-XPG4/glob.h/linknamespace): Likewise.
	(test-xfail-XPG4/wordexp.h/linknamespace): Likewise.
This commit is contained in:
Joseph Myers 2015-06-12 20:02:30 +00:00
parent a82a3db950
commit 5371d99e87
9 changed files with 39 additions and 16 deletions

View file

@ -1,3 +1,20 @@
2015-06-12 Joseph Myers <joseph@codesourcery.com>
[BZ #18527]
* login/getlogin_r.c (getlogin_r): Rename to __getlogin_r and
define as weak alias of __getlogin_r. Use libc_hidden_weak.
* sysdeps/mach/hurd/getlogin_r.c (getlogin_r): Likewise.
* sysdeps/unix/getlogin_r.c (getlogin_r): Likewise.
* sysdeps/unix/sysv/linux/getlogin_r.c (getlogin_r): Likewise.
* include/unistd.h (__getlogin_r): Declare. Use
libc_hidden_proto.
* posix/glob.c (glob): Call __getlogin_r instead of getlogin_r.
* conform/Makefile (test-xfail-XPG3/glob.h/linknamespace): Remove
variable.
(test-xfail-XPG3/wordexp.h/linknamespace): Likewise.
(test-xfail-XPG4/glob.h/linknamespace): Likewise.
(test-xfail-XPG4/wordexp.h/linknamespace): Likewise.
2015-06-12 Martin Sebor <msebor@redhat.com>
[BZ #18512]

2
NEWS
View file

@ -21,7 +21,7 @@ Version 2.22
18211, 18217, 18220, 18221, 18234, 18244, 18247, 18287, 18319, 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.
18512, 18519, 18520, 18522, 18527.
* Cache information can be queried via sysconf() function on s390 e.g. with
_SC_LEVEL1_ICACHE_SIZE as argument.

View file

@ -345,15 +345,11 @@ test-xfail-XOPEN2K/ndbm.h/linknamespace = yes
test-xfail-XOPEN2K8/ndbm.h/linknamespace = yes
# Unsorted expected failures.
test-xfail-XPG3/glob.h/linknamespace = yes
test-xfail-XPG3/unistd.h/linknamespace = yes
test-xfail-XPG3/wordexp.h/linknamespace = yes
test-xfail-XPG4/fmtmsg.h/linknamespace = yes
test-xfail-XPG4/glob.h/linknamespace = yes
test-xfail-XPG4/netdb.h/linknamespace = yes
test-xfail-XPG4/syslog.h/linknamespace = yes
test-xfail-XPG4/unistd.h/linknamespace = yes
test-xfail-XPG4/wordexp.h/linknamespace = yes
test-xfail-POSIX/mqueue.h/linknamespace = yes
test-xfail-POSIX/semaphore.h/linknamespace = yes
test-xfail-UNIX98/fmtmsg.h/linknamespace = yes

View file

@ -14,6 +14,8 @@ libc_hidden_proto (execvp)
libc_hidden_proto (getpid)
libc_hidden_proto (getsid)
libc_hidden_proto (getdomainname)
extern __typeof (getlogin_r) __getlogin_r __nonnull ((1));
libc_hidden_proto (__getlogin_r)
libc_hidden_proto (getlogin_r)
libc_hidden_proto (seteuid)
libc_hidden_proto (setegid)

View file

@ -23,13 +23,15 @@
If it cannot be determined or some other error occurred, return the error
code. Otherwise return 0. */
int
getlogin_r (name, name_len)
__getlogin_r (name, name_len)
char *name;
size_t name_len;
{
__set_errno (ENOSYS);
return errno;
}
libc_hidden_def (getlogin_r)
libc_hidden_def (__getlogin_r)
weak_alias (__getlogin_r, getlogin_r)
libc_hidden_weak (getlogin_r)
stub_warning (getlogin_r)

View file

@ -619,7 +619,7 @@ glob (pattern, flags, errfunc, pglob)
buflen = 20;
name = alloca_account (buflen, alloca_used);
success = getlogin_r (name, buflen) == 0;
success = __getlogin_r (name, buflen) == 0;
if (success)
{
struct passwd *p;

View file

@ -25,7 +25,7 @@
If it cannot be determined or some other error occurred, return the error
code. Otherwise return 0. */
int
getlogin_r (name, name_len)
__getlogin_r (name, name_len)
char *name;
size_t name_len;
{
@ -45,4 +45,6 @@ getlogin_r (name, name_len)
memcpy (name, login, len);
return 0;
}
libc_hidden_def (getlogin_r)
libc_hidden_def (__getlogin_r)
weak_alias (__getlogin_r, getlogin_r)
libc_hidden_weak (getlogin_r)

View file

@ -34,7 +34,7 @@
STATIC
#endif
int
getlogin_r (name, name_len)
__getlogin_r (name, name_len)
char *name;
size_t name_len;
{
@ -99,5 +99,7 @@ getlogin_r (name, name_len)
return result;
}
#ifndef STATIC
libc_hidden_def (getlogin_r)
libc_hidden_def (__getlogin_r)
weak_alias (__getlogin_r, getlogin_r)
libc_hidden_weak (getlogin_r)
#endif

View file

@ -21,9 +21,9 @@
#define STATIC static
static int getlogin_r_fd0 (char *name, size_t namesize);
#define getlogin_r getlogin_r_fd0
#define __getlogin_r getlogin_r_fd0
#include <sysdeps/unix/getlogin_r.c>
#undef getlogin_r
#undef __getlogin_r
/* Try to determine login name from /proc/self/loginuid and return 0
@ -109,7 +109,7 @@ __getlogin_r_loginuid (name, namesize)
code. Otherwise return 0. */
int
getlogin_r (name, namesize)
__getlogin_r (name, namesize)
char *name;
size_t namesize;
{
@ -119,4 +119,6 @@ getlogin_r (name, namesize)
return getlogin_r_fd0 (name, namesize);
}
libc_hidden_def (getlogin_r)
libc_hidden_def (__getlogin_r)
weak_alias (__getlogin_r, getlogin_r)
libc_hidden_weak (getlogin_r)