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

cygwin karl@sipxx.com
Fri Aug 14 01:57:00 GMT 2009


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



More information about the Cygwin mailing list