From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Thu, 24 Apr 2008 04:42:52 +0000 (-0000)
Subject: lineedit: filename completion on symlinks-to-dirs should add / too
X-Git-Tag: 1_11_0~296
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b520271f65d3eb99000db3150dfd8e36c46d7891;p=oweals%2Fbusybox.git

lineedit: filename completion on symlinks-to-dirs should add / too
---

diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 6de66ba83..5a0d03eeb 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -517,8 +517,8 @@ static void exe_n_cwd_tab_completion(char *command, int type)
 
 	for (i = 0; i < npaths; i++) {
 		dir = opendir(paths[i]);
-		if (!dir)                       /* Don't print an error */
-			continue;
+		if (!dir)
+			continue; /* don't print an error */
 
 		while ((next = readdir(dir)) != NULL) {
 			int len1;
@@ -528,18 +528,21 @@ static void exe_n_cwd_tab_completion(char *command, int type)
 			if (strncmp(str_found, pfind, strlen(pfind)))
 				continue;
 			/* not see .name without .match */
-			if (*str_found == '.' && *pfind == 0) {
+			if (*str_found == '.' && *pfind == '\0') {
 				if (NOT_LONE_CHAR(paths[i], '/') || str_found[1])
 					continue;
 				str_found = ""; /* only "/" */
 			}
 			found = concat_path_file(paths[i], str_found);
-			/* hmm, remover in progress? */
-			if (lstat(found, &st) < 0)
+			/* hmm, remove in progress? */
+			/* NB: stat() first so that we see is it a directory;
+			 * but if that fails, use lstat() so that
+			 * we still match dangling links */
+			if (stat(found, &st) && lstat(found, &st))
 				goto cont;
 			/* find with dirs? */
 			if (paths[i] != dirbuf)
-				strcpy(found, next->d_name);    /* only name */
+				strcpy(found, next->d_name); /* only name */
 
 			len1 = strlen(found);
 			found = xrealloc(found, len1 + 2);
@@ -547,7 +550,7 @@ static void exe_n_cwd_tab_completion(char *command, int type)
 			found[len1+1] = '\0';
 
 			if (S_ISDIR(st.st_mode)) {
-				/* name is directory      */
+				/* name is a directory */
 				if (found[len1-1] != '/') {
 					found[len1] = '/';
 				}
@@ -565,7 +568,7 @@ static void exe_n_cwd_tab_completion(char *command, int type)
 		closedir(dir);
 	}
 	if (paths != path1) {
-		free(paths[0]);                 /* allocated memory only in first member */
+		free(paths[0]); /* allocated memory is only in first member */
 		free(paths);
 	}
 #undef dirbuf