diff options
author | Arun Prakash Jana <engineerarun@gmail.com> | 2020-02-02 19:10:35 +0530 |
---|---|---|
committer | Arun Prakash Jana <engineerarun@gmail.com> | 2020-02-02 19:10:35 +0530 |
commit | 1614ce172bdfeec652c8222eb0a08999a4fcb76b (patch) | |
tree | ade5990411553199d90c6013baf39d9fd92d709c | |
parent | 6faab79ba968b81a9ccaea9454a5224655a0dc2a (diff) | |
download | nnn-1614ce172bdfeec652c8222eb0a08999a4fcb76b.tar.gz |
Late allocate memory for path pointers
-rw-r--r-- | src/nnn.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -157,6 +157,7 @@ #define DOT_FILTER_LEN 7 #define ASCII_MAX 128 #define EXEC_ARGS_MAX 8 +#define LIST_FILES_MAX (1 << 16) #define SCROLLOFF 3 #define MIN_DISPLAY_COLS 10 #define LONG_SIZE sizeof(ulong) @@ -6134,8 +6135,8 @@ static char *load_input() ssize_t i, chunk_count = 1, chunk = 512 * 1024, entries = 0; char *input = malloc(sizeof(char) * chunk), *tmpdir = NULL; char cwd[PATH_MAX], *next, *tmp; - size_t offsets[1 << 16]; - char *paths[1 << 16]; + size_t offsets[LIST_FILES_MAX]; + char **paths = NULL; ssize_t input_read, total_read = 0, off = 0; if (!input) { @@ -6168,7 +6169,7 @@ static char *load_input() continue; } - if (entries == (1 << 16)) + if (entries == LIST_FILES_MAX) goto malloc_1; offsets[entries++] = off; @@ -6186,7 +6187,7 @@ static char *load_input() } if (off != total_read) { - if (entries == (1 << 16)) + if (entries == LIST_FILES_MAX) goto malloc_1; offsets[entries++] = off; @@ -6197,6 +6198,10 @@ static char *load_input() input[total_read] = '\0'; + paths = malloc(entries * sizeof(char *)); + if (!paths) + goto malloc_1; + for (i = 0; i < entries; ++i) paths[i] = input + offsets[i]; @@ -6225,7 +6230,7 @@ static char *load_input() if (entries == 1) { tmp = xmemrchr((uchar *)g_prefixpath, '/', strlen(g_prefixpath)); if (!tmp) - return NULL; + goto malloc_2; *(tmp != g_prefixpath ? tmp : tmp + 1) = '\0'; } @@ -6237,6 +6242,7 @@ malloc_2: free(paths[i]); malloc_1: free(input); + free(paths); return tmpdir; } |