Fix mq_notify socket, recv namespace (bug 18546).

mq_notify (in the 1996 edition of POSIX) brings in references to recv
and socket (not in POSIX until the 2001 edition).  This patch fixes
this by using __recv and __socket, exporting them from libc at version
GLIBC_PRIVATE.

Tested for x86_64 and x86 (testsuite and comparison of installed
stripped shared libraries; PLT / dynamic symbol table changes render
the comparison not particularly useful for libc).

	[BZ #18546]
	* socket/recv.c (__recv): Use libc_hidden_def.
	* socket/socket.c (__socket): Likewise.
	* sysdeps/mach/hurd/recv.c (__recv): Likewise.
	* sysdeps/mach/hurd/socket.c (__socket): Likewise.
	* sysdeps/unix/sysv/linux/generic/recv.c (__recv): Likewise.
	* sysdeps/unix/sysv/linux/recv.c (__recv): Use libc_hidden_weak.
	* sysdeps/unix/sysv/linux/socket.c (__socket): Use
	libc_hidden_def.
	* sysdeps/unix/sysv/linux/x86_64/recv.c (__recv): Use
	libc_hidden_weak.
	* include/sys/socket.h (__socket): Do not use attribute_hidden.
	Use libc_hidden_proto.
	(__recv): Likewise.
	* socket/Versions (libc): Export __recv and __socket at version
	GLIBC_PRIVATE.
	* sysdeps/unix/sysv/linux/mq_notify.c (helper_thread): Call __recv
	instead of recv.
	(init_mq_netlink): Call __socket instead of socket.
	* conform/Makefile (test-xfail-POSIX/mqueue.h/linknamespace):
	Remove variable.
This commit is contained in:
Joseph Myers 2015-06-17 20:20:08 +00:00
parent dfa2d21450
commit 0595c98494
14 changed files with 39 additions and 8 deletions

View File

@ -1,5 +1,27 @@
2015-06-17 Joseph Myers <joseph@codesourcery.com>
[BZ #18546]
* socket/recv.c (__recv): Use libc_hidden_def.
* socket/socket.c (__socket): Likewise.
* sysdeps/mach/hurd/recv.c (__recv): Likewise.
* sysdeps/mach/hurd/socket.c (__socket): Likewise.
* sysdeps/unix/sysv/linux/generic/recv.c (__recv): Likewise.
* sysdeps/unix/sysv/linux/recv.c (__recv): Use libc_hidden_weak.
* sysdeps/unix/sysv/linux/socket.c (__socket): Use
libc_hidden_def.
* sysdeps/unix/sysv/linux/x86_64/recv.c (__recv): Use
libc_hidden_weak.
* include/sys/socket.h (__socket): Do not use attribute_hidden.
Use libc_hidden_proto.
(__recv): Likewise.
* socket/Versions (libc): Export __recv and __socket at version
GLIBC_PRIVATE.
* sysdeps/unix/sysv/linux/mq_notify.c (helper_thread): Call __recv
instead of recv.
(init_mq_netlink): Call __socket instead of socket.
* conform/Makefile (test-xfail-POSIX/mqueue.h/linknamespace):
Remove variable.
[BZ #18545]
* rt/mq_timedreceive.c (mq_timedreceive): Rename to
__mq_timedreceive and define as alias of __mq_timedreceive. Use

2
NEWS
View File

@ -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, 18536, 18539, 18540, 18542, 18544, 18545.
18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546.
* Cache information can be queried via sysconf() function on s390 e.g. with
_SC_LEVEL1_ICACHE_SIZE as argument.

View File

@ -346,4 +346,3 @@ test-xfail-XOPEN2K8/ndbm.h/linknamespace = yes
# Unsorted expected failures.
test-xfail-XPG3/unistd.h/linknamespace = yes
test-xfail-XPG4/unistd.h/linknamespace = yes
test-xfail-POSIX/mqueue.h/linknamespace = yes

View File

@ -8,7 +8,8 @@
protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically.
Returns a file descriptor for the new socket, or -1 for errors. */
extern int __socket (int __domain, int __type,
int __protocol) attribute_hidden;
int __protocol);
libc_hidden_proto (__socket)
/* Create two new sockets, of type TYPE in domain DOMAIN and using
protocol PROTOCOL, which are connected to each other, and put file
@ -64,8 +65,8 @@ libc_hidden_proto (__connect)
This function is a cancellation point and therefore not marked with
__THROW. */
extern ssize_t __recv (int __fd, void *__buf, size_t __n, int __flags)
attribute_hidden;
extern ssize_t __recv (int __fd, void *__buf, size_t __n, int __flags);
libc_hidden_proto (__recv)
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */

View File

@ -39,5 +39,6 @@ libc {
}
GLIBC_PRIVATE {
__sendmmsg;
__recv; __socket;
}
}

View File

@ -30,6 +30,7 @@ __recv (fd, buf, n, flags)
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__recv)
weak_alias (__recv, recv)
stub_warning (recv)

View File

@ -32,5 +32,6 @@ __socket (domain, type, protocol)
}
libc_hidden_def (__socket)
weak_alias (__socket, socket)
stub_warning (socket)

View File

@ -60,4 +60,5 @@ __recv (fd, buf, n, flags)
return nread;
}
libc_hidden_def (__recv)
weak_alias (__recv, recv)

View File

@ -64,4 +64,5 @@ __socket (domain, type, protocol)
return _hurd_intern_fd (sock, O_IGNORE_CTTY, 1);
}
libc_hidden_def (__socket)
weak_alias (__socket, socket)

View File

@ -28,4 +28,5 @@ __libc_recv (int sockfd, void *buffer, size_t len, int flags)
NULL, NULL);
}
strong_alias (__libc_recv, __recv)
libc_hidden_def (__recv)
weak_alias (__libc_recv, recv)

View File

@ -117,8 +117,8 @@ helper_thread (void *arg)
{
union notify_data data;
ssize_t n = recv (netlink_socket, &data, sizeof (data),
MSG_NOSIGNAL | MSG_WAITALL);
ssize_t n = __recv (netlink_socket, &data, sizeof (data),
MSG_NOSIGNAL | MSG_WAITALL);
if (n < NOTIFY_COOKIE_LEN)
continue;
@ -157,7 +157,7 @@ init_mq_netlink (void)
if (netlink_socket == -1)
{
/* Just a normal netlink socket, not bound. */
netlink_socket = socket (AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, 0);
netlink_socket = __socket (AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, 0);
/* No need to do more if we have no socket. */
if (netlink_socket == -1)
return;

View File

@ -29,3 +29,4 @@ __libc_recv (int fd, void *buf, size_t len, int flags)
}
weak_alias (__libc_recv, recv)
weak_alias (__libc_recv, __recv)
libc_hidden_weak (__recv)

View File

@ -26,4 +26,5 @@ __socket (int fd, int type, int domain)
{
return SOCKETCALL (socket, fd, type, domain);
}
libc_hidden_def (__socket)
weak_alias (__socket, socket)

View File

@ -29,4 +29,5 @@ __libc_recv (int fd, void *buf, size_t n, int flags)
}
weak_alias (__libc_recv, __recv)
libc_hidden_weak (__recv)
weak_alias (__recv, recv)