bin/124409: fsck(8) requires exact entry for mountpoints when
executing / bug by design in getfsfile(3) in
.../lib/libc/gen/fstab.c
Garrett Cooper
yanefbsd at gmail.com
Sun Jun 22 06:19:46 UTC 2008
On Sat, Jun 21, 2008 at 8:10 PM, Giorgos Keramidas <keramida at freebsd.org> wrote:
> 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.
There was a reason why I avoided going straight to realpath... didn't
realpath have security issues and the like, such that it wasn't
Linux (it isn't included in glibc) uses a function called
canonicalize() for resolving paths, which does something similar to
realpath, but doesn't resolve symlinks, IIRC, and thus avoids the
security / race condition issue.
Cheers,
-Garrett
More information about the freebsd-bugs
mailing list