Commit 267d539f by Jakob Pfender Committed by Vicent Marti

odb_pack.c: Move to new error handling mechanism

parent 60e1b49a
...@@ -405,7 +405,7 @@ static int pack_window_close_lru( ...@@ -405,7 +405,7 @@ static int pack_window_close_lru(
return GIT_SUCCESS; return GIT_SUCCESS;
} }
return GIT_ERROR; return git__throw(GIT_ERROR, "Failed to close pack window");
} }
static void pack_window_close(struct pack_window **w_cursor) static void pack_window_close(struct pack_window **w_cursor)
...@@ -532,11 +532,11 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -532,11 +532,11 @@ static int pack_index_check(const char *path, struct pack_file *p)
int error; int error;
if (fd < 0) if (fd < 0)
return GIT_EOSERR; return git__throw(GIT_EOSERR, "Failed to check index. File missing or corrupted");
if (gitfo_fstat(fd, &st) < GIT_SUCCESS) { if (gitfo_fstat(fd, &st) < GIT_SUCCESS) {
gitfo_close(fd); gitfo_close(fd);
return GIT_EOSERR; return git__throw(GIT_EOSERR, "Failed to check index. File appears to be corrupted");
} }
if (!git__is_sizet(st.st_size)) if (!git__is_sizet(st.st_size))
...@@ -546,14 +546,14 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -546,14 +546,14 @@ static int pack_index_check(const char *path, struct pack_file *p)
if (idx_size < 4 * 256 + 20 + 20) { if (idx_size < 4 * 256 + 20 + 20) {
gitfo_close(fd); gitfo_close(fd);
return GIT_EOBJCORRUPTED; return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Object is corrupted");
} }
error = gitfo_map_ro(&p->index_map, fd, 0, idx_size); error = gitfo_map_ro(&p->index_map, fd, 0, idx_size);
gitfo_close(fd); gitfo_close(fd);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to check index");
hdr = idx_map = p->index_map.data; hdr = idx_map = p->index_map.data;
...@@ -562,7 +562,7 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -562,7 +562,7 @@ static int pack_index_check(const char *path, struct pack_file *p)
if (version < 2 || version > 2) { if (version < 2 || version > 2) {
gitfo_free_map(&p->index_map); gitfo_free_map(&p->index_map);
return GIT_EOBJCORRUPTED; /* unsupported index version */ return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Unsupported index version");
} }
} else } else
...@@ -578,7 +578,7 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -578,7 +578,7 @@ static int pack_index_check(const char *path, struct pack_file *p)
uint32_t n = ntohl(index[i]); uint32_t n = ntohl(index[i]);
if (n < nr) { if (n < nr) {
gitfo_free_map(&p->index_map); gitfo_free_map(&p->index_map);
return GIT_EOBJCORRUPTED; /* non-monotonic index */ return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Index is non-monotonic");
} }
nr = n; nr = n;
} }
...@@ -593,7 +593,7 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -593,7 +593,7 @@ static int pack_index_check(const char *path, struct pack_file *p)
*/ */
if (idx_size != 4*256 + nr * 24 + 20 + 20) { if (idx_size != 4*256 + nr * 24 + 20 + 20) {
gitfo_free_map(&p->index_map); gitfo_free_map(&p->index_map);
return GIT_EOBJCORRUPTED; return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Object is corrupted");
} }
} else if (version == 2) { } else if (version == 2) {
/* /*
...@@ -617,14 +617,14 @@ static int pack_index_check(const char *path, struct pack_file *p) ...@@ -617,14 +617,14 @@ static int pack_index_check(const char *path, struct pack_file *p)
if (idx_size < min_size || idx_size > max_size) { if (idx_size < min_size || idx_size > max_size) {
gitfo_free_map(&p->index_map); gitfo_free_map(&p->index_map);
return GIT_EOBJCORRUPTED; return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Wrong index size");
} }
/* Make sure that off_t is big enough to access the whole pack... /* Make sure that off_t is big enough to access the whole pack...
* Is this an issue in libgit2? It shouldn't. */ * Is this an issue in libgit2? It shouldn't. */
if (idx_size != min_size && (sizeof(off_t) <= 4)) { if (idx_size != min_size && (sizeof(off_t) <= 4)) {
gitfo_free_map(&p->index_map); gitfo_free_map(&p->index_map);
return GIT_EOSERR; return git__throw(GIT_EOSERR, "Failed to check index. off_t not big enough to access the whole pack");
} }
} }
...@@ -647,7 +647,7 @@ static int pack_index_open(struct pack_file *p) ...@@ -647,7 +647,7 @@ static int pack_index_open(struct pack_file *p)
error = pack_index_check(idx_name, p); error = pack_index_check(idx_name, p);
free(idx_name); free(idx_name);
return error; return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to open index");
} }
...@@ -726,12 +726,12 @@ static int packfile_open(struct pack_file *p) ...@@ -726,12 +726,12 @@ static int packfile_open(struct pack_file *p)
unsigned char *idx_sha1; unsigned char *idx_sha1;
if (!p->index_map.data && pack_index_open(p) < GIT_SUCCESS) if (!p->index_map.data && pack_index_open(p) < GIT_SUCCESS)
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to open packfile. File not found");
/* TODO: open with noatime */ /* TODO: open with noatime */
p->pack_fd = gitfo_open(p->pack_name, O_RDONLY); p->pack_fd = gitfo_open(p->pack_name, O_RDONLY);
if (p->pack_fd < 0 || gitfo_fstat(p->pack_fd, &st) < GIT_SUCCESS) if (p->pack_fd < 0 || gitfo_fstat(p->pack_fd, &st) < GIT_SUCCESS)
return GIT_EOSERR; return git__throw(GIT_EOSERR, "Failed to open packfile. File appears to be corrupted");
/* If we created the struct before we had the pack we lack size. */ /* If we created the struct before we had the pack we lack size. */
if (!p->pack_size) { if (!p->pack_size) {
...@@ -784,7 +784,7 @@ static int packfile_open(struct pack_file *p) ...@@ -784,7 +784,7 @@ static int packfile_open(struct pack_file *p)
cleanup: cleanup:
gitfo_close(p->pack_fd); gitfo_close(p->pack_fd);
p->pack_fd = -1; p->pack_fd = -1;
return GIT_EPACKCORRUPTED; return git__throw(GIT_EPACKCORRUPTED, "Failed to packfile. Pack is corrupted");
} }
static int packfile_check(struct pack_file **pack_out, const char *path) static int packfile_check(struct pack_file **pack_out, const char *path)
...@@ -804,7 +804,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path) ...@@ -804,7 +804,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path)
path_len -= STRLEN(".idx"); path_len -= STRLEN(".idx");
if (path_len < 1) { if (path_len < 1) {
free(p); free(p);
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to check packfile. Wrong path name");
} }
memcpy(p->pack_name, path, path_len); memcpy(p->pack_name, path, path_len);
...@@ -816,7 +816,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path) ...@@ -816,7 +816,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path)
strcpy(p->pack_name + path_len, ".pack"); strcpy(p->pack_name + path_len, ".pack");
if (gitfo_stat(p->pack_name, &st) < GIT_SUCCESS || !S_ISREG(st.st_mode)) { if (gitfo_stat(p->pack_name, &st) < GIT_SUCCESS || !S_ISREG(st.st_mode)) {
free(p); free(p);
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to check packfile. File not found");
} }
/* ok, it looks sane as far as we can check without /* ok, it looks sane as far as we can check without
...@@ -853,7 +853,7 @@ static int packfile_load__cb(void *_data, char *path) ...@@ -853,7 +853,7 @@ static int packfile_load__cb(void *_data, char *path)
error = packfile_check(&pack, path); error = packfile_check(&pack, path);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to load packfile");
if (git_vector_insert(&backend->packs, pack) < GIT_SUCCESS) { if (git_vector_insert(&backend->packs, pack) < GIT_SUCCESS) {
free(pack); free(pack);
...@@ -872,7 +872,7 @@ static int packfile_refresh_all(struct pack_backend *backend) ...@@ -872,7 +872,7 @@ static int packfile_refresh_all(struct pack_backend *backend)
return GIT_SUCCESS; return GIT_SUCCESS;
if (gitfo_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode)) if (gitfo_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode))
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to refresh packfiles. Backend not found");
if (st.st_mtime != backend->pack_folder_mtime) { if (st.st_mtime != backend->pack_folder_mtime) {
char path[GIT_PATH_MAX]; char path[GIT_PATH_MAX];
...@@ -881,7 +881,7 @@ static int packfile_refresh_all(struct pack_backend *backend) ...@@ -881,7 +881,7 @@ static int packfile_refresh_all(struct pack_backend *backend)
/* reload all packs */ /* reload all packs */
error = gitfo_dirent(path, GIT_PATH_MAX, packfile_load__cb, (void *)backend); error = gitfo_dirent(path, GIT_PATH_MAX, packfile_load__cb, (void *)backend);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to refresh packfiles");
git_vector_sort(&backend->packs); git_vector_sort(&backend->packs);
backend->pack_folder_mtime = st.st_mtime; backend->pack_folder_mtime = st.st_mtime;
...@@ -936,7 +936,7 @@ static int pack_entry_find_offset( ...@@ -936,7 +936,7 @@ static int pack_entry_find_offset(
int error; int error;
if ((error = pack_index_open(p)) < GIT_SUCCESS) if ((error = pack_index_open(p)) < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to find offset for pack entry");
assert(p->index_map.data); assert(p->index_map.data);
...@@ -969,7 +969,7 @@ static int pack_entry_find_offset( ...@@ -969,7 +969,7 @@ static int pack_entry_find_offset(
int pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, oid); int pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, oid);
if (pos < 0) if (pos < 0)
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to find offset for pack entry. Entry not found");
*offset_out = nth_packed_object_offset(p, pos); *offset_out = nth_packed_object_offset(p, pos);
return GIT_SUCCESS; return GIT_SUCCESS;
...@@ -992,7 +992,7 @@ static int pack_entry_find_offset( ...@@ -992,7 +992,7 @@ static int pack_entry_find_offset(
} while (lo < hi); } while (lo < hi);
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to find offset for pack entry. Entry not found");
#endif #endif
} }
...@@ -1009,17 +1009,17 @@ static int pack_entry_find1( ...@@ -1009,17 +1009,17 @@ static int pack_entry_find1(
unsigned i; unsigned i;
for (i = 0; i < p->num_bad_objects; i++) for (i = 0; i < p->num_bad_objects; i++)
if (git_oid_cmp(oid, &p->bad_object_sha1[i]) == 0) if (git_oid_cmp(oid, &p->bad_object_sha1[i]) == 0)
return GIT_ERROR; return git__throw(GIT_ERROR, "Failed to find pack entry. Bad object found");
} }
if (pack_entry_find_offset(&offset, p, oid) < GIT_SUCCESS) if (pack_entry_find_offset(&offset, p, oid) < GIT_SUCCESS)
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to find pack entry. Couldn't find offset");
/* we found an entry in the index; /* we found an entry in the index;
* make sure the packfile backing the index * make sure the packfile backing the index
* still exists on disk */ * still exists on disk */
if (p->pack_fd == -1 && packfile_open(p) < GIT_SUCCESS) if (p->pack_fd == -1 && packfile_open(p) < GIT_SUCCESS)
return GIT_EOSERR; return git__throw(GIT_EOSERR, "Failed to find pack entry. Packfile doesn't exist on disk");
e->offset = offset; e->offset = offset;
e->p = p; e->p = p;
...@@ -1034,7 +1034,7 @@ static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, c ...@@ -1034,7 +1034,7 @@ static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, c
size_t i; size_t i;
if ((error = packfile_refresh_all(backend)) < GIT_SUCCESS) if ((error = packfile_refresh_all(backend)) < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to find pack entry");
if (backend->last_found && if (backend->last_found &&
pack_entry_find1(e, backend->last_found, oid) == GIT_SUCCESS) pack_entry_find1(e, backend->last_found, oid) == GIT_SUCCESS)
...@@ -1053,7 +1053,7 @@ static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, c ...@@ -1053,7 +1053,7 @@ static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, c
} }
} }
return GIT_ENOTFOUND; return git__throw(GIT_ENOTFOUND, "Failed to find pack entry");
} }
...@@ -1125,7 +1125,7 @@ static int packfile_unpack_header( ...@@ -1125,7 +1125,7 @@ static int packfile_unpack_header(
used = packfile_unpack_header1(size_p, type_p, base, left); used = packfile_unpack_header1(size_p, type_p, base, left);
if (used == 0) if (used == 0)
return GIT_EOBJCORRUPTED; return git__throw(GIT_EOBJCORRUPTED, "Failed to unpack packfile header. Header length is zero");
*curpos += used; *curpos += used;
return GIT_SUCCESS; return GIT_SUCCESS;
...@@ -1153,7 +1153,7 @@ static int packfile_unpack_compressed( ...@@ -1153,7 +1153,7 @@ static int packfile_unpack_compressed(
st = inflateInit(&stream); st = inflateInit(&stream);
if (st != Z_OK) { if (st != Z_OK) {
free(buffer); free(buffer);
return GIT_EZLIB; return git__throw(GIT_EZLIB, "Failed to unpack compressed packfile. Error in zlib");
} }
do { do {
...@@ -1171,7 +1171,7 @@ static int packfile_unpack_compressed( ...@@ -1171,7 +1171,7 @@ static int packfile_unpack_compressed(
if ((st != Z_STREAM_END) || stream.total_out != size) { if ((st != Z_STREAM_END) || stream.total_out != size) {
free(buffer); free(buffer);
return GIT_EZLIB; return git__throw(GIT_EZLIB, "Failed to unpack compressed packfile. Error in zlib");
} }
obj->type = type; obj->type = type;
...@@ -1215,7 +1215,7 @@ static off_t get_delta_base( ...@@ -1215,7 +1215,7 @@ static off_t get_delta_base(
} else if (type == GIT_OBJ_REF_DELTA) { } else if (type == GIT_OBJ_REF_DELTA) {
/* The base entry _must_ be in the same pack */ /* The base entry _must_ be in the same pack */
if (pack_entry_find_offset(&base_offset, p, (git_oid *)base_info) < GIT_SUCCESS) if (pack_entry_find_offset(&base_offset, p, (git_oid *)base_info) < GIT_SUCCESS)
return GIT_EPACKCORRUPTED; return git__throw(GIT_EPACKCORRUPTED, "Failed to get base entry delta. Base entry is not in the same pack");
*curpos += 20; *curpos += 20;
} else } else
return 0; return 0;
...@@ -1239,7 +1239,7 @@ static int packfile_unpack_delta( ...@@ -1239,7 +1239,7 @@ static int packfile_unpack_delta(
base_offset = get_delta_base(backend, p, w_curs, &curpos, delta_type, obj_offset); base_offset = get_delta_base(backend, p, w_curs, &curpos, delta_type, obj_offset);
if (base_offset == 0) if (base_offset == 0)
return GIT_EOBJCORRUPTED; return git__throw(GIT_EOBJCORRUPTED, "Failed to get delta for unpacked packfile. Offset is zero");
pack_window_close(w_curs); pack_window_close(w_curs);
error = packfile_unpack(&base, backend, p, base_offset); error = packfile_unpack(&base, backend, p, base_offset);
...@@ -1247,12 +1247,12 @@ static int packfile_unpack_delta( ...@@ -1247,12 +1247,12 @@ static int packfile_unpack_delta(
/* TODO: git.git tries to load the base from other packfiles /* TODO: git.git tries to load the base from other packfiles
* or loose objects */ * or loose objects */
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to get delta for unpacked packfile");
error = packfile_unpack_compressed(&delta, backend, p, w_curs, curpos, delta_size, delta_type); error = packfile_unpack_compressed(&delta, backend, p, w_curs, curpos, delta_size, delta_type);
if (error < GIT_SUCCESS) { if (error < GIT_SUCCESS) {
free(base.data); free(base.data);
return error; return git__rethrow(error, "Failed to get delta for unpacked packfile");
} }
obj->type = base.type; obj->type = base.type;
...@@ -1265,7 +1265,7 @@ static int packfile_unpack_delta( ...@@ -1265,7 +1265,7 @@ static int packfile_unpack_delta(
/* TODO: we might want to cache this shit. eventually */ /* TODO: we might want to cache this shit. eventually */
//add_delta_base_cache(p, base_offset, base, base_size, *type); //add_delta_base_cache(p, base_offset, base, base_size, *type);
return error; return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to get delta for unpacked packfile");
} }
static int packfile_unpack( static int packfile_unpack(
...@@ -1291,7 +1291,7 @@ static int packfile_unpack( ...@@ -1291,7 +1291,7 @@ static int packfile_unpack(
error = packfile_unpack_header(&size, &type, backend, p, &w_curs, &curpos); error = packfile_unpack_header(&size, &type, backend, p, &w_curs, &curpos);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to unpack packfile");
switch (type) { switch (type) {
case GIT_OBJ_OFS_DELTA: case GIT_OBJ_OFS_DELTA:
...@@ -1316,7 +1316,7 @@ static int packfile_unpack( ...@@ -1316,7 +1316,7 @@ static int packfile_unpack(
} }
pack_window_close(&w_curs); pack_window_close(&w_curs);
return error; return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to unpack packfile");
} }
...@@ -1352,10 +1352,10 @@ int pack_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_od ...@@ -1352,10 +1352,10 @@ int pack_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_od
int error; int error;
if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < GIT_SUCCESS) if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to read pack backend");
if ((error = packfile_unpack(&raw, (struct pack_backend *)backend, e.p, e.offset)) < GIT_SUCCESS) if ((error = packfile_unpack(&raw, (struct pack_backend *)backend, e.p, e.offset)) < GIT_SUCCESS)
return error; return git__rethrow(error, "Failed to read pack backend");
*buffer_p = raw.data; *buffer_p = raw.data;
*len_p = raw.len; *len_p = raw.len;
......
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