1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-01 09:41:45 +03:00

hurd: Ignore bytes beyond sockaddr length for AF_UNIX

This commit is contained in:
Samuel Thibault
2015-02-08 04:25:12 +01:00
parent 3999d26ead
commit a5eb23deb6
5 changed files with 22 additions and 8 deletions

View File

@ -45,6 +45,16 @@
_IOT__IOTBASE_uint64_t, _IOT__IOTBASE_size_t, _IOT__IOTBASE_ssize_t, _IOT__IOTBASE_uint64_t, _IOT__IOTBASE_size_t, _IOT__IOTBASE_ssize_t,
_IOTBASE_unsigned, _IOTBASE_signed): Define macros. _IOTBASE_unsigned, _IOTBASE_signed): Define macros.
[BZ #17944]
* hurd/hurdsocket.h: New file, defines _hurd_sun_path_dupa which
duplicates ADDR->sun_path with sockaddr LEN limitation.
* sysdeps/mach/hurd/connect.c: Include <string.h>
(__connect): Give result of _hurd_sun_path_dupa to name lookup.
* sysdeps/mach/hurd/sendmsg.c: Likewise.
* sysdeps/mach/hurd/sendto.c: Likewise.
* sysdeps/mach/hurd/bind.c: Call _hurd_sun_path_dupa instead of
implementing it by hand.
2015-02-06 Roland McGrath <roland@hack.frob.com> 2015-02-06 Roland McGrath <roland@hack.frob.com>
* sysdeps/arm/sysdep.h [!PROF] [ARCH_HAS_T2 && !PIC] (LDR_GLOBAL): * sysdeps/arm/sysdep.h [!PROF] [ARCH_HAS_T2 && !PIC] (LDR_GLOBAL):

View File

@ -25,7 +25,7 @@
#include <stddef.h> #include <stddef.h>
#include <hurd/ifsock.h> #include <hurd/ifsock.h>
#include <sys/un.h> #include <sys/un.h>
#include <string.h> #include "hurd/hurdsocket.h"
/* Give the socket FD the local address ADDR (which is LEN bytes long). */ /* Give the socket FD the local address ADDR (which is LEN bytes long). */
int int
@ -37,13 +37,11 @@ __bind (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
if (addr->sun_family == AF_LOCAL) if (addr->sun_family == AF_LOCAL)
{ {
char *name = _hurd_sun_path_dupa (addr, len);
/* For the local domain, we must create a node in the filesystem /* For the local domain, we must create a node in the filesystem
using the ifsock translator and then fetch the address from it. */ using the ifsock translator and then fetch the address from it. */
file_t dir, node, ifsock; file_t dir, node, ifsock;
char name[len - offsetof (struct sockaddr_un, sun_path) + 1], *n; char *n;
strncpy (name, addr->sun_path, sizeof name - 1);
name[sizeof name - 1] = '\0'; /* Make sure */
dir = __file_name_split (name, &n); dir = __file_name_split (name, &n);
if (dir == MACH_PORT_NULL) if (dir == MACH_PORT_NULL)

View File

@ -22,6 +22,7 @@
#include <hurd/socket.h> #include <hurd/socket.h>
#include <sys/un.h> #include <sys/un.h>
#include <hurd/ifsock.h> #include <hurd/ifsock.h>
#include "hurd/hurdsocket.h"
/* Open a connection on socket FD to peer at ADDR (which LEN bytes long). /* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
For connectionless socket types, just set the default address to send to For connectionless socket types, just set the default address to send to
@ -36,9 +37,10 @@ __connect (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
if (addr->sun_family == AF_LOCAL) if (addr->sun_family == AF_LOCAL)
{ {
char *name = _hurd_sun_path_dupa (addr, len);
/* For the local domain, we must look up the name as a file and talk /* For the local domain, we must look up the name as a file and talk
to it with the ifsock protocol. */ to it with the ifsock protocol. */
file_t file = __file_name_lookup (addr->sun_path, 0, 0); file_t file = __file_name_lookup (name, 0, 0);
if (file == MACH_PORT_NULL) if (file == MACH_PORT_NULL)
return -1; return -1;
err = __ifsock_getsockaddr (file, &aport); err = __ifsock_getsockaddr (file, &aport);

View File

@ -24,6 +24,7 @@
#include <hurd/fd.h> #include <hurd/fd.h>
#include <hurd/ifsock.h> #include <hurd/ifsock.h>
#include <hurd/socket.h> #include <hurd/socket.h>
#include "hurd/hurdsocket.h"
/* Send a message described MESSAGE on socket FD. /* Send a message described MESSAGE on socket FD.
Returns the number of bytes sent, or -1 for errors. */ Returns the number of bytes sent, or -1 for errors. */
@ -104,9 +105,10 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags)
{ {
if (addr->sun_family == AF_LOCAL) if (addr->sun_family == AF_LOCAL)
{ {
char *name = _hurd_sun_path_dupa (addr, addr_len);
/* For the local domain, we must look up the name as a file /* For the local domain, we must look up the name as a file
and talk to it with the ifsock protocol. */ and talk to it with the ifsock protocol. */
file_t file = __file_name_lookup (addr->sun_path, 0, 0); file_t file = __file_name_lookup (name, 0, 0);
if (file == MACH_PORT_NULL) if (file == MACH_PORT_NULL)
{ {
if (dealloc) if (dealloc)

View File

@ -22,6 +22,7 @@
#include <hurd/fd.h> #include <hurd/fd.h>
#include <hurd/ifsock.h> #include <hurd/ifsock.h>
#include <hurd/socket.h> #include <hurd/socket.h>
#include "hurd/hurdsocket.h"
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is /* 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. */ ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
@ -47,9 +48,10 @@ __sendto (int fd,
if (addr->sun_family == AF_LOCAL) if (addr->sun_family == AF_LOCAL)
{ {
char *name = _hurd_sun_path_dupa (addr, addr_len);
/* For the local domain, we must look up the name as a file and talk /* For the local domain, we must look up the name as a file and talk
to it with the ifsock protocol. */ to it with the ifsock protocol. */
file_t file = __file_name_lookup (addr->sun_path, 0, 0); file_t file = __file_name_lookup (name, 0, 0);
if (file == MACH_PORT_NULL) if (file == MACH_PORT_NULL)
return errno; return errno;
err_port = __ifsock_getsockaddr (file, aport); err_port = __ifsock_getsockaddr (file, aport);