From: Denis Vlasenko 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