tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Sanitizing (canonicalising) the block device name in mount_ffs ??



Le Sat, May 27, 2023 at 11:56:16PM +0700, Robert Elz a écrit :
> I'm dual-posting this to tech-kern and tech-userlevel, as while it is
> a userlevel issue, it could have kernel implications.   Please respect
> the Reply-To and send replies only to tech-userlevel
> 
> You may have noticed that a recent change (mine) to the pathadj()
> function (which converts an abritrary path name to its canonical form).
> That function is not permitted to fail, but could.   Now instead of
> failing, and returning (potential) nonsense, it exits if it cannot
> do what it is required to do (usually it can).  In practice this
> affects nothing real.
> 
> However, it affects some uses of rump - which sets up a "block device"
> in a way that its name cannot be canonicalised.   It was relying upon
> the way that pathadj() happens to work (based upon how realpath(3) works)
> to make things function - pathadj() was issuing an error message, which
> some rump using ATF tests were simply ignoring (deliberately).
> 
> Yesterday, I was trying to find a way to make this all work - unsuccessfully.
> 

Since pathadj() was just sugar, calling realpath(3) (without really
testing the return) and emitting some messages, in a special case can
you simply "flatten" the thing i.e. replace the call to pathadj() by a
call to realpath(3)?

And then, there should be a code similar to what is done in
src/sbin/mount/mount.c: if canonical_path is NULL, try what the user
passed:

219,224
		/*
		 * Create a canonical version of the device or mount path
		 * passed to us.  It's ok for this to fail.  It's also ok
		 * for the result to be exactly the same as the original.
		 */
		canonical_path = realpath(*argv, canonical_path_buf);

227,238
			/*
			 * Try looking up the canonical path first,
			 * then try exactly what the user entered.
			 */
			if ((canonical_path == NULL ||
			    (mntbuf = getmntpt(canonical_path)) == NULL) &&
			    (mntbuf = getmntpt(*argv)) == NULL) {
out:
				errx(EXIT_FAILURE,
				    "Unknown special file or file system `%s'",
				    *argv);
			}

From a superficial knowledge, it seems to me that, eventually,
the __mount50() syscall has to be called with a canonical path,
since the syscall does no acrobatics with the path (and shall not be
passed garbage).

FWIW
-- 
        Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
                     http://www.kergis.com/
                    http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C


Home | Main Index | Thread Index | Old Index