diff -ur -N -x find.info findutils-20080905.orig/locate/locate.c findutils-20080905/locate/locate.c --- findutils-20080905.orig/locate/locate.c 2008-08-02 11:39:40.000000000 +0200 +++ findutils-20080905/locate/locate.c 2008-08-02 11:52:18.000000000 +0200 @@ -334,6 +334,8 @@ int c; /* An input byte. */ int count; /* The length of the prefix shared with the previous database entry. */ int len; + int prefix_len; /* The length of the prefix for relative paths. */ + int first; char *original_filename; /* The current input database entry. */ size_t pathsize; /* Amount allocated for it. */ char *munged_filename; /* path or basename(path) */ @@ -580,7 +582,7 @@ else procdata->count += procdata->c; - if (procdata->count > procdata->len || procdata->count < 0) + if (procdata->count > procdata->len || procdata->count < procdata->prefix_len) { /* This should not happen generally, but since we're * reading in data which is outside our control, we @@ -598,6 +600,37 @@ return VISIT_ABORT; procdata->c = getc (procdata->fp); procdata->len = procdata->count + nread - 1; + + if (procdata->len == 0) + { + if (procdata->first) + { + /* A database with relative pathnames. + * Prepend dirname(dbfile) to all stored pathnames. + */ + extend (procdata, strlen (procdata->dbfile), 1u); + strcpy (procdata->original_filename, procdata->dbfile); + if (strcmp (procdata->original_filename, "")) + { + char *p = procdata->original_filename + + FILE_SYSTEM_PREFIX_LEN (procdata->original_filename); + p[dir_len (p)] = '\0'; + if (!strcmp (p, "") || !strcmp (p, "/")) + strcpy (p, "."); + } + procdata->prefix_len = procdata->len = procdata->count = strlen (procdata->original_filename); + procdata->first = 0; + return VISIT_REJECTED; /* Ignore this entry. */ + } + + /* This should not happen generally, but since we're + * reading in data which is outside our control, we + * cannot prevent it. + */ + error(1, 0, _("locate database `%s' is corrupt or invalid"), procdata->dbfile); + } + procdata->first = 0; + s = procdata->original_filename + procdata->len; /* Move to the last char in path. */ assert (s[0] != '\0'); assert (s[1] == '\0'); /* Our terminator. */ @@ -1057,7 +1090,8 @@ oldformat = 0; procdata.endian_state = GetwordEndianStateInitial; - procdata.len = procdata.count = 0; + procdata.len = procdata.count = procdata.prefix_len = 0; + procdata.first = 1; procdata.dbfile = dbfile; procdata.fp = fp;