]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[NET]: Zero length write() on socket should not simply return 0.
authorDavid S. Miller <davem@davemloft.net>
Thu, 18 Oct 2007 16:47:05 +0000 (18:47 +0200)
committerAdrian Bunk <bunk@kernel.org>
Thu, 18 Oct 2007 16:47:05 +0000 (18:47 +0200)
This fixes kernel bugzilla #5731

It should generate an empty packet for datagram protocols when the
socket is connected, for one.

The check is doubly-wrong because all that a write() can be is a
sendmsg() call with a NULL msg_control and a single entry iovec.  No
special semantics should be assigned to it, therefore the zero length
check should be removed entirely.

This matches the behavior of BSD and several other systems.

Alan Cox notes that SuSv3 says the behavior of a zero length write on
non-files is "unspecified", but that's kind of useless since BSD has
defined this behavior for a quarter century and BSD is essentially
what application folks code to.

Based upon a patch from Stephen Hemminger.

Adrian Bunk:
Backported to 2.6.16.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Adrian Bunk <bunk@kernel.org>
net/socket.c

index a00851f981dbfcb17b26f64d7bfc2a5e64e31a5d..1230704cd9ca9d8989f90bd3fcdc9112a46dfd2e 100644 (file)
@@ -775,8 +775,6 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const char __user *ubuf,
 
        if (pos != 0)
                return -ESPIPE;
-       if (count == 0)         /* Match SYS5 behaviour */
-               return 0;
 
        x = alloc_sock_iocb(iocb, (void __user *)ubuf, count, &siocb);
        if (!x)