uhttpd: Fix possible memory leaks when generating directory listing
authorAndrej Krpic <ak77@tnode.com>
Mon, 22 Dec 2014 17:55:11 +0000 (18:55 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 22 Dec 2014 20:41:02 +0000 (21:41 +0100)
scandir() call requires free() of each returned dirent structure
and parent list. Code constructing HTML response of directory
listing is missing a call to free in some cases.

Signed-off-by: Andrej Krpic <ak77@tnode.com>
file.c

diff --git a/file.c b/file.c
index 6b3bb823b981a6f3a0ba26d6f2446b1e3a429762..60dfdfa96705100029ea75a04eb537ac6f70229d 100644 (file)
--- a/file.c
+++ b/file.c
@@ -479,11 +479,11 @@ static void list_entries(struct client *cl, struct dirent **files, int count,
                bool dir = !!(files[i]->d_type & DT_DIR);
 
                if (name[0] == '.' && name[1] == 0)
-                       continue;
+                       goto next;
 
                sprintf(file, "%s", name);
                if (stat(local_path, &s))
-                       continue;
+                       goto next;
 
                if (!dir) {
                        suffix = "";
@@ -492,7 +492,7 @@ static void list_entries(struct client *cl, struct dirent **files, int count,
                }
 
                if (!(s.st_mode & mode))
-                       continue;
+                       goto next;
 
                uh_chunk_printf(cl,
                                "<li><strong><a href='%s%s%s'>%s</a>%s"
@@ -505,6 +505,7 @@ static void list_entries(struct client *cl, struct dirent **files, int count,
                                type, s.st_size / 1024.0);
 
                *file = 0;
+next:
                free(files[i]);
        }
 }