kern/165559: [ufs] [patch] ufsmount.h uses the 'export' keyword as a structure member name

Konstantin Belousov kostikbel at gmail.com
Thu Mar 1 08:49:02 UTC 2012


On Thu, Mar 01, 2012 at 01:08:49PM +1100, Bruce Evans wrote:
> On Wed, 29 Feb 2012 kib at FreeBSD.org wrote:
> 
> >Synopsis: [ufs] [patch] ufsmount.h uses the 'export' keyword as a 
> >structure member name
> >
> >The supplied patch is obviously wrong, or rather incomplete.
> >The in-kernel uses of the export member must be corrected.
> 
> The kernel should change to support applications that abuse kernel
> headers.
> 
> libufs uses ufsmount.h, but I consider the existence of libufs to be
> another bug, and it's not clear whey it uses this header.
> 
> Even mount(8) no longer uses this header.  It used to use it, but now
> uses nmount(2) so everything is done using string options and mount args
> structs are never used.  I don't like nmount(), but it seems that anything
> new enough to be tripping over the export keyword should also be new
> enough to not use old mount args structs.
> 
> df(1) still uses this header, since it hasn't been converted to use
> nmount().  But if nmount() is good for anything it is good here.  df
> only uses mount() to run report results for unmounted file systems.
> But it only understands ffs.  Actually, it blindly assumes ffs.  It
> could do better using nmount(), except the details of creating options
> are even more difficult using nmount(), and it is unreasonable fot
> df to create options more complicated than "-o ro <device> <mountpoint>",
> which are not enough in many cases.  So it shouldn't do any of this.
> It could reasonably fork mount(8) to do whatever can be done using
> /etc/fsatab.  Either way, it wouldn't use this header.
There is more uses of ufs_args, in particular, in automounter.

> 
> Here is the entire contents of this header after removing the _KERNEL
> parts of it:
> 
> % #include <sys/buf.h>	/* XXX For struct workhead. */
> 
> This supplies gross namespace pollution.  Perhaps parts of userland
> that are abusing this header actually want this pollution.  sys/buf.h
> is another header that should be kernel-only, but it has some _KERNEL
> ifdefs in it, and removing the _KERNEL parts in it shows gross
> namespace pollution that is not under these ifdefs.  It begins by
> includinf <sys/bufobj.h>, <sys/quque.h>, <sys/lock.h> and
> <sys/lockobj.h> and gets whatever pollution these supply.  Then it
> soon declares a kernel variable (extern struct... bioops).  Otherwise,
> it is realtively clean and only defines kernel types and macros.
> 
> % 
> % /*
> %  * Arguments to mount UFS-based filesystems
> %  */
> % struct ufs_args {
> % 	char	*fspec;			/* block special device to mount */
> % 	struct	oexport_args export;	/* network export information */
> % };
> 
> There is not much here.  libufs of course doesn't use this struct or
> anything in it.  It seems to build perfectly after removing all includes
> of ufsmount.h in it (5 in .c files).  This shows that none of the other
> ufs headers that libufs includes depend on this header, and that nothing
> depends on the namespace pollution in this header.
> 
> libufs also says that applications must include this header in the
> SYNOPSIS of all 5 of its man pages.  This seems to be wrong too.  The
> man pages also says that applications must include 2 other ffs headers.
> These headers are actually needed, to declare types for libufs's header.
> 
> Actually, the `export' variable should be fixed because it has style bugs.
> Struct members should have a fairly unique prefix related to the struct.
> The style bugs are missing in <sys/mount.h>, so it wouldn't have this
> bug if it had a struct member near `export'.  It actually doesn't have
> any names near `export', but has struct export args and uses the prefix
> ex_ for all struct members in it.
> 
> I only searched for includes of this header in an old version of FreeBSD.
> Apart from the above, they are in
> - amd: it still uses mount() AFAIK
> - sysinstall: too old to use nmount()
> - mountd: now the use is almost reasonable, but it has XXX comments about
>   this assuming that all mount args structs look like ffs's, and I think
>   they must indeed start like ffs's
> - mountd in -current: mountd uses nmount() and no longer uses the ufs
>   header, but it does use the corresponding nfs header, which, since it
>   lmust look like ffs's header, has the same bugs (no prefixes in names,
>   and the second member is named `export').  So the scope of this bug
>   includes all mount args structs in the kernel.
> - dump/main.c: ufs utilities can use ufs headers without abusing them,
>   but like libufs, this file includes this header, apparently without
>   actually using it (the include is grouped with the other 2 as in
>   libufs, except it is only unsorted in ufs.
> - newfs/newfs.c: same as in libufs, with different unsorting
> - tunefs/tunefs.c: this actually uses the header, since it needs to
>   remount and hasn't been converted to nmount().
> - fsck_ffs/main.c: legit use.  Even uses `export', but only to zero it.
> - ffsinfo/ffsinfo.c: like dump/main.c
> - mksnap/mksnap_ffs.c: used to use args.fspec a lot.  Has been converted
>   to nmount, so no longer uses the header (?), but still includes it.
>   (I only checked about 3/4 of the files in this list for conversion to
>   nmount()).
> - kernel uses of this header: there are a few outside of ffs.
> 
> To summarise, even ffs utilities should be using this header.  There are
> 1 or 2 ffs utilities that can reasonably use it, and a few non-ffs
> utilities that use since they haven't been converted to nmount().  amd
> is the only significant remaining one.
> 
Yes.

I expect the bug submitter to finish the work and provide a complete
patch for renaming.

FWIW, the export_ is ugly, some reasonable name should be used.
> Bruce
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-fs/attachments/20120301/69b6b729/attachment.pgp


More information about the freebsd-fs mailing list