@@ -923,32 +923,48 @@ static void verify_one_sparse(struct repository *r,
923
923
path -> buf );
924
924
}
925
925
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 )
930
937
{
931
938
int i , pos , len = path -> len ;
932
939
struct strbuf tree_buf = STRBUF_INIT ;
933
940
struct object_id new_oid ;
934
941
935
942
for (i = 0 ; i < it -> subtree_nr ; i ++ ) {
936
943
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 ;
938
946
strbuf_setlen (path , len );
939
947
}
940
948
941
949
if (it -> entry_count < 0 ||
942
950
/* no verification on tests (t7003) that replace trees */
943
951
lookup_replace_object (r , & it -> oid ) != & it -> oid )
944
- return ;
952
+ return 0 ;
945
953
946
954
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 ;
947
961
pos = index_name_pos (istate , path -> buf , path -> len );
962
+ if (is_sparse && !istate -> sparse_index )
963
+ return 1 ;
948
964
949
965
if (pos >= 0 ) {
950
966
verify_one_sparse (r , istate , it , path , pos );
951
- return ;
967
+ return 0 ;
952
968
}
953
969
954
970
pos = - pos - 1 ;
@@ -996,6 +1012,7 @@ static void verify_one(struct repository *r,
996
1012
oid_to_hex (& new_oid ), oid_to_hex (& it -> oid ));
997
1013
strbuf_setlen (path , len );
998
1014
strbuf_release (& tree_buf );
1015
+ return 0 ;
999
1016
}
1000
1017
1001
1018
void 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)
1004
1021
1005
1022
if (!istate -> cache_tree )
1006
1023
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
+ }
1008
1029
strbuf_release (& path );
1009
1030
}
0 commit comments