From owner-freebsd-bugs@FreeBSD.ORG Fri Oct 20 20:23:12 2006 Return-Path: X-Original-To: freebsd-bugs@freebsd.org Delivered-To: freebsd-bugs@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5946616A4CA for ; Fri, 20 Oct 2006 20:23:12 +0000 (UTC) (envelope-from aragon@geek.sh) Received: from mail.geek.sh (decoder.geek.sh [196.36.198.81]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0930A43E80 for ; Fri, 20 Oct 2006 20:15:56 +0000 (GMT) (envelope-from aragon@geek.sh) Received: by mail.geek.sh (Postfix, from userid 1000) id AAE7524D4B; Fri, 20 Oct 2006 22:15:54 +0200 (SAST) Date: Fri, 20 Oct 2006 22:15:54 +0200 From: Aragon Gouveia To: freebsd-bugs@freebsd.org Message-ID: <20061020201554.GA9906@phat.za.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-Operating-System: FreeBSD 4.10-RELEASE-p2 i386 Subject: inetd UNIX socket bug (and small fix) X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Oct 2006 20:23:12 -0000 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;