Date: Wed, 18 Feb 2004 03:50:26 -0800 (PST) From: Volker Stolz <stolz@i2.informatik.rwth-aachen.de> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/61666: mount_nfs parsing bug, segmentation fault Message-ID: <200402181150.i1IBoPO3048725@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/61666; it has been noted by GNATS. From: Volker Stolz <stolz@i2.informatik.rwth-aachen.de> 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--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200402181150.i1IBoPO3048725>
