From owner-freebsd-bugs@FreeBSD.ORG Wed Feb 18 03:50:26 2004 Return-Path: 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 8549616A4CE for ; Wed, 18 Feb 2004 03:50:26 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 65E1543D1F for ; Wed, 18 Feb 2004 03:50:26 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i1IBoQbv048752 for ; Wed, 18 Feb 2004 03:50:26 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.10/8.12.10/Submit) id i1IBoPO3048725; Wed, 18 Feb 2004 03:50:26 -0800 (PST) (envelope-from gnats) Date: Wed, 18 Feb 2004 03:50:26 -0800 (PST) Message-Id: <200402181150.i1IBoPO3048725@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Volker Stolz Subject: Re: bin/61666: mount_nfs parsing bug, segmentation fault X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Volker Stolz List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Feb 2004 11:50:26 -0000 The following reply was made to PR bin/61666; it has been noted by GNATS. From: Volker Stolz To: freebsd-gnats-submit@FreeBSD.org, j@pureftpd.org Cc: Subject: Re: bin/61666: mount_nfs parsing bug, segmentation fault Date: Wed, 18 Feb 2004 12:48:38 +0100 --cWoXeonUoKmBZSoM Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The attached patch *should* help, but probably needs careful review. The option handling is mind-boggling anyway, especially w.r.t. 'mountmode'. As 'getmntopts' and 'set_flags' are side-effect free, I'm confident it does the Right Thing. Patched and tested against -STABLE. Cheers, Volker -- http://www-i2.informatik.rwth-aachen.de/stolz/ *** PGP *** S/MIME rage against the finite state machine --cWoXeonUoKmBZSoM Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=mount_nfs --- mount_nfs/mount_nfs.c Tue Aug 5 10:56:03 2003 +++ vs.mount_nfs/mount_nfs.c Wed Feb 18 12:12:46 2004 @@ -259,7 +259,7 @@ register struct nfs_args *nfsargsp; struct nfs_args nfsargs; struct nfsd_cargs ncd; - int mntflags, altflags, nfssvc_flag, num; + int mntflags, altflags, curflags, nfssvc_flag, num; char *name, *p, *spec; char mntpath[MAXPATHLEN]; struct vfsconf vfc; @@ -355,43 +355,47 @@ nfsargsp->flags &= ~NFSMNT_RESVPORT; break; case 'o': - altflags = 0; + altflags = curflags = 0; + /* Get flags in current -o */ + getmntopts(optarg, mopts, &mntflags, &curflags); set_flags(&altflags, &nfsargsp->flags, TRUE); + /* NetBSD handles conflicting mountmodes much nicer */ if (mountmode == V2) - altflags |= ALTF_NFSV2; + curflags |= ALTF_NFSV2; else if (mountmode == V3) - altflags |= ALTF_NFSV3; - getmntopts(optarg, mopts, &mntflags, &altflags); + curflags |= ALTF_NFSV3; + /* Join old and new flags */ + altflags = altflags | curflags; set_flags(&altflags, &nfsargsp->flags, FALSE); /* - * Handle altflags which don't map directly to + * Handle curflags which don't map directly to * mount flags. */ - if(altflags & ALTF_BG) + if(curflags & ALTF_BG) opflags |= BGRND; - if(altflags & ALTF_MNTUDP) + if(curflags & ALTF_MNTUDP) mnttcp_ok = 0; - if(altflags & ALTF_TCP) { + if(curflags & ALTF_TCP) { nfsargsp->sotype = SOCK_STREAM; nfsproto = IPPROTO_TCP; } - if(altflags & ALTF_PORT) + if(curflags & ALTF_PORT) port_no = atoi(strstr(optarg, "port=") + 5); mountmode = ANY; - if(altflags & ALTF_NFSV2) + if(curflags & ALTF_NFSV2) mountmode = V2; - if(altflags & ALTF_NFSV3) + if(curflags & ALTF_NFSV3) mountmode = V3; - if(altflags & ALTF_ACREGMIN) + if(curflags & ALTF_ACREGMIN) nfsargsp->acregmin = atoi(strstr(optarg, "acregmin=") + 9); - if(altflags & ALTF_ACREGMAX) + if(curflags & ALTF_ACREGMAX) nfsargsp->acregmax = atoi(strstr(optarg, "acregmax=") + 9); - if(altflags & ALTF_ACDIRMIN) + if(curflags & ALTF_ACDIRMIN) nfsargsp->acdirmin = atoi(strstr(optarg, "acdirmin=") + 9); - if(altflags & ALTF_ACDIRMAX) + if(curflags & ALTF_ACDIRMAX) nfsargsp->acdirmax = atoi(strstr(optarg, "acdirmax=") + 9); break; --cWoXeonUoKmBZSoM--