The branch, master has been updated
       via  6e1a3b5 swrap: use proper blocks for early returns
       via  1de39d8 swrap: Add support for openat()
      from  68e1cbf Increase wait time during echo_server's pid-file check

https://git.samba.org/?p=socket_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6e1a3b50fb344107f7cfbcef35a4cf10c1e12113
Author: Michael Adam <ob...@samba.org>
Date:   Fri Sep 23 16:33:52 2016 +0200

    swrap: use proper blocks for early returns
    
    This is better to read and might reduce the
    diff of later patches.
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 1de39d82428fc6559ea5ea2d35187808020be9bf
Author: Andreas Schneider <a...@samba.org>
Date:   Thu Mar 2 09:56:29 2017 +0100

    swrap: Add support for openat()

-----------------------------------------------------------------------

Summary of changes:
 src/socket_wrapper.c | 132 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 115 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 3d468c3..1d94a89 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -438,6 +438,7 @@ typedef int (*__libc_getsockopt)(int sockfd,
 typedef int (*__libc_ioctl)(int d, unsigned long int request, ...);
 typedef int (*__libc_listen)(int sockfd, int backlog);
 typedef int (*__libc_open)(const char *pathname, int flags, mode_t mode);
+typedef int (*__libc_openat)(int dirfd, const char *path, int flags, ...);
 typedef int (*__libc_pipe)(int pipefd[2]);
 typedef int (*__libc_read)(int fd, void *buf, size_t count);
 typedef ssize_t (*__libc_readv)(int fd, const struct iovec *iov, int iovcnt);
@@ -501,6 +502,7 @@ struct swrap_libc_symbols {
        SWRAP_SYMBOL_ENTRY(ioctl);
        SWRAP_SYMBOL_ENTRY(listen);
        SWRAP_SYMBOL_ENTRY(open);
+       SWRAP_SYMBOL_ENTRY(openat);
        SWRAP_SYMBOL_ENTRY(pipe);
        SWRAP_SYMBOL_ENTRY(read);
        SWRAP_SYMBOL_ENTRY(readv);
@@ -876,6 +878,34 @@ static int libc_open(const char *pathname, int flags, ...)
        return fd;
 }
 
+static int libc_vopenat(int dirfd, const char *path, int flags, va_list ap)
+{
+       long int mode = 0;
+       int fd;
+
+       swrap_bind_symbol_libc(openat);
+
+       mode = va_arg(ap, long int);
+
+       fd = swrap.libc.symbols._libc_openat.f(dirfd, path, flags, 
(mode_t)mode);
+
+       return fd;
+}
+
+#if 0
+static int libc_openat(int dirfd, const char *path, int flags, ...)
+{
+       va_list ap;
+       int fd;
+
+       va_start(ap, flags);
+       fd = libc_vopenat(dirfd, path, flags, ap);
+       va_end(ap);
+
+       return fd;
+}
+#endif
+
 static int libc_pipe(int pipefd[2])
 {
        swrap_bind_symbol_libsocket(pipe);
@@ -2279,7 +2309,9 @@ static int swrap_pcap_get_fd(const char *fname)
 {
        static int fd = -1;
 
-       if (fd != -1) return fd;
+       if (fd != -1) {
+               return fd;
+       }
 
        fd = libc_open(fname, O_WRONLY|O_CREAT|O_EXCL|O_APPEND, 0644);
        if (fd != -1) {
@@ -2332,7 +2364,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
 
        switch (type) {
        case SWRAP_CONNECT_SEND:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                src_addr  = &si->myname.sa.s;
                dest_addr = addr;
@@ -2346,7 +2380,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CONNECT_RECV:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                dest_addr = &si->myname.sa.s;
                src_addr = addr;
@@ -2360,7 +2396,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CONNECT_UNREACH:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                dest_addr = &si->myname.sa.s;
                src_addr  = addr;
@@ -2374,7 +2412,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CONNECT_ACK:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                src_addr  = &si->myname.sa.s;
                dest_addr = addr;
@@ -2386,7 +2426,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_ACCEPT_SEND:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                dest_addr = &si->myname.sa.s;
                src_addr = addr;
@@ -2400,7 +2442,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_ACCEPT_RECV:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                src_addr = &si->myname.sa.s;
                dest_addr = addr;
@@ -2414,7 +2458,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_ACCEPT_ACK:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                dest_addr = &si->myname.sa.s;
                src_addr = addr;
@@ -2521,7 +2567,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CLOSE_SEND:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                src_addr  = &si->myname.sa.s;
                dest_addr = &si->peername.sa.s;
@@ -2535,7 +2583,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CLOSE_RECV:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                dest_addr = &si->myname.sa.s;
                src_addr  = &si->peername.sa.s;
@@ -2549,7 +2599,9 @@ static uint8_t *swrap_pcap_marshall_packet(struct 
socket_info *si,
                break;
 
        case SWRAP_CLOSE_ACK:
-               if (si->type != SOCK_STREAM) return NULL;
+               if (si->type != SOCK_STREAM) {
+                       return NULL;
+               }
 
                src_addr  = &si->myname.sa.s;
                dest_addr = &si->peername.sa.s;
@@ -3143,7 +3195,9 @@ static int swrap_auto_bind(int fd, struct socket_info 
*si, int family)
                if (stat(un_addr.sa.un.sun_path, &st) == 0) continue;
 
                ret = libc_bind(fd, &un_addr.sa.s, un_addr.sa_socklen);
-               if (ret == -1) return ret;
+               if (ret == -1) {
+                       return ret;
+               }
 
                si->un_addr = un_addr.sa.un;
 
@@ -3188,7 +3242,9 @@ static int swrap_connect(int s, const struct sockaddr 
*serv_addr,
 
        if (si->bound == 0) {
                ret = swrap_auto_bind(s, si, serv_addr->sa_family);
-               if (ret == -1) return -1;
+               if (ret == -1) {
+                       return -1;
+               }
        }
 
        if (si->family != serv_addr->sa_family) {
@@ -3198,7 +3254,9 @@ static int swrap_connect(int s, const struct sockaddr 
*serv_addr,
 
        ret = sockaddr_convert_to_un(si, serv_addr,
                                     addrlen, &un_addr.sa.un, 0, &bcast);
-       if (ret == -1) return -1;
+       if (ret == -1) {
+               return -1;
+       }
 
        if (bcast) {
                errno = ENETUNREACH;
@@ -3357,7 +3415,9 @@ static int swrap_bind(int s, const struct sockaddr 
*myaddr, socklen_t addrlen)
                                     &un_addr.sa.un,
                                     1,
                                     &si->bcast);
-       if (ret == -1) return -1;
+       if (ret == -1) {
+               return -1;
+       }
 
        unlink(un_addr.sa.un.sun_path);
 
@@ -3549,6 +3609,40 @@ int open(const char *pathname, int flags, ...)
 }
 
 /****************************************************************************
+ *   OPENAT
+ ***************************************************************************/
+
+static int swrap_vopenat(int dirfd, const char *path, int flags, va_list ap)
+{
+       int ret;
+
+       ret = libc_vopenat(dirfd, path, flags, ap);
+       if (ret != -1) {
+               /*
+                * There are methods for closing descriptors (libc-internal code
+                * paths, direct syscalls) which close descriptors in ways that
+                * we can't intercept, so try to recover when we notice that
+                * that's happened
+                */
+               swrap_remove_stale(ret);
+       }
+
+       return ret;
+}
+
+int openat(int dirfd, const char *path, int flags, ...)
+{
+       va_list ap;
+       int fd;
+
+       va_start(ap, flags);
+       fd = swrap_vopenat(dirfd, path, flags, ap);
+       va_end(ap);
+
+       return fd;
+}
+
+/****************************************************************************
  *   GETPEERNAME
  ***************************************************************************/
 
@@ -4217,7 +4311,9 @@ static ssize_t swrap_sendmsg_before(int fd,
 
                        ret = sockaddr_convert_to_un(si, msg_name, 
msg->msg_namelen,
                                                     tmp_un, 0, bcast);
-                       if (ret == -1) return -1;
+                       if (ret == -1) {
+                               return -1;
+                       }
 
                        if (to_un) {
                                *to_un = tmp_un;
@@ -4252,7 +4348,9 @@ static ssize_t swrap_sendmsg_before(int fd,
                                             tmp_un,
                                             0,
                                             NULL);
-               if (ret == -1) return -1;
+               if (ret == -1) {
+                       return -1;
+               }
 
                ret = libc_connect(fd,
                                   (struct sockaddr *)(void *)tmp_un,


-- 
Socket Wrapper Repository

Reply via email to