Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Oct 2006 22:15:54 +0200
From:      Aragon Gouveia <aragon@phat.za.net>
To:        freebsd-bugs@freebsd.org
Subject:   inetd UNIX socket bug (and small fix)
Message-ID:  <20061020201554.GA9906@phat.za.net>

next in thread | raw e-mail | index | archive | help
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?


Thanks,
Aragon




--- inetd.c.orig        Sun Jul 27 15:58:05 2003
+++ inetd.c     Fri Oct 20 21:18:59 2006
@@ -2209,6 +2209,10 @@
                                addrlen = sizeof(struct in6_addr);
                                break;
 #endif
+                       case AF_UNIX:
+                               p = (char *)&sin4->sin_addr;
+                               addrlen = sizeof(struct in_addr);
+                               break;
                        default:
                                /* should not happen */
                                return -1;




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061020201554.GA9906>