mirror of
https://github.com/git/git.git
synced 2024-11-27 12:03:55 +08:00
distinguish error versus short read from read_in_full()
Many callers of read_in_full() expect to see the exact number of bytes requested, but their error handling lumps together true read errors and short reads due to unexpected EOF. We can give more specific error messages by separating these cases (showing errno when appropriate, and otherwise describing the short read). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
90dca6710e
commit
41dcc4dccc
@ -26,8 +26,10 @@ int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
|
|||||||
usage(builtin_get_tar_commit_id_usage);
|
usage(builtin_get_tar_commit_id_usage);
|
||||||
|
|
||||||
n = read_in_full(0, buffer, HEADERSIZE);
|
n = read_in_full(0, buffer, HEADERSIZE);
|
||||||
|
if (n < 0)
|
||||||
|
die_errno("git get-tar-commit-id: read error");
|
||||||
if (n != HEADERSIZE)
|
if (n != HEADERSIZE)
|
||||||
die("git get-tar-commit-id: read error");
|
die_errno("git get-tar-commit-id: EOF before reading tar header");
|
||||||
if (header->typeflag[0] != 'g')
|
if (header->typeflag[0] != 'g')
|
||||||
return 1;
|
return 1;
|
||||||
if (!skip_prefix(content, "52 comment=", &comment))
|
if (!skip_prefix(content, "52 comment=", &comment))
|
||||||
|
@ -115,7 +115,10 @@ static int stream_to_pack(struct bulk_checkin_state *state,
|
|||||||
|
|
||||||
if (size && !s.avail_in) {
|
if (size && !s.avail_in) {
|
||||||
ssize_t rsize = size < sizeof(ibuf) ? size : sizeof(ibuf);
|
ssize_t rsize = size < sizeof(ibuf) ? size : sizeof(ibuf);
|
||||||
if (read_in_full(fd, ibuf, rsize) != rsize)
|
ssize_t read_result = read_in_full(fd, ibuf, rsize);
|
||||||
|
if (read_result < 0)
|
||||||
|
die_errno("failed to read from '%s'", path);
|
||||||
|
if (read_result != rsize)
|
||||||
die("failed to read %d bytes from '%s'",
|
die("failed to read %d bytes from '%s'",
|
||||||
(int)rsize, path);
|
(int)rsize, path);
|
||||||
offset += rsize;
|
offset += rsize;
|
||||||
|
11
packfile.c
11
packfile.c
@ -444,6 +444,7 @@ static int open_packed_git_1(struct packed_git *p)
|
|||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
unsigned char *idx_sha1;
|
unsigned char *idx_sha1;
|
||||||
long fd_flag;
|
long fd_flag;
|
||||||
|
ssize_t read_result;
|
||||||
|
|
||||||
if (!p->index_data && open_pack_index(p))
|
if (!p->index_data && open_pack_index(p))
|
||||||
return error("packfile %s index unavailable", p->pack_name);
|
return error("packfile %s index unavailable", p->pack_name);
|
||||||
@ -485,7 +486,10 @@ static int open_packed_git_1(struct packed_git *p)
|
|||||||
return error("cannot set FD_CLOEXEC");
|
return error("cannot set FD_CLOEXEC");
|
||||||
|
|
||||||
/* Verify we recognize this pack file format. */
|
/* Verify we recognize this pack file format. */
|
||||||
if (read_in_full(p->pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr))
|
read_result = read_in_full(p->pack_fd, &hdr, sizeof(hdr));
|
||||||
|
if (read_result < 0)
|
||||||
|
return error_errno("error reading from %s", p->pack_name);
|
||||||
|
if (read_result != sizeof(hdr))
|
||||||
return error("file %s is far too short to be a packfile", p->pack_name);
|
return error("file %s is far too short to be a packfile", p->pack_name);
|
||||||
if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
|
if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
|
||||||
return error("file %s is not a GIT packfile", p->pack_name);
|
return error("file %s is not a GIT packfile", p->pack_name);
|
||||||
@ -502,7 +506,10 @@ static int open_packed_git_1(struct packed_git *p)
|
|||||||
p->num_objects);
|
p->num_objects);
|
||||||
if (lseek(p->pack_fd, p->pack_size - sizeof(sha1), SEEK_SET) == -1)
|
if (lseek(p->pack_fd, p->pack_size - sizeof(sha1), SEEK_SET) == -1)
|
||||||
return error("end of packfile %s is unavailable", p->pack_name);
|
return error("end of packfile %s is unavailable", p->pack_name);
|
||||||
if (read_in_full(p->pack_fd, sha1, sizeof(sha1)) != sizeof(sha1))
|
read_result = read_in_full(p->pack_fd, sha1, sizeof(sha1));
|
||||||
|
if (read_result < 0)
|
||||||
|
return error_errno("error reading from %s", p->pack_name);
|
||||||
|
if (read_result != sizeof(sha1))
|
||||||
return error("packfile %s signature is unavailable", p->pack_name);
|
return error("packfile %s signature is unavailable", p->pack_name);
|
||||||
idx_sha1 = ((unsigned char *)p->index_data) + p->index_size - 40;
|
idx_sha1 = ((unsigned char *)p->index_data) + p->index_size - 40;
|
||||||
if (hashcmp(sha1, idx_sha1))
|
if (hashcmp(sha1, idx_sha1))
|
||||||
|
Loading…
Reference in New Issue
Block a user