From owner-freebsd-bugs Sun Aug 25 10:20:23 2002 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6D2D637B401 for ; Sun, 25 Aug 2002 10:20:06 -0700 (PDT) Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6D18743E84 for ; Sun, 25 Aug 2002 10:20:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.4/8.12.4) with ESMTP id g7PHK3JU030524 for ; Sun, 25 Aug 2002 10:20:03 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.4/8.12.4/Submit) id g7PHK3Sc030523; Sun, 25 Aug 2002 10:20:03 -0700 (PDT) Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7AC7437B400 for ; Sun, 25 Aug 2002 10:18:11 -0700 (PDT) Received: from imag.imag.fr (imag.imag.fr [129.88.30.1]) by mx1.FreeBSD.org (Postfix) with ESMTP id 13D3F43E6A for ; Sun, 25 Aug 2002 10:18:10 -0700 (PDT) (envelope-from Jean-Luc.Richier@imag.fr) Received: from horus.imag.fr (horus.imag.fr [129.88.38.1]) by imag.imag.fr (8.11.6/8.11.6) with ESMTP id g7PHI8v24473 for ; Sun, 25 Aug 2002 19:18:08 +0200 (MEST) Received: (from richier@localhost) by horus.imag.fr (8.11.6/8.11.6/Imag.pm.V2) id g7PHI8109471 for FreeBSD-gnats-submit@freebsd.org; Sun, 25 Aug 2002 19:18:08 +0200 (MEST) Received: from imag.imag.fr (imag.imag.fr [129.88.30.1]) by horus.imag.fr (8.11.6/8.11.6/Imag.pm.V2) with ESMTP id g7PHHgq09421 for ; Sun, 25 Aug 2002 19:17:42 +0200 (MEST) Received: from lagavulin.imag.fr (lagavulin.imag.fr [129.88.23.10]) by imag.imag.fr (8.11.6/8.11.6) with ESMTP id g7PHHgv24453 for ; Sun, 25 Aug 2002 19:17:42 +0200 (MEST) Received: from lagavulin.imag.fr (localhost [127.0.0.1]) by lagavulin.imag.fr (8.12.5/8.12.5) with ESMTP id g7PHGQ7B009358; Sun, 25 Aug 2002 19:16:27 +0200 (MEST) (envelope-from richier@horus.imag.fr) Received: (from root@localhost) by lagavulin.imag.fr (8.12.5/8.12.5/Submit) id g7PHGQ1W009357; Sun, 25 Aug 2002 19:16:26 +0200 (MEST) (envelope-from richier) Message-Id: <200208251716.g7PHGQ1W009357@lagavulin.imag.fr> Date: Sun, 25 Aug 2002 19:16:26 +0200 (MEST) From: Jean-Luc Richier Reply-To: Jean-Luc Richier To: FreeBSD-gnats-submit@FreeBSD.org Cc: Jean-Luc.Richier@imag.fr X-Send-Pr-Version: 3.113 Subject: bin/42004: quota and rpc.statd are still IPv4 only, and not INET independant Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org >Number: 42004 >Category: bin >Synopsis: quota and rpc.statd are still IPv4 only, and not INET independant >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Aug 25 10:20:02 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Jean-Luc Richier >Release: FreeBSD 5.0-CURRENT i386 >Organization: LSR-IMAG, Grenoble, France >Environment: System: FreeBSD lagavulin.imag.fr 5.0-CURRENT FreeBSD 5.0-CURRENT #1: Thu Aug 22 09:43:42 MEST 2002 richier@lagavulin.imag.fr:/altroot1a/usr/obj/usr/src/sys/GENERIC i386 >Description: Almost all NFS/kernel code has been ported to TIRPC in July and is therefore INET4/INET6 indenpendant. There is one command (quota) which has been forgotten, and a modification done in rpc.statd is not INET* independant. >How-To-Repeat: Code inspection >Fix: Applies the following patch - and do not use inet_ntoa/gethostby* functions, sockaddr_in structures and svc_getcaller call anymore. --- usr.bin/quota/quota.c.1.18 Fri Aug 9 06:36:48 2002 +++ usr.bin/quota/quota.c Sun Aug 25 17:43:36 2002 @@ -665,26 +665,20 @@ callaurpc(char *host, int prognum, int versnum, int procnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out) { - struct sockaddr_in server_addr; enum clnt_stat clnt_stat; - struct hostent *hp; struct timeval timeout, tottimeout; - CLIENT *client = NULL; - int sock = RPC_ANYSOCK; + CLIENT *client; - if ((hp = gethostbyname(host)) == NULL) - return ((int) RPC_UNKNOWNHOST); + /* XXX - If clnt_call fails, we should try other addresses and AF_ */ + client = clnt_create(host, prognum, versnum, "udp"); + if (client == NULL) + return ((int) rpc_createerr.cf_stat); + timeout.tv_usec = 0; timeout.tv_sec = 6; - bcopy(hp->h_addr, &server_addr.sin_addr, - MIN(hp->h_length,(int)sizeof(server_addr.sin_addr))); - server_addr.sin_family = AF_INET; - server_addr.sin_port = 0; - - if ((client = clntudp_create(&server_addr, prognum, - versnum, timeout, &sock)) == NULL) - return ((int) rpc_createerr.cf_stat); + (void) CLNT_CONTROL(client, + CLSET_RETRY_TIMEOUT, (char *)(void *)&timeout); client->cl_auth = authunix_create_default(); tottimeout.tv_sec = 25; --- usr.sbin/rpc.statd/procs.c.1.13 Tue Jul 16 00:47:17 2002 +++ usr.sbin/rpc.statd/procs.c Wed Aug 21 17:42:43 2002 @@ -52,6 +52,18 @@ #include "statd.h" +static const char * +from_addr(saddr) + struct sockaddr *saddr; +{ + static char inet_buf[INET6_ADDRSTRLEN]; + + if (getnameinfo(saddr, saddr->sa_len, inet_buf, sizeof(inet_buf), + NULL, 0, NI_NUMERICHOST) == 0) + return inet_buf; + return "???"; +} + /* sm_check_hostname -------------------------------------------------------- */ /* * Purpose: Check `mon_name' member of sm_name struct to ensure that the array @@ -66,13 +78,13 @@ int sm_check_hostname(struct svc_req *req, char *arg) { int len, dstlen, ret; - struct sockaddr_in *claddr; + struct sockaddr *claddr; char *dst; len = strlen(arg); dstlen = (4 * len) + 1; dst = malloc(dstlen); - claddr = svc_getcaller(req->rq_xprt); + claddr = svc_getrpccaller(req->rq_xprt); ret = 1; if (claddr == NULL || dst == NULL) @@ -83,7 +95,7 @@ { syslog(LOG_ERR, "sm_stat: client %s hostname %s contained invalid characters.", - inet_ntoa(claddr->sin_addr), + from_addr(claddr), dst); ret = 0; } @@ -102,7 +114,7 @@ { static sm_stat_res res; struct addrinfo *ai; - struct sockaddr_in *claddr; + struct sockaddr *claddr; static int err; err = 1; @@ -120,9 +132,9 @@ } else { - claddr = svc_getcaller(req->rq_xprt); + claddr = svc_getrpccaller(req->rq_xprt); syslog(LOG_ERR, "invalid hostname to sm_stat from %s: %s", - inet_ntoa(claddr->sin_addr), arg->mon_name); + from_addr(claddr), arg->mon_name); res.res_stat = stat_fail; } } >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message