From 40f7cebadd754f2d441e6538d21f49a19d7abb38 Mon Sep 17 00:00:00 2001
From: Peter Breitenlohner <peb@mppmu.mpg.de>
Date: Mon, 3 Aug 2009 13:30:29 +0200
Subject: [PATCH 2/3] locate: fix off-by-one bugs and enable assertions
To: findutils-patches@gnu.org

Signed-off-by: Peter Breitenlohner <peb@mppmu.mpg.de>
---
 ChangeLog       |    5 +++++
 locate/locate.c |   19 +++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d9b096c..500d754 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2009-08-03  Peter Breitenlohner  <peb@mppmu.mpg.de>
 
+	* locate/locate.c: Enable assertions and fix the off-by-one
+	bugs that prevented this.
+
+2009-08-03  Peter Breitenlohner  <peb@mppmu.mpg.de>
+
 	* doc/find.texi: Remove duplicate paragraph and fix a typo.
 
 2013-03-31  James Youngman  <jay@gnu.org>
diff --git a/locate/locate.c b/locate/locate.c
index 7b18993..9aafb8b 100644
--- a/locate/locate.c
+++ b/locate/locate.c
@@ -286,8 +286,8 @@ locate_read_str (char **buf, size_t *siz, FILE *fp, int delimiter, int offs)
               *buf = pnew;
             }
         }
-      memcpy ((*buf)+offs, p, nread);
-      free (p);
+      memcpy((*buf)+offs, p, nread + 1);
+      free(p);
     }
   return nread;
 }
@@ -603,10 +603,21 @@ visit_locate02_format (struct process_data *procdata, void *context)
   nread = locate_read_str (&procdata->original_filename,
                            &procdata->pathsize,
                            procdata->fp, 0, procdata->count);
-  if (nread < 0)
+  if (nread < 1)
     return VISIT_ABORT;
   procdata->c = getc (procdata->fp);
-  procdata->len = procdata->count + nread;
+  procdata->len = procdata->count + nread - 1; /* Number of chars in path. */
+
+  if (procdata->len < 1)
+    {
+      /* 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"),
+	    quotearg_n_style(0, locale_quoting_style, procdata->dbfile));
+    }
+
   s = procdata->original_filename + procdata->len - 1; /* Move to the last char in path.  */
   assert (s[0] != '\0');
   assert (s[1] == '\0'); /* Our terminator.  */
-- 
1.7.2.5

