@@ -923,32 +923,48 @@ static void verify_one_sparse(struct repository *r,
923923 path -> buf );
924924}
925925
926- static void verify_one (struct repository * r ,
927- struct index_state * istate ,
928- struct cache_tree * it ,
929- struct strbuf * path )
926+ /*
927+ * Returns:
928+ * 0 - Verification completed.
929+ * 1 - Restart verification - a call to ensure_full_index() freed the cache
930+ * tree that is being verified and verification needs to be restarted from
931+ * the new toplevel cache tree.
932+ */
933+ static int verify_one (struct repository * r ,
934+ struct index_state * istate ,
935+ struct cache_tree * it ,
936+ struct strbuf * path )
930937{
931938 int i , pos , len = path -> len ;
932939 struct strbuf tree_buf = STRBUF_INIT ;
933940 struct object_id new_oid ;
934941
935942 for (i = 0 ; i < it -> subtree_nr ; i ++ ) {
936943 strbuf_addf (path , "%s/" , it -> down [i ]-> name );
937- verify_one (r , istate , it -> down [i ]-> cache_tree , path );
944+ if (verify_one (r , istate , it -> down [i ]-> cache_tree , path ))
945+ return 1 ;
938946 strbuf_setlen (path , len );
939947 }
940948
941949 if (it -> entry_count < 0 ||
942950 /* no verification on tests (t7003) that replace trees */
943951 lookup_replace_object (r , & it -> oid ) != & it -> oid )
944- return ;
952+ return 0 ;
945953
946954 if (path -> len ) {
955+ /*
956+ * If the index is sparse and the cache tree is not
957+ * index_name_pos() may trigger ensure_full_index() which will
958+ * free the tree that is being verified.
959+ */
960+ int is_sparse = istate -> sparse_index ;
947961 pos = index_name_pos (istate , path -> buf , path -> len );
962+ if (is_sparse && !istate -> sparse_index )
963+ return 1 ;
948964
949965 if (pos >= 0 ) {
950966 verify_one_sparse (r , istate , it , path , pos );
951- return ;
967+ return 0 ;
952968 }
953969
954970 pos = - pos - 1 ;
@@ -996,6 +1012,7 @@ static void verify_one(struct repository *r,
9961012 oid_to_hex (& new_oid ), oid_to_hex (& it -> oid ));
9971013 strbuf_setlen (path , len );
9981014 strbuf_release (& tree_buf );
1015+ return 0 ;
9991016}
10001017
10011018void cache_tree_verify (struct repository * r , struct index_state * istate )
@@ -1004,6 +1021,10 @@ void cache_tree_verify(struct repository *r, struct index_state *istate)
10041021
10051022 if (!istate -> cache_tree )
10061023 return ;
1007- verify_one (r , istate , istate -> cache_tree , & path );
1024+ if (verify_one (r , istate , istate -> cache_tree , & path )) {
1025+ strbuf_reset (& path );
1026+ if (verify_one (r , istate , istate -> cache_tree , & path ))
1027+ BUG ("ensure_full_index() called twice while verifying cache tree" );
1028+ }
10081029 strbuf_release (& path );
10091030}
0 commit comments