Date: 08 Sep 2002 23:51:08 +0930 From: "Daniel O'Connor" <doconnor@gsoft.com.au> To: Peter Wemm <peter@FreeBSD.ORG> Cc: cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG Subject: Re: cvs commit: src/sbin/mount_nfs mount_nfs.c Message-ID: <1031494869.1246.33.camel@chowder.dons.net.au> In-Reply-To: <200209061959.g86JxTS9019217@freefall.freebsd.org> References: <200209061959.g86JxTS9019217@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--=-twYZ1F1WDLc8G0iotaBM Content-Type: text/plain Content-Transfer-Encoding: 7bit On Sat, 2002-09-07 at 05:29, Peter Wemm wrote: > Bandaid for mount_nfs segfaulting with the more obscure mount options > in /etc/fstab. This isn't a real fix though and I'm still not sure > why it started failing. mount(8) breaks up the nfs args into seperate > repeated '-o option=value' arguments. But, the altflags variable that > we use to track things is incrementally built up each time we see the > next option and shows us the cumulative set of flags, not just the > flag that we are currently looking at. As a result, the strstr hack > for looking up flags in a giant -o opt=val,opt=val, etc string was failing > and causing a segfault. I do not know what changed recently that caused > this to suddenly break, but the code has been rather bogus for some time. Hah, well I'm glad it wasn't just me... Any chance of MFC'ing this change? You left a debugging statement in too (See first part of the diff), and made some gratuitous tab/space changes. I've attached a diff for stable. Interestingly this still crashes -> /sbin/mount -onodev,soft,intr,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0 127.0.0.1:foo /usr/home/darius/abc But this doesn't -> /sbin/mount_nfs -onodev,soft,intr,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0 127.0.0.1:foo /usr/home/darius/abc In the former case mount_nfs crashes.. I can't see how that is possible though :( -- Daniel O'Connor software and network engineer for Genesis Software - http://www.gsoft.com.au "The nice thing about standards is that there are so many of them to choose from." -- Andrew Tanenbaum GPG Fingerprint - 9A8C 569F 685A D928 5140 AE4B 319B 41F4 5D17 FDD5 --=-twYZ1F1WDLc8G0iotaBM Content-Disposition: attachment; filename=mount_nfs-fix Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; name=mount_nfs-fix; charset=ISO-8859-1 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/sbin/mount_nfs/mount_nfs.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -p -r1.55 -r1.56 --- src/sbin/mount_nfs/mount_nfs.c 2002/08/26 13:08:23 1.55 +++ src/sbin/mount_nfs/mount_nfs.c 2002/09/06 19:59:29 1.56 @@ -45,7 +45,7 @@ static const char copyright[] =3D static char sccsid[] =3D "@(#)mount_nfs.c 8.11 (Berkeley) 5/4/95"; #endif static const char rcsid[] =3D - "$FreeBSD: /home/ncvs/src/sbin/mount_nfs/mount_nfs.c,v 1.55 2002/08/26 1= 3:08:23 iedowse Exp $"; + "$FreeBSD: /home/ncvs/src/sbin/mount_nfs/mount_nfs.c,v 1.56 2002/09/06 1= 9:59:29 peter Exp $"; #endif /* not lint */ =20 #include <sys/param.h> @@ -326,46 +326,58 @@ main(argc, argv) altflags |=3D ALTF_NFSV3; getmntopts(optarg, mopts, &mntflags, &altflags); set_flags(&altflags, &nfsargsp->flags, FALSE); +printf("altflags=3D %x, optarg =3D %s\n", altflags, optarg); /* * Handle altflags which don't map directly to * mount flags. */ - if(altflags & ALTF_BG) + if (altflags & ALTF_BG) opflags |=3D BGRND; - if(altflags & ALTF_MNTUDP) + if (altflags & ALTF_MNTUDP) mnttcp_ok =3D 0; - if(altflags & ALTF_TCP) { + if (altflags & ALTF_TCP) { nfsargsp->sotype =3D SOCK_STREAM; nfsproto =3D IPPROTO_TCP; } - if(altflags & ALTF_PORT) { + if (altflags & ALTF_PORT) { /* * XXX Converting from a string to an int * and back again is silly, and we should * allow /etc/services names. */ - asprintf(&portspec, "%d", - atoi(strstr(optarg, "port=3D") + 5)); - if (portspec =3D=3D NULL) - err(1, "asprintf"); + p =3D strstr(optarg, "port=3D"); + if (p) { + asprintf(&portspec, "%d", + atoi(p + 5)); + if (portspec =3D=3D NULL) + err(1, "asprintf"); + } } mountmode =3D ANY; - if(altflags & ALTF_NFSV2) + if (altflags & ALTF_NFSV2) mountmode =3D V2; - if(altflags & ALTF_NFSV3) + if (altflags & ALTF_NFSV3) mountmode =3D V3; - if(altflags & ALTF_ACREGMIN) - nfsargsp->acregmin =3D atoi(strstr(optarg, - "acregmin=3D") + 9); - if(altflags & ALTF_ACREGMAX) - nfsargsp->acregmax =3D atoi(strstr(optarg, - "acregmax=3D") + 9); - if(altflags & ALTF_ACDIRMIN) - nfsargsp->acdirmin =3D atoi(strstr(optarg, - "acdirmin=3D") + 9); - if(altflags & ALTF_ACDIRMAX) - nfsargsp->acdirmax =3D atoi(strstr(optarg, - "acdirmax=3D") + 9); + if (altflags & ALTF_ACREGMIN) { + p =3D strstr(optarg, "acregmin=3D"); + if (p) + nfsargsp->acregmin =3D atoi(p + 9); + } + if (altflags & ALTF_ACREGMAX) { + p =3D strstr(optarg, "acregmax=3D"); + if (p) + nfsargsp->acregmax =3D atoi(p + 9); + } + if (altflags & ALTF_ACDIRMIN) { + p =3D strstr(optarg, "acdirmin=3D"); + if (p) + nfsargsp->acdirmin =3D atoi(p + 9); + } + if (altflags & ALTF_ACDIRMAX) { + p =3D strstr(optarg, "acdirmax=3D"); + if (p) + nfsargsp->acdirmax =3D atoi(p + 9); + } break; case 'P': /* obsolete for NFSMNT_RESVPORT, now default */ --=-twYZ1F1WDLc8G0iotaBM-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1031494869.1246.33.camel>