]> Sergey Matveev's repositories - nnn.git/commitdiff
xrealloc() may move memory
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 2 Feb 2020 12:06:35 +0000 (17:36 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 2 Feb 2020 12:06:35 +0000 (17:36 +0530)
src/nnn.c

index 5c6027815912757adbfc9edf388c68a91629c073..1b9f7a2b867bc7c620248601592c6fa91f7999e0 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -6134,6 +6134,7 @@ 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];
        ssize_t input_read, total_read = 0, off = 0;
 
@@ -6170,22 +6171,25 @@ static char *load_input()
                        if (entries == (1 << 16))
                                goto malloc_1;
 
-                       paths[entries++] = input + off;
+                       offsets[entries++] = off;
                        off = next - input;
                }
 
                if (input_read < chunk)
                        break;
 
-               if (chunk_count == 512 || !(input = xrealloc(input, (chunk_count + 1) * chunk)))
+               if (chunk_count == 512)
                        goto malloc_1;
+
+               if (!(input = xrealloc(input, (chunk_count + 1) * chunk)))
+                       return NULL;
        }
 
        if (off != total_read) {
                if (entries == (1 << 16))
                        goto malloc_1;
 
-               paths[entries++] = input + off;
+               offsets[entries++] = off;
        }
 
        if (!entries)
@@ -6193,6 +6197,9 @@ static char *load_input()
 
        input[total_read] = '\0';
 
+       for (i = 0; i < entries; ++i)
+               paths[i] = input + offsets[i];
+
        g_prefixpath = malloc(sizeof(char) * PATH_MAX);
        if (!g_prefixpath)
                goto malloc_1;