Commit b206d74c by Vicent Martí

Merge pull request #703 from carlosmn/consistency

A few indexer consistency checks
parents 54695f40 6a9d61ef
...@@ -62,6 +62,7 @@ typedef enum { ...@@ -62,6 +62,7 @@ typedef enum {
GITERR_NET, GITERR_NET,
GITERR_TAG, GITERR_TAG,
GITERR_TREE, GITERR_TREE,
GITERR_INDEXER,
} git_error_class; } git_error_class;
/** /**
......
...@@ -110,12 +110,12 @@ static int parse_header(struct git_pack_header *hdr, struct git_pack_file *pack) ...@@ -110,12 +110,12 @@ static int parse_header(struct git_pack_header *hdr, struct git_pack_file *pack)
} }
if (hdr->hdr_signature != ntohl(PACK_SIGNATURE)) { if (hdr->hdr_signature != ntohl(PACK_SIGNATURE)) {
giterr_set(GITERR_INVALID, "Wrong pack signature"); giterr_set(GITERR_INDEXER, "Wrong pack signature");
return -1; return -1;
} }
if (!pack_version_ok(hdr->hdr_version)) { if (!pack_version_ok(hdr->hdr_version)) {
giterr_set(GITERR_INVALID, "Wrong pack version"); giterr_set(GITERR_INDEXER, "Wrong pack version");
return -1; return -1;
} }
...@@ -248,7 +248,7 @@ static int hash_and_save(git_indexer_stream *idx, git_rawobj *obj, git_off_t ent ...@@ -248,7 +248,7 @@ static int hash_and_save(git_indexer_stream *idx, git_rawobj *obj, git_off_t ent
/* FIXME: Parse the object instead of hashing it */ /* FIXME: Parse the object instead of hashing it */
if (git_odb__hashobj(&oid, obj) < 0) { if (git_odb__hashobj(&oid, obj) < 0) {
giterr_set(GITERR_INVALID, "Failed to hash object"); giterr_set(GITERR_INDEXER, "Failed to hash object");
return -1; return -1;
} }
...@@ -441,10 +441,21 @@ int git_indexer_stream_finalize(git_indexer_stream *idx, git_indexer_stats *stat ...@@ -441,10 +441,21 @@ int git_indexer_stream_finalize(git_indexer_stream *idx, git_indexer_stats *stat
git_oid file_hash; git_oid file_hash;
SHA_CTX ctx; SHA_CTX ctx;
/* Test for this before resolve_deltas(), as it plays with idx->off */
if (idx->off < idx->pack->mwf.size - GIT_OID_RAWSZ) {
giterr_set(GITERR_INDEXER, "Indexing error: junk at the end of the pack");
return -1;
}
if (idx->deltas.length > 0) if (idx->deltas.length > 0)
if (resolve_deltas(idx, stats) < 0) if (resolve_deltas(idx, stats) < 0)
return -1; return -1;
if (stats->processed != stats->total) {
giterr_set(GITERR_INDEXER, "Indexing error: early EOF");
return -1;
}
git_vector_sort(&idx->objects); git_vector_sort(&idx->objects);
git_buf_sets(&filename, idx->pack->pack_name); git_buf_sets(&filename, idx->pack->pack_name);
...@@ -583,7 +594,7 @@ int git_indexer_new(git_indexer **out, const char *packname) ...@@ -583,7 +594,7 @@ int git_indexer_new(git_indexer **out, const char *packname)
assert(out && packname); assert(out && packname);
if (git_path_root(packname) < 0) { if (git_path_root(packname) < 0) {
giterr_set(GITERR_INVALID, "Path is not absolute"); giterr_set(GITERR_INDEXER, "Path is not absolute");
return -1; return -1;
} }
...@@ -815,7 +826,7 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats) ...@@ -815,7 +826,7 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats)
/* FIXME: Parse the object instead of hashing it */ /* FIXME: Parse the object instead of hashing it */
error = git_odb__hashobj(&oid, &obj); error = git_odb__hashobj(&oid, &obj);
if (error < 0) { if (error < 0) {
giterr_set(GITERR_INVALID, "Failed to hash object"); giterr_set(GITERR_INDEXER, "Failed to hash object");
goto cleanup; goto cleanup;
} }
......
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