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