Subject: bin/4384: boot floppies and fsck/mount: PR2975 not done right, 2974 still open
To: None <>
From: None <>
List: netbsd-bugs
Date: 10/29/1997 08:51:43
>Number:         4384
>Category:       bin
>Synopsis:       The proposed fix in PR 2975 appears to have been applied, but it had a bug.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Oct 29 07:05:00 1997
>Originator:     Brian Grayson
	Parallel and Distributed Systems
	Electrical and Computer Engineering
	The University of Texas at Austin
>Release:        Oct 28, 1997
NetBSD marvin 1.3_ALPHA NetBSD 1.3_ALPHA (MARVIN) #14: Mon Oct 27 11:38:47 CST 1997     bgrayson@marvin:/a/c3p0/home/c3p0/src/sys/arch/i386/compile/MARVIN i386

	PR 2974 and 2975 dealt with the fact that both mount and
	fsck, when passed the -t VFS switch, exec mount_VFS (or
	fsck_VFS).  However, they pass a bogus argv[0] of simply
	VFS, not mount_VFS.  This leads to problems on
	crunchgen'd things (such as boot floppies), because
	crunchgen'd programs look at argv[0] to determine what
	program to run.  Since both mount_VFS and fsck_VFS will
	cause a crunched binary to try to run VFS, one of the two
	programs will not be available.  (Someone added links for
	VFS->mount_VFS to all the appropriate crunchgen.conf
	files, so that at least mounting would work, but
	now one can't fsck -t VFS, only fsck_VFS, which defeats
	part of the point of having a single fsck that runs the
	appropriate fsck_VFS.)

	PR 2974 covered this and other problems, none of which appear to
	have been corrected?  PR 2975 covered simply the above
	problem for fsck, and was closed.  However, the patch was
	incorrect -- it sets argv[0] to vfstype, when it should
	be set to execbase.
	Boot a boot floppy, and try to run fsck /dev/wd0a.  It
	will fail with:

	mount_ffs: illegal option -- y
	usage: mount_ffs [-o options] special node

	because the crunch'd binary is trying to execute ffs -y,
	which gets mapped to mount_ffs via the bogus link in the
	ramdiskbin.conf file:

	ln mount_cd9660 cd9660
	ln mount_ffs ffs
	ln mount_msdos msdos
	ln mount_nfs nfs
	ln mount_kernfs kernfs
	For fsck.c:
--- /usr/src/sbin/fsck/fsck.c   Mon Oct 13 06:53:06 1997
+++ fsck.c      Wed Oct 29 08:36:52 1997
@@ -239,7 +239,7 @@
        /* construct basename of executable and argv[0]
         * simultaneously */
        (void) snprintf(execbase, sizeof(execbase), "fsck_%s",
-       argv[0] = vfstype;
+       argv[0] = execbase;

	For mount, this can be cleaned up some, but I'm not sure
	what the implications are, so I left a comment and the
	original code commented out.  Also, resetting argv[0]
	before each exec attempt might not be the best thing
--- /usr/src/sbin/mount/mount.c Wed Sep 17 06:13:53 1997
+++ mount.c     Wed Oct 29 08:41:45 1997
@@ -364,7 +364,13 @@
        argc = 0;
+       /*  Skip assignment of argv[0] for now -- wait
+           until below when we try the execs.
        argv[argc++] = vfstype;
+       */
+       argc++;
        mangle(optbuf, &argc, argv);
        argv[argc++] = spec;
        argv[argc++] = name;
@@ -389,6 +395,7 @@
                do {
                            sizeof(execname), "%s/mount_%s", *edir, vfstype);
+                       argv[0] = execname;
                        execv(execname, (char * const *)argv);
                        if (errno != ENOENT)
                                warn("exec %s for %s", execname, name);

	When the above changes are made, all of the "ln" lines for
	mount_* from the following crunchgen conf files can be removed: