src/nnn.c | 16 +++++++++++----- diff --git a/src/nnn.c b/src/nnn.c index 1b9f7a2b867bc7c620248601592c6fa91f7999e0..f2b46e8ebaa23ccf3438b7450487c66f22b75ccc 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -157,6 +157,7 @@ #define CTX_MAX 4 #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 @@ /* 512 KiB chunk size */ 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 @@ off = next - input; continue; } - if (entries == (1 << 16)) + if (entries == LIST_FILES_MAX) goto malloc_1; offsets[entries++] = off; @@ -6186,7 +6187,7 @@ return NULL; } if (off != total_read) { - if (entries == (1 << 16)) + if (entries == LIST_FILES_MAX) goto malloc_1; offsets[entries++] = off; @@ -6197,6 +6198,10 @@ goto malloc_1; 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 @@ 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 @@ for (i = entries - 1; i >= 0; --i) free(paths[i]); malloc_1: free(input); + free(paths); return tmpdir; }