From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Tokarev Subject: Re: why would EPIPE cause socket port to change? Date: Tue, 23 Jan 2007 14:10:39 +0300 Message-ID: <45B5ED2F.7020303@tls.msk.ru> References: Mime-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 7bit Cc: dean gaudet , netdev@vger.kernel.org Return-path: Received: from hobbit.corpit.ru ([81.13.94.6]:24266 "EHLO hobbit.corpit.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932968AbXAWLKo (ORCPT ); Tue, 23 Jan 2007 06:10:44 -0500 To: Herbert Xu In-Reply-To: Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org Herbert Xu wrote: > dean gaudet wrote: >> in the test program below the getsockname result on a TCP socket changes >> across a write which produces EPIPE... here's a fragment of the strace: >> >> getsockname(3, {sa_family=AF_INET, sin_port=htons(37636), sin_addr=inet_addr("127.0.0.1")}, [17863593746633850896]) = 0 >> ... >> write(3, "hi!\n", 4) = 4 >> write(3, "hi!\n", 4) = -1 EPIPE (Broken pipe) >> --- SIGPIPE (Broken pipe) @ 0 (0) --- >> getsockname(3, {sa_family=AF_INET, sin_port=htons(59882), sin_addr=inet_addr("127.0.0.1")}, [16927060683038654480]) = 0 >> >> why does the port# change? this is on 2.6.19.1. > > Prior to the last write, the socket entered the CLOSED state meaning > that the old port is no longer allocated to it. As a result, the > last write operates on an unconnected socket which causes a new local > port to be allocated as an autobind. It then fails because the socket > is still not connected. Well, but why getsockname() didn't just return ENOTCONN? > So any attempt to run getsockname after an error on the socket is > simply buggy. Yes it is. But so is not returning ENOTCONN from getsockname(). I think. /mjt