This trivial half-liner should probably go in the kernel proper.
Attached is the satisfied user message, then his original complaint.
Patch against 2.3.31.

It's networking, but AF_UNIX, not ipv4/v6, so I'm not exactly sure
who the maintainer is.

                -- Pete

--- linux/net/core/datagram.c.orig      Sun Dec 12 13:30:40 1999
+++ linux/net/core/datagram.c   Sun Dec 12 13:31:50 1999
@@ -82,7 +83,7 @@
 
        /* Sequenced packets can come disconnected. If so we report the problem */
        error = -ENOTCONN;
-       if(connection_based(sk) && sk->state!=TCP_ESTABLISHED)
+       if(connection_based(sk) && !(sk->state==TCP_ESTABLISHED || 
+sk->state==TCP_LISTEN))
                goto out;
 
        /* handle signals */
Received: from california.sandia.gov (california.sandia.gov [146.246.250.1])
        by dancer.ca.sandia.gov (8.9.3/8.9.3) with ESMTP id NAA12793
        for <[EMAIL PROTECTED]>; Mon, 13 Dec 1999 13:42:31 -0800 (PST)
Received: (from smap@localhost) by california.sandia.gov (8.8.8/1.15) id NAA10001 for 
<[EMAIL PROTECTED]>; Mon, 13 Dec 1999 13:42:30 -0800 (PST)
Received: from a235017.ext.fluke.com(208.238.235.17) by ca.sandia.gov via smap (V1.3)
        id sma021866; Mon Dec 13 13:42:20 1999
Received: from 129.196.184.7 by evtvir02.tc.fluke.com (InterScan E-Mail VirusWall NT); 
Mon, 13 Dec 1999 13:42:10 -0800 (Pacific Standard Time)
Received: from dd.tc.fluke.com ([EMAIL PROTECTED] [129.196.148.100])
        by mailhub.tc.fluke.com (8.9.3/8.9.1) with ESMTP id NAA24594;
        Mon, 13 Dec 1999 13:42:10 -0800 (PST)
Received: from localhost (dcd@localhost [127.0.0.1]) by dd.tc.fluke.com (8.8.5/8.6.12) 
with ESMTP id NAA03400; Mon, 13 Dec 1999 13:42:11 -0800
Date: Mon, 13 Dec 1999 13:42:11 -0800 (PST)
From: David Dyck <[EMAIL PROTECTED]>
To: Pete Wyckoff <[EMAIL PROTECTED]>
cc: [EMAIL PROTECTED], [EMAIL PROTECTED]
Subject: Pete's patch fixes accept() for me, was Re: accept() doesn't block
 as it should in 2.3.x kernels
In-Reply-To: <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII


Thanks Pete, the patch you sent fixed accept() for
me, so now perl passes lib/io_unix test as well 
as my test program now blocks accept as I expect

  David

On Sun, 12 Dec 1999, Pete Wyckoff wrote:

> Date: Sun, 12 Dec 1999 13:45:42 -0800
> From: Pete Wyckoff <[EMAIL PROTECTED]>
> To: David Dyck <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED], [EMAIL PROTECTED]
> Subject: Re: accept() doesn't block as it should in 2.3.x kernels
> 
> [EMAIL PROTECTED] said:
> > 
> > The following demo code should block on the call to accept
> > but it doesn't in 2.3.x, (where x is 24,27,28,30,31, and 32pre2)
> > 
> > 2.2.5, 2.2.13, and 2.2.14pre9 block as expected in accept()
> > 
> > I'm getting 
> >   ENOTCONN    "Transport endpoint is not connected"
> 
> Looks like the changes to 2.3.15 did not take the accept() case into
> account.
>               -- Pete
> 
> --- linux/net/core/datagram.c.orig    Sun Dec 12 13:30:40 1999
> +++ linux/net/core/datagram.c Sun Dec 12 13:31:50 1999
> @@ -20,6 +20,7 @@
>   *           Alan Cox        :       Datagram iovec handling
>   *           Darryl Miles    :       Fixed non-blocking SOCK_STREAM.
>   *           Alan Cox        :       POSIXisms
> + *           Pete Wyckoff    :       Unconnected accept() fix.
>   *
>   */
>  
> @@ -82,7 +83,7 @@
>  
>       /* Sequenced packets can come disconnected. If so we report the problem */
>       error = -ENOTCONN;
> -     if(connection_based(sk) && sk->state!=TCP_ESTABLISHED)
> +     if(connection_based(sk) && !(sk->state==TCP_ESTABLISHED || 
>sk->state==TCP_LISTEN))
>               goto out;
>  
>       /* handle signals */
> 
Received: from lml.valinux.com ([EMAIL PROTECTED] [209.81.8.228])
        by dancer.ca.sandia.gov (8.9.3/8.9.3) with ESMTP id XAA06253
        for <[EMAIL PROTECTED]>; Sat, 11 Dec 1999 23:02:11 -0800 (PST)
