swrap: Improve vfcntl to add the dup'd fd after the source fd
authorMichael Adam <obnox@samba.org>
Tue, 16 Aug 2016 09:04:43 +0000 (11:04 +0200)
committerAndreas Schneider <asn@samba.org>
Thu, 20 Oct 2016 08:50:37 +0000 (10:50 +0200)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

Signed-off-by: Michael Adam <obnox@samba.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
src/socket_wrapper.c

index 730e3467627fe0e5b10a4f5879b3e4f88bacfefb..b7de67c20469b14a2c968aac50cc7878931ffe5c 100644 (file)
@@ -5263,17 +5263,17 @@ int dup2(int fd, int newfd)
 
 static int swrap_vfcntl(int fd, int cmd, va_list va)
 {
-       struct socket_info_fd *fi;
+       struct socket_info_fd *src_fi, *fi;
        struct socket_info *si;
        int rc;
 
-       si = find_socket_info(fd);
-       if (si == NULL) {
-               rc = libc_vfcntl(fd, cmd, va);
-
-               return rc;
+       src_fi = find_socket_info_fd(fd);
+       if (src_fi == NULL) {
+               return libc_vfcntl(fd, cmd, va);
        }
 
+       si = src_fi->si;
+
        switch (cmd) {
        case F_DUPFD:
                fi = (struct socket_info_fd *)calloc(1, sizeof(struct socket_info_fd));
@@ -5296,7 +5296,7 @@ static int swrap_vfcntl(int fd, int cmd, va_list va)
                /* Make sure we don't have an entry for the fd */
                swrap_remove_stale(fi->fd);
 
-               SWRAP_DLIST_ADD(socket_fds, fi);
+               SWRAP_DLIST_ADD_AFTER(socket_fds, fi, src_fi);
 
                rc = fi->fd;
                break;