inetd UNIX socket bug (and small fix)

Aragon Gouveia aragon at phat.za.net
Mon Feb 19 11:06:34 UTC 2007


Hi all,

Sorry to drag this one out.  I eventually tried creating a unix type entry
in inetd.conf on a 6.2-RELEASE machine.  The behaviour is still the same.

Maxim, I tried copy/pasting your entry (changed user/group though) into my
inetd.conf, but it made no difference for me.  I do not understand how
your's is working and none of mine aren't?

Anyway, I have logged a PR for this.  Number is 109315.


Thanks,
Aragon



| By Maxim Konovalov <maxim at macomnet.ru>
|                                          [ 2006-11-10 15:14 +0200 ]
> On Fri, 20 Oct 2006, 22:15+0200, Aragon Gouveia wrote:
> 
> > Hello,
> >
> > I have been trying to setup a UNIX socket service in inetd, but it appears
> > the functionality has been broken for some time.  I guess I'm the first to
> > notice.
> >
> > With a UNIX socket service entry in inetd.conf the socket file is created as
> > it should be, but when I try make a connection to the socket, it establishes
> > and then immediately closes.  There is nothing logged to syslog and not
> > much info when in debug mode (inetd -d).
> >
> > In my code references below I should mention that I'm still running
> > 4.10-RELEASE so my line numbering might be out.  But from looking at HEAD
> > via CVSweb it looks like the bug is still there.  Hopefully this
> > information is of relevance.
> >
> > I had a look through inetd.c and found the following in cpmip() starting at
> > line 2202:
> >
> > ---
> >                         case AF_INET:
> >                                 p = (char *)&sin4->sin_addr;
> >                                 addrlen = sizeof(struct in_addr);
> >                                 break;
> > #ifdef INET6
> >                         case AF_INET6:
> >                                 p = (char *)&sin6->sin6_addr;
> >                                 addrlen = sizeof(struct in6_addr);
> >                                 break;
> > #endif
> >                         default:
> >                                 /* should not happen */
> >                                 return -1;
> >                         }
> > ---
> >
> > There is no case entry for AF_UNIX.  From my testing execution was reaching
> > the default: entry when an AF_UNIX connection was established.  When cpmip()
> > returns a negative value it looks like inetd silently closes the socket.
> >
> > At the bottom of this message is a patch which seems to make it work.  The
> > only oddity is that when logging is enabled (inetd -l), AF_UNIX connections
> > are logged as coming from "unknown".  No biggie for me, but there might be a
> > better fix.
> >
> > Should I create a PR for this?
> 
> inetd over AF_UNIX works OK on RELENG_4 and HEAD.  I've just added
> 
> :maxim:maxim:220:/tmp/telnet    stream  unix    nowait  root    /usr/libexec/telnetd   telnetd
> 
> to inetd.conf and was able to login to my system via telnet -u /tmp/telnet.
> 
> Builtin services like chargen work over AF_UNIX sockets too.


More information about the freebsd-bugs mailing list