Date: Fri, 24 Jul 2009 14:21:53 -0400 From: John Baldwin <jhb@freebsd.org> To: Robert Watson <rwatson@freebsd.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r195839 - head/usr.bin/locate/locate Message-ID: <200907241421.54000.jhb@freebsd.org> In-Reply-To: <alpine.BSF.2.00.0907241843580.5967@fledge.watson.org> References: <200907241340.n6ODeP2B011222@svn.freebsd.org> <alpine.BSF.2.00.0907241843580.5967@fledge.watson.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 24 July 2009 1:45:01 pm Robert Watson wrote: > > On Fri, 24 Jul 2009, John Baldwin wrote: > > > Move the check to ensure the locate database has the minimum required size > > when using mmap() before invoking mmap(). This avoids a confusing error > > message when locate is invoked against a zero-size database after the > > recent change to make mmap() fail requests to map 0 bytes. > > Does this mean we should anticipate other possible application compatibility > problems? And I guess that means a 7.2 userspace (i.e., jail) on an 8.0 > kernel won't support locate? In the case of locate(8) the only difference was in the error message received. In 7.2 if you used /dev/null as your locate database then you would trigger the "database too small" error. In 8.0 prior to this fix it was failing due to mmap() dying with EINVAL so a more confusing "Invalid parameter" error was emitted. This just makes the error message more readable. In general I would not expect 3rd party applications to break since other OS's such as Linux and OpenSolaris already fail mmap() with a length of 0 with EINVAL: http://fxr.watson.org/fxr/source/mm/mmap.c?v=linux-2.6#L932 http://fxr.watson.org/fxr/source/common/os/grow.c?v=OPENSOLARIS;im=excerpts#L647 Curiously NetBSD, OpenBSD, and Darwin all seem to return a random address that isn't really mapped with no error value. NetBSD silently returns 0 without doing anything for an munmap() with a length of 0. OpenBSD will return 0 if the address passed to munmap() is a valid address for the process w/o doing anything and EINVAL if the address is not valid I think (so passing the return value of mmap(.., 0) to munmap() may or may not succeed on OpenBSD). Darwin returns EINVAL for an munmap() with a length of 0. DFBSD does the same thing FreeBSD did before my commit to mmap(). > Robert > > > > > Submitted by: Jaakko Heinonen jh of saunalahti dot fi > > Approved by: re (kensmith) > > MFC after: 1 week > > > > Modified: > > head/usr.bin/locate/locate/fastfind.c > > head/usr.bin/locate/locate/locate.c > > > > Modified: head/usr.bin/locate/locate/fastfind.c > > ============================================================================== > > --- head/usr.bin/locate/locate/fastfind.c Thu Jul 23 21:12:21 2009 (r195838) > > +++ head/usr.bin/locate/locate/fastfind.c Fri Jul 24 13:40:25 2009 (r195839) > > @@ -154,9 +154,6 @@ fastfind > > > > /* init bigram table */ > > #ifdef FF_MMAP > > - if (len < (2*NBG)) > > - errx(1, "database too small: %s", database); > > - > > for (c = 0, p = bigram1, s = bigram2; c < NBG; c++, len-= 2) { > > p[c] = check_bigram_char(*paddr++); > > s[c] = check_bigram_char(*paddr++); > > > > Modified: head/usr.bin/locate/locate/locate.c > > ============================================================================== > > --- head/usr.bin/locate/locate/locate.c Thu Jul 23 21:12:21 2009 (r195838) > > +++ head/usr.bin/locate/locate/locate.c Fri Jul 24 13:40:25 2009 (r195839) > > @@ -291,6 +291,8 @@ search_mmap(db, s) > > fstat(fd, &sb) == -1) > > err(1, "`%s'", db); > > len = sb.st_size; > > + if (len < (2*NBG)) > > + errx(1, "database too small: %s", db); > > > > if ((p = mmap((caddr_t)0, (size_t)len, > > PROT_READ, MAP_SHARED, > > > -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907241421.54000.jhb>