lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1361285472.19353.126.camel@edumazet-glaptop>
Date:	Tue, 19 Feb 2013 06:51:12 -0800
From:	Eric Dumazet <eric.dumazet@...il.com>
To:	Tomas Hozza <thozza@...hat.com>
Cc:	netdev@...r.kernel.org
Subject: Re: SOCK_STREAM TCP: send() returns success even when other side
 responded with RST packet

On Tue, 2013-02-19 at 02:02 -0500, Tomas Hozza wrote:
> Hi.
> 
> I was advised to forward my networking Kernel related Bug here
> so it can get fixed much faster. Here is the Bug description
> copied from Red Hat Bugzilla (https://bugzilla.redhat.com/show_bug.cgi?id=912382):
> 
> Description of problem:
> I'm using SOCK_STREAM TCP sockets. Imagine server-client application.
> - Server will accept connection from client.
> - Client sends some data to server -> server receives data.
> - Client then half-closes the TCP connection using shutdown(fd, SHUT_WR).
> - Client waits for some data from the server.
> - Server sends some data to client -> client receives data.
> - Client exits and closes the socket.
> - After some time server tries to send some data to the client.
> - The first send() call returns success even the Client's response is RST.
> 
> 
> Version-Release number of selected component (if applicable):
> 3.7.7-201.fc18.x86_64
> 3.7.8-202.fc18.x86_64
> 
> 
> How reproducible:
> always
> 
> 
> Steps to Reproduce:
> 1. download attached client/server sources.
> 2. compile server: # gcc tcp_server.c -o server
> 3. compile client: # gcc tcp_client.c -o client
> 4. run the server: # ./server
> 5. run the client: # ./client
> 
> 
> Actual results:
> Server started...
> Created SOCK_STREAM socket
> Bound to localhost:6666
> waiting for connection...
> Client connected!
> Waiting for some data from client
> Received: "MSG from client"
> Received EOF
> Sending msg to client: "MSG from server"
> sleep(5)
> Sending 1 msg to client: "MSG from server"
> try #1 send() result: (0) Success
> Sending 2 msg to client: "MSG from server"
> try #2 send() result: (32) Broken pipe
> Server exiting...
> 
> 
> Expected results:
> Server should fail to send() data right after sleep().
> 
> Server started...
> Created SOCK_STREAM socket
> Bound to localhost:6666
> waiting for connection...
> Client connected!
> Waiting for some data from client
> Received: "MSG from client"
> Received EOF
> Sending msg to client: "MSG from server"
> sleep(5)
> Sending 1 msg to client: "MSG from server"
> try #1 send() result: (32) Broken pipe
> Server exiting...
> 
> 
> Additional info:
> RST answer means that data were NOT delivered. Therefore the very
> first send() call after server sleep() should fail!
> 
> 
> Regards,
> 
> Tomas Hozza

Hi Tomas

I read your bug report, but cant understand why you believe there is a
bug.

send() is not synchronous.

It only queues bytes to be transmitted either right now, either later
when its possible.

So a RST message can be received _after_ send() has accepted the request
and copy data from user land to kernel socket write queue, but TCP stack
did not yet delivered the data.

To make sure data is delivered, you need additional logic.



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