From 98bca94758321d59a28bdd6ba8dd6cd331552105 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Fri, 13 Oct 2006 16:18:40 +0000
Subject: [PATCH] in input_tab(), if the tab-completed path is a directory,
 make sure enough space is allocated before tacking a slash onto the end of it

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3900 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   | 3 +++
 src/files.c | 7 ++++---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4f65f083..57078695 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,9 @@ CVS code -
 	- Since the field precision operator used in the sprintf() uses
 	  ints and not size_t's, replace it with two strncpy()s, which
 	  use size_t's. (DLR)
+	- If the tab-completed path is a directory, make sure enough
+	  space is allocated before tacking a slash onto the end of it.
+	  (DLR)
 - help.c:
   parse_help_input()
 	- Add 'E' and 'e' as aliases for Exit, for consistency with the
diff --git a/src/files.c b/src/files.c
index 5e7f41f6..bfc11ad7 100644
--- a/src/files.c
+++ b/src/files.c
@@ -2240,18 +2240,19 @@ char *input_tab(char *buf, bool allow_files, size_t *place, bool
 
 	mzero = charalloc(lastslash_len + common_len + 1);
 
-	/*sprintf(mzero, "%.*s%.*s", lastslash_len, buf, common_len,
-		matches[0]);*/
 	strncpy(mzero, buf, lastslash_len);
 	strncpy(mzero + lastslash_len, matches[0], common_len);
 
 	common_len += lastslash_len;
+	mzero[common_len] = '\0';
 
 	assert(common_len >= *place);
 
 	if (num_matches == 1 && is_dir(mzero)) {
-	    mzero[common_len] = '/';
 	    common_len++;
+	    mzero = charealloc(mzero, common_len + 1);
+	    mzero[common_len - 1] = '/';
+	    mzero[common_len] = '\0';
 
 	    assert(common_len > *place);
 	}
-- 
GitLab