introduce special error code for a corrupt file index
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
diff --git a/include/got_error.h b/include/got_error.h
index 34bd324..798180a 100644
--- a/include/got_error.h
+++ b/include/got_error.h
@@ -69,6 +69,7 @@
#define GOT_ERR_FILEIDX_CSUM 53
#define GOT_ERR_PATH_PREFIX 54
#define GOT_ERR_ANCESTRY 55
+#define GOT_ERR_FILEIDX_BAD 56
static const struct got_error {
int code;
@@ -128,6 +129,7 @@ static const struct got_error {
"different path prefix" },
{ GOT_ERR_ANCESTRY, "specified commit does not share ancestry with "
"the current branch" },
+ { GOT_ERR_FILEIDX_BAD, "file index is corrupt" },
};
/*
diff --git a/lib/fileindex.c b/lib/fileindex.c
index dd1d1db..b3b7b35 100644
--- a/lib/fileindex.c
+++ b/lib/fileindex.c
@@ -329,7 +329,7 @@ read_fileindex_val64(uint64_t *val, SHA1_CTX *ctx, FILE *infile)
n = fread(val, 1, sizeof(*val), infile);
if (n != sizeof(*val))
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
SHA1Update(ctx, (uint8_t *)val, sizeof(*val));
*val = be64toh(*val);
return NULL;
@@ -342,7 +342,7 @@ read_fileindex_val32(uint32_t *val, SHA1_CTX *ctx, FILE *infile)
n = fread(val, 1, sizeof(*val), infile);
if (n != sizeof(*val))
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
SHA1Update(ctx, (uint8_t *)val, sizeof(*val));
*val = be32toh(*val);
return NULL;
@@ -355,7 +355,7 @@ read_fileindex_val16(uint16_t *val, SHA1_CTX *ctx, FILE *infile)
n = fread(val, 1, sizeof(*val), infile);
if (n != sizeof(*val))
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
SHA1Update(ctx, (uint8_t *)val, sizeof(*val));
*val = be16toh(*val);
return NULL;
@@ -375,7 +375,7 @@ read_fileindex_path(char **path, SHA1_CTX *ctx, FILE *infile)
do {
n = fread(buf, 1, sizeof(buf), infile);
if (n != sizeof(buf))
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
if (len + sizeof(buf) > totlen) {
char *p = reallocarray(*path, totlen + sizeof(buf), 1);
if (p == NULL) {
@@ -440,14 +440,14 @@ read_fileindex_entry(struct got_fileindex_entry **entryp, SHA1_CTX *ctx,
n = fread(entry->blob_sha1, 1, SHA1_DIGEST_LENGTH, infile);
if (n != SHA1_DIGEST_LENGTH) {
- err = got_ferror(infile, GOT_ERR_IO);
+ err = got_ferror(infile, GOT_ERR_FILEIDX_BAD);
goto done;
}
SHA1Update(ctx, entry->blob_sha1, SHA1_DIGEST_LENGTH);
n = fread(entry->commit_sha1, 1, SHA1_DIGEST_LENGTH, infile);
if (n != SHA1_DIGEST_LENGTH) {
- err = got_ferror(infile, GOT_ERR_IO);
+ err = got_ferror(infile, GOT_ERR_FILEIDX_BAD);
goto done;
}
SHA1Update(ctx, entry->commit_sha1, SHA1_DIGEST_LENGTH);
@@ -486,7 +486,7 @@ got_fileindex_read(struct got_fileindex *fileindex, FILE *infile)
if (n != len) {
if (n == 0) /* EOF */
return NULL;
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
}
SHA1Update(&ctx, buf, len);
@@ -512,7 +512,7 @@ got_fileindex_read(struct got_fileindex *fileindex, FILE *infile)
n = fread(sha1_expected, 1, sizeof(sha1_expected), infile);
if (n != sizeof(sha1_expected))
- return got_ferror(infile, GOT_ERR_IO);
+ return got_ferror(infile, GOT_ERR_FILEIDX_BAD);
SHA1Final(sha1, &ctx);
if (memcmp(sha1, sha1_expected, SHA1_DIGEST_LENGTH) != 0)
return got_error(GOT_ERR_FILEIDX_CSUM);