Subject: bin/21016: locate will try to read a directory as a database
To: None <gnats-bugs@gnats.netbsd.org>
From: None <soren@blef.org>
List: netbsd-bugs
Date: 04/04/2003 22:07:23
>Number:         21016
>Category:       bin
>Synopsis:       locate will try to read a directory as a database
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Apr 04 22:08:01 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Soren Jacobsen
>Release:        NetBSD 1.6Q
>Organization:
>Environment:
System: NetBSD tempname 1.6Q NetBSD 1.6Q (GENERIC) #0: Tue Apr 1 15:45:36 PST 2003 root@tempname:/usr/obj/sys/arch/i386/compile/GENERIC i386
Architecture: i386
Machine: i386
>Description:
If passed a directory as a database, locate will try to use it. As of 1.10,
this isn't such a big deal, but it probably still shouldn't get as far as it
does.

This PR submitted on behalf of pancake@phreaker.net.
>How-To-Repeat:
locate -d /usr/ blah
>Fix:
Apply the following patch (from pancake@phreaker.net, and ever so slightly
tweaked by me).

Index: locate.c
===================================================================
RCS file: /cvsroot/src/usr.bin/locate/locate/locate.c,v
retrieving revision 1.10
diff -b -u -r1.10 locate.c
--- locate.c	2003/04/03 01:20:26	1.10
+++ locate.c	2003/04/05 05:37:57
@@ -85,6 +85,7 @@
 #include <stdlib.h>
 #include <err.h>
 #include <sys/queue.h>
+#include <sys/stat.h>
 
 #include "locate.h"
 #include "pathnames.h"
@@ -113,9 +114,15 @@
 {
 	FILE *fp;
 	struct locate_db *dbp;
+	struct stat s;
 
 	if (!(path && *path))
 		path = _PATH_FCODES;
+	stat(path,&s);
+	if (S_ISDIR(s.st_mode)) {
+		warnx("cannot use a directory as database");
+		exit(1);
+	} else
 	if ((fp = fopen(path, "r"))) {
 		dbp = NEW(struct locate_db);
 		dbp->db_fp = fp;
>Release-Note:
>Audit-Trail:
>Unformatted: