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()