bin/124409: fsck(8) requires exact entry for mountpoints when executing / bug by design in getfsfile(3) in .../lib/libc/gen/fstab.c

Giorgos Keramidas keramida at freebsd.org
Sun Jun 22 03:10:04 UTC 2008


The following reply was made to PR bin/124409; it has been noted by GNATS.

From: Giorgos Keramidas <keramida at freebsd.org>
To: "Garrett Cooper" <yanefbsd at gmail.com>
Cc: bug-followup at freebsd.org
Subject: Re: bin/124409: fsck(8) requires exact entry for mountpoints when executing / bug by design in getfsfile(3) in .../lib/libc/gen/fstab.c
Date: Sun, 22 Jun 2008 06:07:37 +0300

 On Mon, 16 Jun 2008 20:28:08 -0700, "Garrett Cooper" <yanefbsd at gmail.com> wrote:
 > On Tue, Jun 10, 2008 at 2:27 AM, Garrett Cooper <yanefbsd at gmail.com> wrote:
 >> Ok.... it appears I wasn't intelligent enough to post this in the right
 >> place last night. Comments please?
 >>
 >> Hi hackers,
 >>
 >>      I have a question, pending a bug found in getfsfile(3) [1].
 >>
 >>      Is there any possibility where a mountpoint be any value other
 >>
 >> than a directory, a symlink, or "none", i.e. a flat file?
 >>
 >> Thanks,
 >>
 >> -Garrett
 >>
 >> References:
 >>
 >> http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/124409 (not fully in PR
 >>
 >> database yet).
 >
 > Going once, going twice...
 
 Hi Garrett :-)
 
 When I wrote the original comment in that PR I had something like this
 in mind:
 
 %%%
 *** src.7789d2851415/lib/libc/gen/fstab.c	Sun Jun 22 05:57:09 2008
 --- /home/build/src/lib/libc/gen/fstab.c	Sun Jun 22 05:56:48 2008
 *************** struct fstab *
 *** 236,245 ****
   getfsfile(name)
   	const char *name;
   {
   	if (setfsent())
 ! 		while (fstabscan())
 ! 			if (!strcmp(_fs_fstab.fs_file, name))
   				return(&_fs_fstab);
   	return((struct fstab *)NULL);
   }
   
 --- 236,256 ----
   getfsfile(name)
   	const char *name;
   {
 + 	char name_path[PATH_MAX];
 + 	char fstab_path[PATH_MAX];
 + 
 + 	if (realpath(name, name_path) == NULL)
 + 		return((struct fstab *)NULL);
   	if (setfsent())
 ! 		while (fstabscan()) {
 ! 			if (strcmp(_fs_fstab.fs_file, name) == 0 ||
 ! 			    strcmp(_fs_fstab.fs_file, name_path) == 0)
 ! 				return(&_fs_fstab);
 ! 			if (realpath(_fs_fstab.fs_file, fstab_path) == NULL)
 ! 				return((struct fstab *)NULL);
 ! 			if (strcmp(fstab_path, name_path) == 0)
   				return(&_fs_fstab);
 + 		}
   	return((struct fstab *)NULL);
   }
   
 %%%
 
 I tried to avoid unnecessary realpath(3) calls as much as possible, but
 there is still the possibility for at least N+1 calls, where N is the
 number of entries in fstab...
 
 Can you test the above patch, and let me know if it looks ok, if you
 have a better fix in the works, etc.?  It seems to pass the bug you
 originally reported when I run:
 
     % env LD_PRELOAD=/home/build/obj/home/build/src/lib/libc/libc.so.7 \
         fsck ///cdrom///
     fsck: exec fsck_cd9660 for /dev/acd0 in /sbin:/usr/sbin: No such file or directory
 
 The failure later is ok, because we don't have fsck_cd9660 for CD-ROMs.
 


More information about the freebsd-bugs mailing list