1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

swrap: Update to version 1.1.7

* Added support for accept4()
* Added support for OpenBSD
* Fixed sendto() with UDP and a connected socket
* Fixed AF_RAWLINK sockets

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>

Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Fri May 20 13:58:37 CEST 2016 on sn-devel-144
This commit is contained in:
Andreas Schneider 2016-05-20 10:20:28 +02:00 committed by Andreas Schneider
parent 249012f3e4
commit f85f4ce9cc
2 changed files with 85 additions and 12 deletions

View File

@ -335,9 +335,16 @@ static void swrap_log(enum swrap_dbglvl_e dbglvl,
#include <dlfcn.h>
struct swrap_libc_fns {
#ifdef HAVE_ACCEPT4
int (*libc_accept4)(int sockfd,
struct sockaddr *addr,
socklen_t *addrlen,
int flags);
#else
int (*libc_accept)(int sockfd,
struct sockaddr *addr,
socklen_t *addrlen);
#endif
int (*libc_bind)(int sockfd,
const struct sockaddr *addr,
socklen_t addrlen);
@ -552,12 +559,26 @@ static void *_swrap_load_lib_function(enum swrap_lib lib, const char *fn_name)
* has probably something todo with with the linker.
* So we need load each function at the point it is called the first time.
*/
#ifdef HAVE_ACCEPT4
static int libc_accept4(int sockfd,
struct sockaddr *addr,
socklen_t *addrlen,
int flags)
{
swrap_load_lib_function(SWRAP_LIBSOCKET, accept4);
return swrap.fns.libc_accept4(sockfd, addr, addrlen, flags);
}
#else /* HAVE_ACCEPT4 */
static int libc_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
swrap_load_lib_function(SWRAP_LIBSOCKET, accept);
return swrap.fns.libc_accept(sockfd, addr, addrlen);
}
#endif /* HAVE_ACCEPT4 */
static int libc_bind(int sockfd,
const struct sockaddr *addr,
@ -2386,6 +2407,9 @@ static int swrap_socket(int family, int type, int protocol)
#ifdef AF_NETLINK
case AF_NETLINK:
#endif /* AF_NETLINK */
#ifdef AF_PACKET
case AF_PACKET:
#endif /* AF_PACKET */
case AF_UNIX:
return libc_socket(family, type, protocol);
default:
@ -2575,7 +2599,10 @@ int pipe(int pipefd[2])
* ACCEPT
***************************************************************************/
static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
static int swrap_accept(int s,
struct sockaddr *addr,
socklen_t *addrlen,
int flags)
{
struct socket_info *parent_si, *child_si;
struct socket_info_fd *child_fi;
@ -2596,7 +2623,11 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
parent_si = find_socket_info(s);
if (!parent_si) {
#ifdef HAVE_ACCEPT4
return libc_accept4(s, addr, addrlen, flags);
#else
return libc_accept(s, addr, addrlen);
#endif
}
/*
@ -2609,7 +2640,11 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
return -1;
}
#ifdef HAVE_ACCEPT4
ret = libc_accept4(s, &un_addr.sa.s, &un_addr.sa_socklen, flags);
#else
ret = libc_accept(s, &un_addr.sa.s, &un_addr.sa_socklen);
#endif
if (ret == -1) {
if (errno == ENOTSOCK) {
/* Remove stale fds */
@ -2713,13 +2748,20 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
return fd;
}
#ifdef HAVE_ACCEPT4
int accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags)
{
return swrap_accept(s, addr, (socklen_t *)addrlen, flags);
}
#endif
#ifdef HAVE_ACCEPT_PSOCKLEN_T
int accept(int s, struct sockaddr *addr, Psocklen_t addrlen)
#else
int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
#endif
{
return swrap_accept(s, addr, (socklen_t *)addrlen);
return swrap_accept(s, addr, (socklen_t *)addrlen, 0);
}
static int autobind_start_init;
@ -3880,9 +3922,15 @@ static ssize_t swrap_sendmsg_before(int fd,
}
case SOCK_DGRAM:
if (si->connected) {
if (msg->msg_name) {
errno = EISCONN;
return -1;
if (msg->msg_name != NULL) {
/*
* We are dealing with unix sockets and if we
* are connected, we should only talk to the
* connected unix path. Using the fd to send
* to another server would be hard to achieve.
*/
msg->msg_name = NULL;
msg->msg_namelen = 0;
}
} else {
const struct sockaddr *msg_name;
@ -4429,12 +4477,25 @@ static ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags,
return len;
}
ret = libc_sendto(s,
buf,
len,
flags,
(struct sockaddr *)msg.msg_name,
msg.msg_namelen);
/*
* If it is a dgram socket and we are connected, don't include the
* 'to' address.
*/
if (si->type == SOCK_DGRAM && si->connected) {
ret = libc_sendto(s,
buf,
len,
flags,
NULL,
0);
} else {
ret = libc_sendto(s,
buf,
len,
flags,
(struct sockaddr *)msg.msg_name,
msg.msg_namelen);
}
swrap_sendmsg_after(s, si, &msg, to, ret);
@ -5248,6 +5309,16 @@ int eventfd(int count, int flags)
}
#endif
#ifdef HAVE_PLEDGE
int pledge(const char *promises, const char *paths[])
{
(void)promises; /* unused */
(void)paths; /* unused */
return 0;
}
#endif /* HAVE_PLEDGE */
/****************************
* DESTRUCTOR
***************************/

View File

@ -2,7 +2,7 @@
import os
VERSION="1.1.6"
VERSION="1.1.7"
def configure(conf):
if conf.CHECK_BUNDLED_SYSTEM('socket_wrapper', minversion=VERSION, set_target=False):
@ -74,6 +74,8 @@ def configure(conf):
conf.CHECK_FUNCS('getaddrinfo')
conf.CHECK_FUNCS('signalfd eventfd timerfd_create')
conf.CHECK_FUNCS('bindresvport')
conf.CHECK_FUNCS('pledge')
conf.CHECK_FUNCS('accept4')
conf.CHECK_FUNCS_IN('bind',
'socket',