Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit fc6e867

Browse files
jlehmannkasal
authored andcommitted
submodule: don't access the .gitmodules cache entry after removing it
Commit 5fee995 introduced the stage_updated_gitmodules() function to add submodule configuration updates to the index. It assumed that even after calling remove_cache_entry_at() the same cache entry would still be valid. This was true in the old days, as cache entries could never be freed, but that is not so sure in the present as there is ongoing work to free removed cache entries, which makes this code segfault. Fix that by calling add_file_to_cache() instead of open coding it. Also remove the "could not find .gitmodules in index" warning, as that won't happen in regular use cases (and by then just silently adding it to the index we do the right thing). Thanks-to: Karsten Blees <[email protected]> Signed-off-by: Jens Lehmann <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9469666 commit fc6e867

File tree

1 file changed

+1
-24
lines changed

1 file changed

+1
-24
lines changed

submodule.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -116,30 +116,7 @@ int remove_path_from_gitmodules(const char *path)
116116

117117
void stage_updated_gitmodules(void)
118118
{
119-
struct strbuf buf = STRBUF_INIT;
120-
struct stat st;
121-
int pos;
122-
struct cache_entry *ce;
123-
int namelen = strlen(".gitmodules");
124-
125-
pos = cache_name_pos(".gitmodules", namelen);
126-
if (pos < 0) {
127-
warning(_("could not find .gitmodules in index"));
128-
return;
129-
}
130-
ce = active_cache[pos];
131-
ce->ce_flags = namelen;
132-
if (strbuf_read_file(&buf, ".gitmodules", 0) < 0)
133-
die(_("reading updated .gitmodules failed"));
134-
if (lstat(".gitmodules", &st) < 0)
135-
die_errno(_("unable to stat updated .gitmodules"));
136-
fill_stat_cache_info(ce, &st);
137-
ce->ce_mode = ce_mode_from_stat(ce, st.st_mode);
138-
if (remove_cache_entry_at(pos) < 0)
139-
die(_("unable to remove .gitmodules from index"));
140-
if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1))
141-
die(_("adding updated .gitmodules failed"));
142-
if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
119+
if (add_file_to_cache(".gitmodules", 0))
143120
die(_("staging updated .gitmodules failed"));
144121
}
145122

0 commit comments

Comments
 (0)