Apply a patch from Matt Kraai to fix buffer overrun and convert to

using synamically allocated storage.
 -Erik
This commit is contained in:
Eric Andersen 2000-10-12 22:40:14 +00:00
parent 0d5835a767
commit e7e1e2dcad
2 changed files with 30 additions and 38 deletions

View File

@ -450,45 +450,41 @@ struct dnode **list_dir(char *path)
struct dnode *dn, *cur, **dnp; struct dnode *dn, *cur, **dnp;
struct dirent *entry; struct dirent *entry;
DIR *dir; DIR *dir;
char *fnend, fullname[BUFSIZ+1] ;
int i, nfiles; int i, nfiles;
if (path==NULL) return(NULL); if (path==NULL) return(NULL);
strcpy(fullname, path);
fnend = fullname + strlen(fullname);
if (fnend[-1] != '/') {
strcat(fullname, "/");
fnend++;
}
dn= NULL; dn= NULL;
nfiles= 0; nfiles= 0;
dir = opendir(fullname); dir = opendir(path);
if (dir == NULL) { if (dir == NULL) {
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", path, strerror(errno));
return(NULL); /* could not open the dir */ return(NULL); /* could not open the dir */
} }
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(dir)) != NULL) {
/* are we going to list the file- it may be . or .. or a hidden file */ /* are we going to list the file- it may be . or .. or a hidden file */
strcpy(fnend, entry->d_name); if ((strcmp(entry->d_name, ".")==0) && !(disp_opts & DISP_DOT)) continue;
if ((strcmp(fnend, ".")==0) && !(disp_opts & DISP_DOT)) continue; if ((strcmp(entry->d_name, "..")==0) && !(disp_opts & DISP_DOT)) continue;
if ((strcmp(fnend, "..")==0) && !(disp_opts & DISP_DOT)) continue; if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue;
if ((fnend[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue;
cur= (struct dnode *)xmalloc(sizeof(struct dnode)); cur= (struct dnode *)xmalloc(sizeof(struct dnode));
cur->fullname= xstrdup(fullname); cur->fullname = xmalloc(strlen(path)+1+strlen(entry->d_name)+1);
cur->name= cur->fullname + (int)(fnend - fullname) ; strcpy(cur->fullname, path);
if (cur->fullname[strlen(cur->fullname)-1] != '/')
strcat(cur->fullname, "/");
cur->name= cur->fullname + strlen(cur->fullname);
strcat(cur->fullname, entry->d_name);
#ifdef BB_FEATURE_LS_FOLLOWLINKS #ifdef BB_FEATURE_LS_FOLLOWLINKS
if (follow_links == TRUE) { if (follow_links == TRUE) {
if (stat(fullname, &cur->dstat)) { if (stat(cur->fullname, &cur->dstat)) {
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", cur->fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
free(cur); free(cur);
continue; continue;
} }
} else } else
#endif #endif
if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */ if (lstat(cur->fullname, &cur->dstat)) { /* get file stat info into node */
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", cur->fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
free(cur); free(cur);
continue; continue;

34
ls.c
View File

@ -450,45 +450,41 @@ struct dnode **list_dir(char *path)
struct dnode *dn, *cur, **dnp; struct dnode *dn, *cur, **dnp;
struct dirent *entry; struct dirent *entry;
DIR *dir; DIR *dir;
char *fnend, fullname[BUFSIZ+1] ;
int i, nfiles; int i, nfiles;
if (path==NULL) return(NULL); if (path==NULL) return(NULL);
strcpy(fullname, path);
fnend = fullname + strlen(fullname);
if (fnend[-1] != '/') {
strcat(fullname, "/");
fnend++;
}
dn= NULL; dn= NULL;
nfiles= 0; nfiles= 0;
dir = opendir(fullname); dir = opendir(path);
if (dir == NULL) { if (dir == NULL) {
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", path, strerror(errno));
return(NULL); /* could not open the dir */ return(NULL); /* could not open the dir */
} }
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(dir)) != NULL) {
/* are we going to list the file- it may be . or .. or a hidden file */ /* are we going to list the file- it may be . or .. or a hidden file */
strcpy(fnend, entry->d_name); if ((strcmp(entry->d_name, ".")==0) && !(disp_opts & DISP_DOT)) continue;
if ((strcmp(fnend, ".")==0) && !(disp_opts & DISP_DOT)) continue; if ((strcmp(entry->d_name, "..")==0) && !(disp_opts & DISP_DOT)) continue;
if ((strcmp(fnend, "..")==0) && !(disp_opts & DISP_DOT)) continue; if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue;
if ((fnend[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue;
cur= (struct dnode *)xmalloc(sizeof(struct dnode)); cur= (struct dnode *)xmalloc(sizeof(struct dnode));
cur->fullname= xstrdup(fullname); cur->fullname = xmalloc(strlen(path)+1+strlen(entry->d_name)+1);
cur->name= cur->fullname + (int)(fnend - fullname) ; strcpy(cur->fullname, path);
if (cur->fullname[strlen(cur->fullname)-1] != '/')
strcat(cur->fullname, "/");
cur->name= cur->fullname + strlen(cur->fullname);
strcat(cur->fullname, entry->d_name);
#ifdef BB_FEATURE_LS_FOLLOWLINKS #ifdef BB_FEATURE_LS_FOLLOWLINKS
if (follow_links == TRUE) { if (follow_links == TRUE) {
if (stat(fullname, &cur->dstat)) { if (stat(cur->fullname, &cur->dstat)) {
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", cur->fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
free(cur); free(cur);
continue; continue;
} }
} else } else
#endif #endif
if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */ if (lstat(cur->fullname, &cur->dstat)) { /* get file stat info into node */
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", cur->fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
free(cur); free(cur);
continue; continue;