pack: free the new pack struct if we fail to insert

If we fail to insert the packfile in the map, make sure to free it.

This makes the free function only attempt to remove its mwindows from
the global list if we have opened the packfile to avoid accessing the
list unlocked.
This commit is contained in:
Carlos Martín Nieto 2014-06-25 21:20:39 +02:00
parent c61dc1a92e
commit 5e0f47c375
2 changed files with 7 additions and 4 deletions

View File

@ -67,6 +67,7 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
if (git_mwindow_files_init() < 0) { if (git_mwindow_files_init() < 0) {
git_mutex_unlock(&git__mwindow_mutex); git_mutex_unlock(&git__mwindow_mutex);
git__free(packname);
return -1; return -1;
} }
@ -93,8 +94,10 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
git_strmap_insert(git__pack_cache, pack->pack_name, pack, error); git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
git_mutex_unlock(&git__mwindow_mutex); git_mutex_unlock(&git__mwindow_mutex);
if (error < 0) if (error < 0) {
git_packfile_free(pack);
return -1; return -1;
}
*out = pack; *out = pack;
return 0; return 0;

View File

@ -968,10 +968,10 @@ void git_packfile_free(struct git_pack_file *p)
cache_free(&p->bases); cache_free(&p->bases);
if (p->mwf.fd >= 0) {
git_mwindow_free_all_locked(&p->mwf); git_mwindow_free_all_locked(&p->mwf);
if (p->mwf.fd >= 0)
p_close(p->mwf.fd); p_close(p->mwf.fd);
}
pack_index_free(p); pack_index_free(p);