Commit 282283ac by Russell Belfer

Fix valgrind issues

There are three changes here:
- correctly propogate error code from failed object lookups
- make zlib inflate use our allocators
- add OID to notfound error in ODB lookups
parent 3ec1fa5e
...@@ -146,7 +146,7 @@ int git_object_lookup_prefix( ...@@ -146,7 +146,7 @@ int git_object_lookup_prefix(
} }
if (error < 0) if (error < 0)
return -1; return error;
if (type != GIT_OBJ_ANY && type != odb_obj->raw.type) { if (type != GIT_OBJ_ANY && type != odb_obj->raw.type) {
git_odb_object_free(odb_obj); git_odb_object_free(odb_obj);
......
...@@ -589,7 +589,7 @@ int git_odb_read_prefix( ...@@ -589,7 +589,7 @@ int git_odb_read_prefix(
} }
if (found == 0) if (found == 0)
return git_odb__error_notfound("no match for prefix"); return git_odb__error_notfound("no match for prefix", short_id);
if (found > 1) if (found > 1)
return git_odb__error_ambiguous("multiple matches for prefix"); return git_odb__error_ambiguous("multiple matches for prefix");
...@@ -684,9 +684,15 @@ int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oi ...@@ -684,9 +684,15 @@ int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oi
return error; return error;
} }
int git_odb__error_notfound(const char *message) int git_odb__error_notfound(const char *message, const git_oid *oid)
{ {
giterr_set(GITERR_ODB, "Object not found - %s", message); if (oid != NULL) {
char oid_str[GIT_OID_HEXSZ + 1];
git_oid_tostr(oid_str, sizeof(oid_str), oid);
giterr_set(GITERR_ODB, "Object not found - %s (%s)", message, oid_str);
} else
giterr_set(GITERR_ODB, "Object not found - %s", message);
return GIT_ENOTFOUND; return GIT_ENOTFOUND;
} }
......
...@@ -70,7 +70,7 @@ int git_odb__hashlink(git_oid *out, const char *path); ...@@ -70,7 +70,7 @@ int git_odb__hashlink(git_oid *out, const char *path);
/* /*
* Generate a GIT_ENOTFOUND error for the ODB. * Generate a GIT_ENOTFOUND error for the ODB.
*/ */
int git_odb__error_notfound(const char *message); int git_odb__error_notfound(const char *message, const git_oid *oid);
/* /*
* Generate a GIT_EAMBIGUOUS error for the ODB. * Generate a GIT_EAMBIGUOUS error for the ODB.
......
...@@ -528,7 +528,7 @@ static int locate_object_short_oid( ...@@ -528,7 +528,7 @@ static int locate_object_short_oid(
/* Check that directory exists */ /* Check that directory exists */
if (git_path_isdir(object_location->ptr) == false) if (git_path_isdir(object_location->ptr) == false)
return git_odb__error_notfound("failed to locate from short oid"); return git_odb__error_notfound("no matching loose object for prefix", short_oid);
state.dir_len = git_buf_len(object_location); state.dir_len = git_buf_len(object_location);
state.short_oid_len = len; state.short_oid_len = len;
...@@ -541,7 +541,7 @@ static int locate_object_short_oid( ...@@ -541,7 +541,7 @@ static int locate_object_short_oid(
return error; return error;
if (!state.found) if (!state.found)
return git_odb__error_notfound("failed to locate from short oid"); return git_odb__error_notfound("no matching loose object for prefix", short_oid);
/* Convert obtained hex formatted oid to raw */ /* Convert obtained hex formatted oid to raw */
error = git_oid_fromstr(res_oid, (char *)state.res_oid); error = git_oid_fromstr(res_oid, (char *)state.res_oid);
...@@ -590,7 +590,7 @@ static int loose_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_ ...@@ -590,7 +590,7 @@ static int loose_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_
raw.type = GIT_OBJ_BAD; raw.type = GIT_OBJ_BAD;
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) if (locate_object(&object_path, (loose_backend *)backend, oid) < 0)
error = git_odb__error_notfound("in loose backend"); error = git_odb__error_notfound("no matching loose object", oid);
else if ((error = read_header_loose(&raw, &object_path)) == 0) { else if ((error = read_header_loose(&raw, &object_path)) == 0) {
*len_p = raw.len; *len_p = raw.len;
*type_p = raw.type; *type_p = raw.type;
...@@ -610,7 +610,7 @@ static int loose_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p ...@@ -610,7 +610,7 @@ static int loose_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p
assert(backend && oid); assert(backend && oid);
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) if (locate_object(&object_path, (loose_backend *)backend, oid) < 0)
error = git_odb__error_notfound("in loose backend"); error = git_odb__error_notfound("no matching loose object", oid);
else if ((error = read_loose(&raw, &object_path)) == 0) { else if ((error = read_loose(&raw, &object_path)) == 0) {
*buffer_p = raw.data; *buffer_p = raw.data;
*len_p = raw.len; *len_p = raw.len;
......
...@@ -242,7 +242,7 @@ static int packfile_refresh_all(struct pack_backend *backend) ...@@ -242,7 +242,7 @@ static int packfile_refresh_all(struct pack_backend *backend)
return 0; return 0;
if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode)) if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode))
return git_odb__error_notfound("failed to refresh packfiles"); return git_odb__error_notfound("failed to refresh packfiles", NULL);
if (st.st_mtime != backend->pack_folder_mtime) { if (st.st_mtime != backend->pack_folder_mtime) {
git_buf path = GIT_BUF_INIT; git_buf path = GIT_BUF_INIT;
...@@ -288,7 +288,7 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen ...@@ -288,7 +288,7 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen
} }
} }
return git_odb__error_notfound("failed to find pack entry"); return git_odb__error_notfound("failed to find pack entry", oid);
} }
static int pack_entry_find_prefix( static int pack_entry_find_prefix(
...@@ -330,7 +330,7 @@ static int pack_entry_find_prefix( ...@@ -330,7 +330,7 @@ static int pack_entry_find_prefix(
} }
if (!found) if (!found)
return git_odb__error_notfound("failed to find pack entry"); return git_odb__error_notfound("no matching pack entry for prefix", short_oid);
else if (found > 1) else if (found > 1)
return git_odb__error_ambiguous("found multiple pack entries"); return git_odb__error_ambiguous("found multiple pack entries");
else else
......
...@@ -375,6 +375,18 @@ int git_packfile_unpack( ...@@ -375,6 +375,18 @@ int git_packfile_unpack(
return error; return error;
} }
static void *use_git_alloc(void *opaq, unsigned int count, unsigned int size)
{
GIT_UNUSED(opaq);
return git__calloc(count, size);
}
static void use_git_free(void *opaq, void *ptr)
{
GIT_UNUSED(opaq);
git__free(ptr);
}
int packfile_unpack_compressed( int packfile_unpack_compressed(
git_rawobj *obj, git_rawobj *obj,
struct git_pack_file *p, struct git_pack_file *p,
...@@ -393,6 +405,8 @@ int packfile_unpack_compressed( ...@@ -393,6 +405,8 @@ int packfile_unpack_compressed(
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
stream.next_out = buffer; stream.next_out = buffer;
stream.avail_out = (uInt)size + 1; stream.avail_out = (uInt)size + 1;
stream.zalloc = use_git_alloc;
stream.zfree = use_git_free;
st = inflateInit(&stream); st = inflateInit(&stream);
if (st != Z_OK) { if (st != Z_OK) {
...@@ -541,7 +555,7 @@ static int packfile_open(struct git_pack_file *p) ...@@ -541,7 +555,7 @@ static int packfile_open(struct git_pack_file *p)
assert(p->index_map.data); assert(p->index_map.data);
if (!p->index_map.data && pack_index_open(p) < 0) if (!p->index_map.data && pack_index_open(p) < 0)
return git_odb__error_notfound("failed to open packfile"); return git_odb__error_notfound("failed to open packfile", NULL);
/* TODO: open with noatime */ /* TODO: open with noatime */
p->mwf.fd = git_futils_open_ro(p->pack_name); p->mwf.fd = git_futils_open_ro(p->pack_name);
...@@ -615,7 +629,7 @@ int git_packfile_check(struct git_pack_file **pack_out, const char *path) ...@@ -615,7 +629,7 @@ int git_packfile_check(struct git_pack_file **pack_out, const char *path)
path_len -= strlen(".idx"); path_len -= strlen(".idx");
if (path_len < 1) { if (path_len < 1) {
git__free(p); git__free(p);
return git_odb__error_notfound("invalid packfile path"); return git_odb__error_notfound("invalid packfile path", NULL);
} }
memcpy(p->pack_name, path, path_len); memcpy(p->pack_name, path, path_len);
...@@ -627,7 +641,7 @@ int git_packfile_check(struct git_pack_file **pack_out, const char *path) ...@@ -627,7 +641,7 @@ int git_packfile_check(struct git_pack_file **pack_out, const char *path)
strcpy(p->pack_name + path_len, ".pack"); strcpy(p->pack_name + path_len, ".pack");
if (p_stat(p->pack_name, &st) < 0 || !S_ISREG(st.st_mode)) { if (p_stat(p->pack_name, &st) < 0 || !S_ISREG(st.st_mode)) {
git__free(p); git__free(p);
return git_odb__error_notfound("packfile not found"); return git_odb__error_notfound("packfile not found", NULL);
} }
/* ok, it looks sane as far as we can check without /* ok, it looks sane as far as we can check without
...@@ -733,9 +747,8 @@ static int pack_entry_find_offset( ...@@ -733,9 +747,8 @@ static int pack_entry_find_offset(
if (pos < (int)p->num_objects) { if (pos < (int)p->num_objects) {
current = index + pos * stride; current = index + pos * stride;
if (!git_oid_ncmp(short_oid, (const git_oid *)current, len)) { if (!git_oid_ncmp(short_oid, (const git_oid *)current, len))
found = 1; found = 1;
}
} }
} }
...@@ -749,7 +762,7 @@ static int pack_entry_find_offset( ...@@ -749,7 +762,7 @@ static int pack_entry_find_offset(
} }
if (!found) if (!found)
return git_odb__error_notfound("failed to find offset for pack entry"); return git_odb__error_notfound("failed to find offset for pack entry", short_oid);
if (found > 1) if (found > 1)
return git_odb__error_ambiguous("found multiple offsets for pack entry"); return git_odb__error_ambiguous("found multiple offsets for pack entry");
*offset_out = nth_packed_object_offset(p, pos); *offset_out = nth_packed_object_offset(p, pos);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment