FIXUP: libcli/smb/smb_direct_client: fix smb_direct_accept()
authorRalph Boehme <slow@samba.org>
Tue, 4 Oct 2016 04:19:21 +0000 (06:19 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Jun 2018 12:35:16 +0000 (14:35 +0200)
First working smb session ovder smb-d transport.

Commit: d7d380bad5ced419e53b2a01a21a72e2b0654e73
Trace: smb-d-step3.pcap

libcli/smb/smb_direct_client.c

index 2e7bd9b78a53e84061b9ce44efe444035ab869fe..21c45c71c1e9ac311246ad8dce216454a46c2f32 100644 (file)
@@ -256,11 +256,12 @@ struct smb_direct_socket *smb_direct_listen(struct smb_direct_socket *socket,
 int smb_direct_accept(struct smb_direct_socket *socket)
 {
        struct msghdr msg = { 0 };
-       int fd;
-       size_t fdlen;
-       int result;
+       int fd = -1;
+       size_t fdlen = msghdr_prep_recv_fds(NULL, NULL, 0, 1);
+       uint8_t buf[fdlen];
        uint8_t iobuf[1024] = {0, };
        struct iovec iov;
+       ssize_t nread;
 
        iov = (struct iovec) {
                .iov_base = iobuf,
@@ -277,18 +278,15 @@ int smb_direct_accept(struct smb_direct_socket *socket)
                return -1;
        }
 
-       fdlen = msghdr_prep_recv_fds(&msg, NULL, 0, 1);
+       msghdr_prep_recv_fds(&msg, buf, fdlen, 1);
 
-       {
-               uint8_t buf[fdlen];
+       do {
+               nread = recvmsg(socket->fd, &msg, 0);
+       } while ((nread == -1) && (errno == EINTR));
 
-               msghdr_prep_recv_fds(&msg, buf, fdlen, 1);
-
-               result = recvmsg(socket->fd, &msg, 0);
-               if (result == -1) {
-                       DBG_ERR("recvmsg failed [%s]\n", strerror(errno));
-                       return -1;
-               }
+       if (nread == -1) {
+               DBG_ERR("recvmsg failed [%s]\n", strerror(errno));
+               return -1;
        }
 
        msghdr_extract_fds(&msg, &fd, 1);