bin/153600: Path length restrictions in mount/umount tools prevent filesystem mount/unmount

Roger Leigh rleigh at debian.org
Sat Jan 1 19:00:30 UTC 2011


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

From: Roger Leigh <rleigh at debian.org>
To: Bruce Evans <brde at optusnet.com.au>
Cc: freebsd-gnats-submit at freebsd.org, freebsd-bugs at freebsd.org
Subject: Re: bin/153600: Path length restrictions in mount/umount tools
	prevent filesystem mount/unmount
Date: Sat, 1 Jan 2011 18:54:04 +0000

 --to+bXLvrczl8f0V1
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 On Sun, Jan 02, 2011 at 05:13:16AM +1100, Bruce Evans wrote:
 > On Sat, 1 Jan 2011, Roger Leigh wrote:
 >
 >> t at mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
 >>> Description:
 >> When mount is asked to mount a filesystem on a node whose absolute path =
 is longer than 85 characters in length, the mount fails.  Umount also fails=
  under some circumstances, though the testcase attached below doesn't show =
 this.
 >> ...
 >>> Fix:
 >> I suspect that the mount/umount tools are using a fixed-length buffer an=
 d/or are truncating the path at some point.
 >>
 >> The mount(2) manual page documents the max path length at 1023 character=
 s, and the maximum length of any single component at 255 characters.  These=
  limits have not been exceeded, unless the documentation is incorrect.
 >>
 >> The practical upper limit of 80-85 characters demonstrated in this bug r=
 eport is very low.  The documented [ENAMETOOLONG] limit in mount(2) is sens=
 ible, but does not appear to reflect the practical reality at the present t=
 ime.  If the 80-85 character limit could be eliminated to allow this to wor=
 k as documented, this would remove a significant limitation in the FreeBSD =
 system which is breaking software which requires longer paths to function.
 >
 > Mount name lengths are in practice limited to (MNAMELEN - 1) =3D 87.  See
 > <sys/mount.h>.  This isn't easy to fix, since MNAMELEN is in critical APIs
 > (mainly struct statfs).  struct statfs has already been changed once too
 > often.  MNAMELEN used to be (80 - 2 * sizeof(long)), which is 80 or 72,
 > but was changed to 88.  MNAMELEN is of course mentioned in statfs(2), but
 > it isn't mentioned in mount(2) because it doesn't apply to the actual mou=
 nt
 > operation but only to determining what is mounted using statfs(2).  The
 > buffer gets truncated at mount time by mount in the kernel copying the
 > file name to the statfs buffer with blind truncation.
 >
 > In practice, this means that you should never use the feature of mounting
 > pathnames with length between MNAMELEN and (PATH_MAX - 1), since it is too
 > hard to manage the resulting mountpoints.
 
 I see, thanks.  This does make things somewhat more complex to fix.
 
 As a longer term (rather than immediate) solution, could I suggest
 taking a look at the GNU libc/linux versions of the statfs structure in
 <bits/statfs.h>?  In this version, the fixed-length fields are entirely
 absent, and so the length limitations are a non-issue here.  Of course,
 the structures are not compatible, and the missing information would
 need to be obtained via other means such as getmntent of /proc/mounts
 (for example).  But, the getmntent interface is also equally
 unrestricted, so in practice on GNU/Linux this problem does not exist.
 
 
 Kind regards,
 Roger
 
 --=20
   .''`.  Roger Leigh
  : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
  `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
    `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.
 
 --to+bXLvrczl8f0V1
 Content-Type: application/pgp-signature; name="signature.asc"
 Content-Description: Digital signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.9 (GNU/Linux)
 
 iEYEARECAAYFAk0feEwACgkQVcFcaSW/uEhzKgCfRUHtNiwnSjHt//aTpbXqQNSY
 AUEAoM+ODWdhnvMlyk6RMRMAXSKwfpIq
 =bMeU
 -----END PGP SIGNATURE-----
 
 --to+bXLvrczl8f0V1--


More information about the freebsd-bugs mailing list