repository: fix free problem with repo_clear(the_repository)
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Thu, 10 May 2018 06:13:10 +0000 (08:13 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 May 2018 09:33:09 +0000 (18:33 +0900)
the_repository is special. One of the special things about it is that
it does not allocate a new index_state object like submodules but
points to the global the_index variable instead. As a global variable,
the_index cannot be free()'d.

Add an exception for this in repo_clear(). In the future perhaps we
would be able to allocate the_repository's index on heap too. Then we
can revert this.

the_repository->index remains pointed to a clean the_index even after
repo_clear() so that it could still be used next time (e.g. in a crazy
use case where a dev switches repo in the same process).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
repository.c
index bb2fae5446b7ea8d2bfac87faa30c165f714d121..450852d9152ad791a2a63bc938e86061a55d34e2 100644 (file)
@@ -220,7 +220,8 @@ void repo_clear(struct repository *repo)
 
        if (repo->index) {
                discard_index(repo->index);
-               FREE_AND_NULL(repo->index);
+               if (repo->index != &the_index)
+                       FREE_AND_NULL(repo->index);
        }
 }