sendmail and getpeername() on fd 0

2007-12-25 9:55:00

Original Question:

> while fiddling with the sendmail setups, I noticed some odd behaviour

> with getpeername(0, ...) both on SunOS and Solaris. sendmail's idea

> of how this should turn out is a return value of -1 and an errno of

> ENOTSOCK, which is caught (in sendmail's src/daemon.c:getauthinfo(),

> if you want to check there) and causes the $_ macro (verified sender)

> to be set to "user@localhost" [...] Now watch what the SUNs do:

   

   (Short short version: SunOS correctly returns ENOTSOCK except for

   'cat File | Prog', then sometimes returns OK, sometimes ENOTCONN

   = socket not connected; Solaris 2.4 correctly returns ENOTSOCK for

   'Prog < File', but errno's not mentioned in the manpage for 'Prog'

   and 'cat File | Prog'.)

Addendum:

   I forgot to mention that sendmail seems to catch the SunOS/cat|Prog/

   OK case correctly, too, because the "remote host name" returned has

   length 0. Plus two other special cases I didn't see actually occur

   in my tests (maybe meant for other OSes or uses).

Solution:

   Upgrade to 2.6 if possible.

   

   If you have to stay with SunOS, do '(cat File ; sleep 1) | Prog'

   (or longer) instead of 'cat File | Prog'.

   

   (Live with it else.)

Background info:

   Sockets were in fact broken WRT this kind of situation in pre-2.6

   Solaris; SUN redid sockets for 2.6 more or less from scratch, and

   I received confirmation that my test programs run fine on 2.6

   through 2.8.

   

   The problem with SunOS is best summarized by Per Hedeland:

> In SunOS 4, as in most if not all BSD or BSD-derived Unices, pipes are

> implemented using socketpair(), i.e. they are in fact sockets. The

> reason you get the ENOTCONN is probably because by the time sendmail

> gets around to do the getpeername(), 'cat' has already written its

> output and exited - i.e. the socket is no longer connected. This also

> means that sendmail AFAIK can't reliably find out what was at the other

> end or that the socket was in fact "local" [...].

Thanks to:

   Kari E. Hurtta

   John Beck

   Casper Dik <casper@holland.sun.com>

   Per Hedeland

Kind regards,

                                                                J. Bern


--
/\ /""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\
/ \/ bern@uni-trier.de/bern@ti.uni-trier.de| P.O. box 1203 | Ham: \/\
/ J. \ (Accepting PGP, MIME, SUNAttachments) | D-54202 Trier | DD0KZ/ \
\Bern/ finger bern@informatik.uni-trier.de | Email autoreply \ /
\ /\ http://www.informatik.uni-trier.de/~bern/ | on subject '##' /\/
\/ \____________________________________________________________/

Comments

Got something to say?

You must be logged in to post a comment.