This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Cygwin1.dll 1.7.0-5x: RSYNC failures in close() system call on pipe file descriptors



I wrote a small test program to isolate the problem from RSYNC.
The problem occurs when a file descriptor obtained from socketpair() is dup2()'ed into STDIN and then closed. The close call fails.
Output from the program is as follows:


socket 1 = 3
socket 2 = 4
dup2 socket 1...
closing socket 1...
close: Socket operation on non-socket
closing socket 1 failed


It is interesting to note that the close() is successful when the dup2 calling sequence is omitted.
Since socketpair() in cygwin appears to use AF_INET sockets to simulate AF_UNIX it might be interesting to try this on a single INET socket.




===============================================
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>

main()
{
       int fd[2];
       int res = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
       if (res < 0) {
               perror("socketpair");
               fprintf(stderr, "socketpair failed\n");
               exit(1);
       }

       fprintf(stderr, "socket 1 = %d\n", fd[0]);
       fprintf(stderr, "socket 2 = %d\n", fd[1]);

       fprintf(stderr, "dup2 socket 1...\n");
       res = dup2(fd[0], STDIN_FILENO);
       if (res < 0) {
               perror("dup2");
               fprintf(stderr, "dup2 failed\n");
       }

       fprintf(stderr, "closing socket 1...\n");
       res = close(fd[0] < 0);
       if (res < 0) {
               perror("close");
               fprintf(stderr, "closing socket 1 failed\n");
       }
}
=====================================================







cygwin wrote:

After updating 2 other systems to cygwin 1.7, I find that they also work fine in the same test.
However, that doesn't help much debugging this.


I found that the problem on the failing system is related to using Unix domain sockets for the IPC pipes.
If I replace the socketpair() call in fd_pair() in file util.c with pipe(), everything works fine.


int fd_pair(int fd[2])
{
       int ret;

//#ifdef HAVE_SOCKETPAIR
//      ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
//#else
       ret = pipe(fd);
//#endif

       if (ret == 0) {
               set_nonblocking(fd[0]);
               set_nonblocking(fd[1]);
       }

       return ret;
}

The fact that cygwin 1.5 works fine on this system indicates that something is going wrong in 1.7 cygwin1.dll triggered by some conditions on this particular system.




Corinna Vinschen wrote:
On Aug 13 13:17, cygwin wrote:
The RSYNC application fails in close() on the pipe streams to and from child processes created when rsync starts.
When running rsync.exe and cygwin1.dll from cygwin 1.5 within the 1.7 installation on the same system (WinXP pro),
the identical invocation completes without errors.


The problems appears to be a bug in the cygwin.dll

For example,

$ rsync -a /etc /test

produces the following messages:

rsync: Failed to dup/close: Socket operation on non-socket (108)
rsync error: error in IPC code (code 14) at pipe.c(147) [receiver=3.0.5]
rsync: read error: Connection reset by peer (104)
rsync error: error in IPC code (code 14) at io.c(759) [sender=3.0.5]

I tested the exact above command with cygwin 1.7-0-58 and rsync-3.0.5-1 on Windows 7, WIndows Server 2008 SP2, as well as on XP SP3.

Works fine for me on all three systems.


Corinna






--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]