From 1e7fe1413ccb6a99a7ee86ff603fc121ab4f245c Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Mon, 3 Feb 2014 12:34:48 -0800 Subject: [PATCH] scanner: Avoid largeish stack allocations in recursive function. --- scanner.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/scanner.c b/scanner.c index 1a0dc13..f086d7a 100644 --- a/scanner.c +++ b/scanner.c @@ -693,9 +693,8 @@ static void ScanDirectory(const char *dir, const char *parent, media_types dir_types) { struct dirent **namelist; - int i, n, startID=0; - char parent_id[PATH_MAX]; - char full_path[PATH_MAX]; + int i, n, startID = 0; + char *full_path; char *name = NULL; static long long unsigned int fileno = 0; enum file_types type; @@ -728,11 +727,19 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types) n = -1; break; } - if (n < 0) { + if( n < 0 ) + { DPRINTF(E_WARN, L_SCANNER, "Error scanning %s\n", dir); return; } + full_path = malloc(PATH_MAX); + if (!full_path) + { + DPRINTF(E_ERROR, L_SCANNER, "Memory allocation failed scanning %s\n", dir); + return; + } + if( !parent ) { startID = get_next_available_id("OBJECTS", BROWSEDIR_ID); @@ -745,7 +752,7 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types) break; #endif type = TYPE_UNKNOWN; - sprintf(full_path, "%s/%s", dir, namelist[i]->d_name); + snprintf(full_path, PATH_MAX, "%s/%s", dir, namelist[i]->d_name); name = escape_tag(namelist[i]->d_name, 1); if( namelist[i]->d_type == DT_DIR ) { @@ -761,9 +768,11 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types) } if( (type == TYPE_DIR) && (access(full_path, R_OK|X_OK) == 0) ) { + char *parent_id; insert_directory(name, full_path, BROWSEDIR_ID, (parent ? parent:""), i+startID); - sprintf(parent_id, "%s$%X", (parent ? parent:""), i+startID); + xasprintf(&parent_id, "%s$%X", (parent ? parent:""), i+startID); ScanDirectory(full_path, parent_id, dir_types); + free(parent_id); } else if( type == TYPE_FILE && (access(full_path, R_OK) == 0) ) { @@ -774,6 +783,7 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types) free(namelist[i]); } free(namelist); + free(full_path); if( !parent ) { DPRINTF(E_WARN, L_SCANNER, _("Scanning %s finished (%llu files)!\n"), dir, fileno);