diff options
author | Russell Belfer <rb@github.com> | 2013-05-02 03:34:56 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-05-02 03:34:56 -0700 |
commit | 8c535f3f6879c6796d8107d7eb80dd8b2105621b (patch) | |
tree | 5e89567f8d5121113bd0ec34777d8d8fdac98c95 | |
parent | 81b7dec4ee21454775f932717273a90a46f78e1f (diff) | |
download | libgit2-8c535f3f6879c6796d8107d7eb80dd8b2105621b.tar.gz |
Protect sha1_entry_pos call with mutex
There is an occasional assertion failure in sha1_entry_pos from
pack_entry_find_index when running threaded. Holding the mutex
around the code that grabs the index_map data and processes it
makes this assertion failure go away.
-rw-r--r-- | src/pack.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/pack.c b/src/pack.c index 47534f195..1ffad29ae 100644 --- a/src/pack.c +++ b/src/pack.c @@ -1050,24 +1050,24 @@ static int pack_entry_find_offset( const git_oid *short_oid, size_t len) { - const uint32_t *level1_ofs = p->index_map.data; - const unsigned char *index = p->index_map.data; + const uint32_t *level1_ofs; + const unsigned char *index; unsigned hi, lo, stride; int pos, found = 0; const unsigned char *current = 0; *offset_out = 0; - if (index == NULL) { - int error; + if (!p->index_map.data && pack_index_open(p) < 0) + return git_odb__error_notfound("failed to open packfile", NULL); - if ((error = pack_index_open(p)) < 0) - return error; - assert(p->index_map.data); + if (git_mutex_lock(&p->lock) < 0) + return packfile_error("failed to get lock for finding entry offset"); - index = p->index_map.data; - level1_ofs = p->index_map.data; - } + assert(p->index_map.data); + + index = p->index_map.data; + level1_ofs = p->index_map.data; if (p->index_version > 1) { level1_ofs += 2; @@ -1093,6 +1093,8 @@ static int pack_entry_find_offset( /* Use git.git lookup code */ pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, short_oid->id); + git_mutex_unlock(&p->lock); + if (pos >= 0) { /* An object matching exactly the oid was found */ found = 1; |