Apply a patch from Matt Kraai to fix buffer overrun and convert to
using synamically allocated storage. -Erik
This commit is contained in:
parent
0d5835a767
commit
e7e1e2dcad
@ -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
34
ls.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user