Received: from vger.rutgers.edu (vger.rutgers.edu [128.6.190.2])
        by lml.valinux.com (Postfix) with ESMTP
        id 7D02359366; Sat, 11 Dec 1999 23:05:24 -0800 (PST)
Received: by vger.rutgers.edu via listexpand id <S156697AbPLLG7o>;
        Sun, 12 Dec 1999 01:59:44 -0500
Received: by vger.rutgers.edu id <S156397AbPLLG7X>;
        Sun, 12 Dec 1999 01:59:23 -0500
Received: from a235017.ext.fluke.com ([208.238.235.17]:3717 "HELO
        evtvir02.tc.fluke.com") by vger.rutgers.edu with SMTP
        id <S156388AbPLLG7R>; Sun, 12 Dec 1999 01:59:17 -0500
Received: from 129.196.184.7 by evtvir02.tc.fluke.com (InterScan E-Mail VirusWall NT); 
Sat, 11 Dec 1999 22:59:16 -0800 (Pacific Standard Time)
Received: from dd.tc.fluke.com ([EMAIL PROTECTED] [129.196.148.100])
        by mailhub.tc.fluke.com (8.9.3/8.9.1) with ESMTP id WAA29491
        for <[EMAIL PROTECTED]>; Sat, 11 Dec 1999 22:59:15 -0800 (PST)
Received: from localhost (dcd@localhost [127.0.0.1]) by dd.tc.fluke.com (8.8.5/8.6.12) 
with ESMTP id WAA04321 for <[EMAIL PROTECTED]>; Sat, 11 Dec 1999 22:59:17 
-0800
Date:   Sat, 11 Dec 1999 22:59:17 -0800 (PST)
From: David Dyck <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: accept() doesn't block as it should in 2.3.x kernels
Message-ID: <[EMAIL PROTECTED]>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Sender: [EMAIL PROTECTED]
Precedence: bulk
X-Loop: [EMAIL PROTECTED]
X-Orcpt: rfc822;linux-kernel-outgoing-dig
Status: RO
X-Status: A
Content-Length: 1652
Lines: 69


The following demo code should block on the call to accept
but it doesn't in 2.3.x, (where x is 24,27,28,30,31, and 32pre2)

2.2.5, 2.2.13, and 2.2.14pre9 block as expected in accept()

I'm getting 
  ENOTCONN    "Transport endpoint is not connected"

The man page for accept(2) leads me to believe that it should block

       If no pending connections are present on the queue,  and  the
       socket  is  not  marked  as  non- blocking,  accept  blocks the
       caller until a connection is present.
     
I discovered this when attempting to build perl for 2.3.32pre2
 (I'm using libc5.4.44 if that matters)
and it failed in when testing lib/io_unix

I will appreciate your comments

Thanks again,
  David Dyck

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define PATH "/tmp/sock-test"
int main()
{
    int s;
    pid_t pid;
    struct sockaddr_un sa = { AF_UNIX, PATH };
    char *buf[1024];

    unlink(PATH);       /* just in case */

    s = socket(AF_UNIX, SOCK_STREAM, 0);
    if (s == -1) { perror("socket"); exit(1); }

    if (bind(s, (struct sockaddr *)&sa, 
        strlen(sa.sun_path) + sizeof (sa.sun_family)) == -1) 
        { perror("bind"); exit(1); }

    if (listen(s, 5) == -1) {  perror("listen"); exit(1); }

    {
        int s2;
        int sa2_len;
        struct sockaddr_un sa2;

        if ((s2=accept(s, (struct sockaddr *)&sa2, &sa2_len)) == -1) 
            {perror("accept didn't block"); exit(1); }
    }


    return 0;
}




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to