From: Felix Fietkau Date: Wed, 2 Jan 2013 18:24:23 +0000 (+0100) Subject: rework string handling for directory listing, avoid redundant string scanning X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=commitdiff_plain;h=dd8f306793db60a2d79c7618d012e0466c581bcf;ds=sidebyside rework string handling for directory listing, avoid redundant string scanning --- diff --git a/file.c b/file.c index 22eb048..b46f0d6 100644 --- a/file.c +++ b/file.c @@ -462,14 +462,16 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) if ((count = scandir(pi->phys, &files, uh_file_scandir_filter_dir, alphasort)) > 0) { - memset(filename, 0, sizeof(filename)); - memcpy(filename, pi->phys, sizeof(filename)); - pathptr = &filename[strlen(filename)]; + int len; + + strcpy(filename, pi->phys); + len = strlen(filename); + pathptr = filename + len; + len = PATH_MAX - len; /* list subdirs */ for (i = 0; i < count; i++) { - strncat(filename, files[i]->d_name, - sizeof(filename) - strlen(files[i]->d_name)); + snprintf(pathptr, len, "%s", files[i]->d_name); if (!stat(filename, &s) && (s.st_mode & S_IFDIR) && (s.st_mode & S_IXOTH)) @@ -488,8 +490,7 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) /* list files */ for (i = 0; i < count; i++) { - strncat(filename, files[i]->d_name, - sizeof(filename) - strlen(files[i]->d_name)); + snprintf(pathptr, len, "%s", files[i]->d_name); if (!stat(filename, &s) && !(s.st_mode & S_IFDIR) && (s.st_mode & S_IROTH))