www.delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2003/02/20/16:41:10

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Date: Thu, 20 Feb 2003 22:40:55 +0100
From: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
To: cygwin AT cygwin DOT com
Subject: Re: stat/fstat incompatibility w/ unix sockets
Message-ID: <20030220214055.GA2388@cygbert.vinschen.de>
Reply-To: cygwin AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
References: <20030220093011 DOT GA1403 AT cygbert DOT vinschen DOT de> <3E54D6DF DOT 19171 DOT 3D8BCC AT localhost>
Mime-Version: 1.0
In-Reply-To: <3E54D6DF.19171.3D8BCC@localhost>
User-Agent: Mutt/1.4i

On Thu, Feb 20, 2003 at 01:23:43PM -0500, Paul Swartz wrote:
> OK, here's what the script looks like on Cygwin:
> -----
> stat from filename (49536, 1374655, 27579L, 1, 1005, 513, 51, 
> 1045764368, 1045764368, 1045764368)
> stat from fileno   (49590, 1672, 2816L, 1, 0, 0, 0, 1045764368, 
> 1045764368, 1045764368)
> -----
> The lists correspond to (st_mode, st_ino, st_dev, st_nlink, st_uid, 
> st_gid, st_size, st_atime, st_mtime, st_ctime)
> 
> As you can see, most of the numbers are not the same.  In fact, the 
> only ones that /are/ the same at st_nlink and st_atime.
> 
> On *nix, the results look like this:
> -----
> stat from filename (49536, 3228941L, 769L, 1, 1037, 1037, 0L, 
> 1045736044, 1045736044, 1045736044)
> stat from fileno   (49663, 5351966L, 0L, 1, 1037, 1037, 0L, 
> 1045736044, 1045736044, 1045736044)
> -----
> The only ones on *nix that are different are the first three 
> (st_mode, st_ino, and, st_dev).
> 
> The difference in the fstat on the opened fileno and the stat on 
> the filename make it difficult, and probably impossible in some 
> cases, to tell if the socket opened is the same as the file.  This 
> makes writing secure software that uses UNIX sockets difficult, if 
> not impossible.

I created a testcase which allows me to reproduce your observation.
First of all let me say that thanks to your report I could find the
problem in Cygwin which explains the differences between stat() and
fstat().  However, I'm not quite sure if that will help you.  I've
created a AF_UNIX socket called "pipe.101" and this is the output of
my testcase:

STAT      : "pipe.101"
  st_dev    : b00
  st_ino    : -857905661
  st_mode   : 49590
  st_nlink  : 1
  st_uid    : 0
  st_gid    : 0
  st_rdev   : b00
  st_size   : 0
  st_blksize: 1024
  st_blocks : 0
  st_ctime : 1045775480
  st_mtime : 1045775480
  st_atime : 1045775480
FSTAT     : "pipe.101"
  st_dev    : b00
  st_ino    : 1872
  st_mode   : 49590
  st_nlink  : 1
  st_uid    : 0
  st_gid    : 0
  st_rdev   : b00
  st_size   : 0
  st_blksize: 1024
  st_blocks : 0
  st_ctime : 1045775480
  st_mtime : 1045775480
  st_atime : 1045775480

Note that except for st_ino all other fields are identical.  But other
than that, I don't see *any* field which you could use to identify the
results being the same file.  I've checked the same testcase on Linux
and I'm getting the following results:

STAT      : "pipe.101"
  st_dev    : 821
  st_ino    : 33442
  st_mode   : 49645
  st_nlink  : 1
  st_uid    : 500
  st_gid    : 100
  st_rdev   : 0
  st_size   : 0
  st_blksize: 4096
  st_blocks : 0
  st_ctime : 1045776973
  st_mtime : 1045776973
  st_atime : 1045776973
FSTAT     : "pipe.101"
  st_dev    : 0
  st_ino    : 378241
  st_mode   : 49663
  st_nlink  : 1
  st_uid    : 500
  st_gid    : 100
  st_rdev   : 0
  st_size   : 0
  st_blksize: 4096
  st_blocks : 0
  st_ctime : 1045776957
  st_mtime : 1045776957
  st_atime : 1045776804

As you can see, there's also nothing which would help you in using the
result to identify the sockets as being the same.  Even the timestamps
aren't identical.

Bottom line:  Trying to use the result of fstat/stat to identify a
socket is definitely non-portable and will give you more headaches
than useful results.

Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Developer                                mailto:cygwin AT cygwin DOT com
Red Hat, Inc.

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019