From owner-freebsd-bugs Sun Nov 22 13:09:58 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id NAA12919 for freebsd-bugs-outgoing; Sun, 22 Nov 1998 13:09:58 -0800 (PST) (envelope-from owner-freebsd-bugs@FreeBSD.ORG) Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id NAA12892 for ; Sun, 22 Nov 1998 13:09:55 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.8.8/8.8.5) id NAA25610; Sun, 22 Nov 1998 13:10:01 -0800 (PST) Received: from post.mail.demon.net (post-20.mail.demon.net [194.217.242.27]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id NAA12564 for ; Sun, 22 Nov 1998 13:06:02 -0800 (PST) (envelope-from dmlb@ragnet.demon.co.uk) Received: from [158.152.46.40] (helo=ragnet.demon.co.uk) by post.mail.demon.net with smtp (Exim 2.053 #1) id 0zhgh9-0001WQ-00 for FreeBSD-gnats-submit@freebsd.org; Sun, 22 Nov 1998 21:05:24 +0000 Received: from dmlb by ragnet.demon.co.uk with local (Exim 1.82 #1) id 0zhgbg-0000Jz-00; Sun, 22 Nov 1998 20:59:44 +0000 Message-Id: Date: Sun, 22 Nov 1998 20:59:44 +0000 From: dmlb@ragnet.demon.co.uk Reply-To: dmlb@ragnet.demon.co.uk To: FreeBSD-gnats-submit@FreeBSD.ORG Cc: dmlb@ragnet.demon.co.uk X-Send-Pr-Version: 3.2 Subject: kern/8797: Addition to mount_portal Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 8797 >Category: kern >Synopsis: addition of tcplisten namespace to portal FS >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Nov 22 13:10:00 PST 1998 >Last-Modified: >Originator: Duncan Barclay >Organization: >Release: FreeBSD 2.2.6-RELEASE i386 >Environment: -current and -stable >Description: Adds tcplisten namespace to the portal filesystem. Will return a file descriptor to an accept'd socket. Write servers with /bin/sh >How-To-Repeat: n/a >Fix: Three files included in shar archive. All taken from current, but should applied to -stable as well. I may have overlapped some of these with previous PRs, sorry! Apply in src/sbin/mount_portal. # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # Makefile # portald.h # pt_conf.c # pt_tcplisten.c # echo x - Makefile sed 's/^X//' >Makefile << 'END-of-Makefile' X# From: @(#)Makefile 8.3 (Berkeley) 3/27/94 X# $Id: Makefile,v 1.8 1998/01/20 10:40:04 bde Exp $ X XPROG= mount_portal XSRCS= mount_portal.c activate.c conf.c getmntopts.c pt_conf.c \ X pt_exec.c pt_file.c pt_tcp.c pt_tcplisten.c XMAN8= mount_portal.8 X XMOUNT= ${.CURDIR}/../mount XCFLAGS+= -I${.CURDIR}/../../sys -I${MOUNT} X.PATH: ${MOUNT} X X.include END-of-Makefile echo x - portald.h sed 's/^X//' >portald.h << 'END-of-portald.h' X/* X * Copyright (c) 1992, 1993 X * The Regents of the University of California. All rights reserved. X * All rights reserved. X * X * This code is derived from software donated to Berkeley by X * Jan-Simon Pendry. X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by the University of X * California, Berkeley and its contributors. X * 4. Neither the name of the University nor the names of its contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * @(#)portald.h 8.1 (Berkeley) 6/5/93 X * X * $Id: portald.h,v 1.3 1997/02/22 14:32:55 peter Exp $ X */ X X#include X#include X X/* X * Meta-chars in an RE. Paths in the config file containing X * any of these characters will be matched using regexec, other X * paths will be prefix-matched. X */ X#define RE_CHARS ".|()[]*+?\\^$" X Xtypedef struct qelem qelem; X Xstruct qelem { X qelem *q_forw; X qelem *q_back; X}; X Xtypedef struct provider provider; Xstruct provider { X char *pr_match; X int (*pr_func) __P((struct portal_cred *, X char *key, char **v, int so, int *fdp)); X}; Xextern provider providers[]; X X/* X * Portal providers X */ Xextern int portal_exec __P((struct portal_cred *, X char *key, char **v, int so, int *fdp)); Xextern int portal_file __P((struct portal_cred *, X char *key, char **v, int so, int *fdp)); Xextern int portal_tcp __P((struct portal_cred *, X char *key, char **v, int so, int *fdp)); Xextern int portal_tcplisten __P((struct portal_cred *, X char *key, char **v, int so, int *fdp)); X X/* X * Global functions X */ Xextern void activate __P((qelem *q, int so)); Xextern char **conf_match __P((qelem *q, char *key)); Xextern void conf_read __P((qelem *q, char *conf)); END-of-portald.h echo x - pt_conf.c sed 's/^X//' >pt_conf.c << 'END-of-pt_conf.c' X/* X * Copyright (c) 1992, 1993 X * The Regents of the University of California. All rights reserved. X * All rights reserved. X * X * This code is derived from software donated to Berkeley by X * Jan-Simon Pendry. X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by the University of X * California, Berkeley and its contributors. X * 4. Neither the name of the University nor the names of its contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * @(#)pt_conf.c 8.1 (Berkeley) 6/5/93 X */ X X#ifndef lint Xstatic const char rcsid[] = X "$Id: pt_conf.c,v 1.4 1998/07/06 07:19:25 charnier Exp $"; X#endif /* not lint */ X X#include X#include X#include "portald.h" X Xprovider providers[] = { X { "exec", portal_exec }, X { "file", portal_file }, X { "tcp", portal_tcp }, X { "tcplisten", portal_tcplisten }, X { 0, 0 } X}; END-of-pt_conf.c echo x - pt_tcplisten.c sed 's/^X//' >pt_tcplisten.c << 'END-of-pt_tcplisten.c' X/* X * Copyright (c) 1992, 1993 X * The Regents of the University of California. All rights reserved. X * All rights reserved. X * X * This code is derived from software donated to Berkeley by X * Jan-Simon Pendry. X * X * Modified by Duncan Barclay. X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by the University of X * California, Berkeley and its contributors. X * 4. Neither the name of the University nor the names of its contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94 X * X * pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp X */ X X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X X#include "portald.h" X X/* X * Key will be tcplisten/host/port X * X * Create a TCP socket bound to the requested host and port. X * If the host is "ANY" the receving address will be set to INADDR_ANY. X * If the port is 0 the caller must find out the returned port number X * using a call to getsockname. X * X */ Xint portal_tcplisten(pcr, key, v, kso, fdp) X struct portal_cred *pcr; X char *key; X char **v; X int kso; X int *fdp; X{ X char host[MAXHOSTNAMELEN]; X char port[MAXHOSTNAMELEN]; X char *p = key + (v[1] ? strlen(v[1]) : 0); X char *q; X struct hostent *hp; X struct servent *sp; X struct in_addr **ipp; X struct in_addr *ip[2]; X struct in_addr ina; X u_short s_port; X int any = 0; X struct sockaddr_in sain; X X q = strchr(p, '/'); X if (q == 0 || q - p >= sizeof(host)) X return (EINVAL); X *q = '\0'; X strcpy(host, p); X p = q + 1; X X q = strchr(p, '/'); X if (q) X *q = '\0'; X if (strlen(p) >= sizeof(port)) X return (EINVAL); X strcpy(port, p); X X if (strcmp(host, "ANY") == 0) { X any = 1; X } else { X hp = gethostbyname(host); X if (hp != 0) { X ipp = (struct in_addr **) hp->h_addr_list; X } else { X ina.s_addr = inet_addr(host); X if (ina.s_addr == INADDR_NONE) X return (EINVAL); X ip[0] = &ina; X ip[1] = 0; X ipp = ip; X } X } X#ifdef DEBUG X if (any) X printf("INADDR_ANY to be used for hostname\n"); X else X printf("inet address for %s is %s\n", host, inet_ntoa(*ipp[0])); X#endif X X sp = getservbyname(port, "tcp"); X if (sp != NULL) { X s_port = (u_short) sp->s_port; X } else { X s_port = strtoul(port, &p, 0); X if (*p != '\0') X return (EINVAL); X s_port = htons(s_port); X } X if ((ntohs(s_port) != 0) && X (ntohs(s_port) <= IPPORT_RESERVED) && X (pcr->pcr_uid != 0)) X return (EPERM); X#ifdef DEBUG X printf("port number for %s is %d\n", port, ntohs(s_port)); X#endif X X memset(&sain, 0, sizeof(sain)); X sain.sin_len = sizeof(sain); X sain.sin_family = AF_INET; X sain.sin_port = s_port; X X if (any) { X int so; X int sock; X X so = socket(AF_INET, SOCK_STREAM, 0); X if (so < 0) { X syslog(LOG_ERR, "socket: %m"); X return (errno); X } X X sain.sin_addr.s_addr = INADDR_ANY; X if (bind(so, (struct sockaddr *) &sain, sizeof(sain)) == 0) { X listen(so, 1); X if ((sock = accept(so, (struct sockaddr *)0, (int *)0)) == -1) { X syslog(LOG_ERR, "accept: %m"); X (void) close(so); X return (errno); X } X *fdp = sock; X (void) close(so); X return (0); X } X syslog(LOG_ERR, "bind: %m"); X (void) close(so); X return (errno); X } X X while (ipp[0]) { X int so; X int sock; X X so = socket(AF_INET, SOCK_STREAM, 0); X if (so < 0) { X syslog(LOG_ERR, "socket: %m"); X return (errno); X } X X sain.sin_addr = *ipp[0]; X if (bind(so, (struct sockaddr *) &sain, sizeof(sain)) == 0) { X listen(so, 1); X if ((sock = accept(so, (struct sockaddr *)0, (int *)0)) == -1) { X syslog(LOG_ERR, "accept: %m"); X (void) close(so); X return (errno); X } X *fdp = sock; X (void) close(so); X return (0); X } X (void) close(so); X X ipp++; X } X X syslog(LOG_ERR, "bind: %m"); X return (errno); X X} END-of-pt_tcplisten.c exit >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message