Skip site navigation (1)Skip section navigation (2)
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>