Real men clean up their mallocs
diff --git a/extendedcommands.c b/extendedcommands.c
index e53aca1..fc0eb89 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -116,6 +116,20 @@
     }
 }
 
+void free_string_array(char** array)
+{
+    if (array == NULL)
+        return;
+    char* cursor = array[0];
+    int i = 0;
+    while (cursor != NULL)
+    {
+        free(cursor);
+        cursor = array[++i];
+    }
+    free(array);
+}
+
 char** gather_files(const char* directory, const char* fileExtensionOrDirectory, int* numFiles)
 {
     char path[PATH_MAX] = "";
@@ -159,11 +173,10 @@
             else
             {
                 struct stat info;
-                char* fullFileName = (char*)malloc(strlen(de->d_name) + dirLen + 1);
+                char fullFileName[PATH_MAX];
                 strcpy(fullFileName, directory);
                 strcat(fullFileName, de->d_name);
                 stat(fullFileName, &info);
-                free(fullFileName);
                 // make sure it is a directory
                 if (!(S_ISDIR(info.st_mode)))
                     continue;
@@ -203,18 +216,6 @@
     return files;
 }
 
-void free_string_array(char** array)
-{
-    char* cursor = array[0];
-    int i = 0;
-    while (cursor != NULL)
-    {
-        free(cursor);
-        cursor = array[++i];
-    }
-    free(array);
-}
-
 // pass in NULL for fileExtensionOrDirectory and you will get a directory chooser
 char* choose_file_menu(const char* directory, const char* fileExtensionOrDirectory, const char* headers[])
 {
@@ -224,7 +225,7 @@
     int numFiles = 0;
     int numDirs = 0;
     int i;
-
+    char* return_value = NULL;
     int dir_len = strlen(directory);
 
     char** files = gather_files(directory, fileExtensionOrDirectory, &numFiles);
@@ -235,39 +236,50 @@
     if (total == 0)
     {
         ui_print("No files found.\n");
-        return NULL;
     }
-    char** list = (char**) malloc((total + 1) * sizeof(char*));
-    list[total] = NULL;
-
-
-    for (i = 0 ; i < numDirs; i++)
+    else
     {
-        list[i] = strdup(dirs[i] + dir_len);
-    }
+        char** list = (char**) malloc((total + 1) * sizeof(char*));
+        list[total] = NULL;
 
-    for (i = 0 ; i < numFiles; i++)
-    {
-        list[numDirs + i] = strdup(files[i] + dir_len);
-    }
 
-    for (;;)
-    {
-        int chosen_item = get_menu_selection(headers, list, 0);
-        if (chosen_item == GO_BACK)
-            break;
-        if (chosen_item < numDirs)
+        for (i = 0 ; i < numDirs; i++)
         {
-            char* subret = choose_file_menu(dirs[chosen_item], fileExtensionOrDirectory, headers);
-            if (subret != NULL)
-                return subret;
-            continue;
-        } 
-        static char ret[PATH_MAX];
-        strcpy(ret, files[chosen_item - numDirs]);
-        return ret;
+            list[i] = strdup(dirs[i] + dir_len);
+        }
+
+        for (i = 0 ; i < numFiles; i++)
+        {
+            list[numDirs + i] = strdup(files[i] + dir_len);
+        }
+
+        for (;;)
+        {
+            int chosen_item = get_menu_selection(headers, list, 0);
+            if (chosen_item == GO_BACK)
+                break;
+            static char ret[PATH_MAX];
+            if (chosen_item < numDirs)
+            {
+                char* subret = choose_file_menu(dirs[chosen_item], fileExtensionOrDirectory, headers);
+                if (subret != NULL)
+                {
+                    strcpy(ret, subret);
+                    return_value = ret;
+                    break;
+                }
+                continue;
+            } 
+            strcpy(ret, files[chosen_item - numDirs]);
+            return_value = ret;
+            break;
+        }
+        free_string_array(list);
     }
-    return NULL;
+
+    free_string_array(files);
+    free_string_array(dirs);
+    return return_value;
 }
 
 void show_choose_zip_menu()
@@ -575,7 +587,9 @@
 	if (delete_file)
     	remove(filename);
 
-	return run_script_from_buffer(script_data, script_len, filename);
+	int ret = run_script_from_buffer(script_data, script_len, filename);
+    free(script_data);
+    return ret;
 }
 
 int run_and_remove_extendedcommand()