--- busybox-1.10.1/libbb/lineedit.c Sat Apr 19 05:50:33 2008 +++ busybox-1.10.1-completion/libbb/lineedit.c Thu Apr 24 06:45:39 2008 @@ -518,8 +518,8 @@ 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; @@ -529,18 +529,21 @@ 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); @@ -548,7 +551,7 @@ found[len1+1] = '\0'; if (S_ISDIR(st.st_mode)) { - /* name is directory */ + /* name is a directory */ if (found[len1-1] != '/') { found[len1] = '/'; } @@ -566,7 +569,7 @@ 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