commit 9069347b693ed2803ca224d77823b2e4e2f2e4e5 from: Stefan Sperling date: Thu May 20 09:58:35 2021 UTC improve error reporting when delta application fails commit - e5ad73651d7663bfc6ca5d6f3ec622c5f59413bf commit + 9069347b693ed2803ca224d77823b2e4e2f2e4e5 blob - d26165918de1c2cf191ee734e77336fd67356f58 blob + e3ee8c6f3ea1981934a38c2f4bd9e01e43d62c15 --- lib/delta.c +++ lib/delta.c @@ -80,7 +80,8 @@ static const struct got_error * next_delta_byte(const uint8_t **p, size_t *remain) { if (--(*remain) == 0) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, + "delta data truncated"); (*p)++; return NULL; } @@ -206,7 +207,8 @@ copy_from_delta(const uint8_t **p, size_t *remain, siz size_t n; if (*remain < len) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, + "copy from beyond end of delta data"); n = fwrite(*p, len, 1, outfile); if (n != 1) @@ -245,7 +247,7 @@ got_delta_get_sizes(uint64_t *base_size, uint64_t *res const uint8_t *p; if (delta_len < GOT_DELTA_STREAM_LENGTH_MIN) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, "delta too small"); p = delta_buf; remain = delta_len; @@ -265,7 +267,7 @@ got_delta_apply_in_mem(uint8_t *base_buf, size_t base_ *outsize= 0; if (delta_len < GOT_DELTA_STREAM_LENGTH_MIN) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, "delta too small"); p = delta_buf; remain = delta_len; @@ -285,7 +287,8 @@ got_delta_apply_in_mem(uint8_t *base_buf, size_t base_ if (SIZE_MAX - offset < len || offset + len < 0 || base_bufsz < offset + len || *outsize + len > maxoutsize) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, + "bad delta copy length"); memcpy(outbuf + *outsize, base_buf + offset, len); if (err == NULL) { *outsize += len; @@ -297,7 +300,8 @@ got_delta_apply_in_mem(uint8_t *base_buf, size_t base_ } else { size_t len = (size_t)*p; if (len == 0) { - err = got_error(GOT_ERR_BAD_DELTA); + err = got_error_msg(GOT_ERR_BAD_DELTA, + "zero length delta"); break; } err = next_delta_byte(&p, &remain); @@ -305,7 +309,8 @@ got_delta_apply_in_mem(uint8_t *base_buf, size_t base_ break; if (remain < len || SIZE_MAX - *outsize < len || *outsize + len > maxoutsize) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, + "bad delta copy length"); memcpy(outbuf + *outsize, p, len); p += len; remain -= len; @@ -314,7 +319,8 @@ got_delta_apply_in_mem(uint8_t *base_buf, size_t base_ } if (*outsize != result_size) - err = got_error(GOT_ERR_BAD_DELTA); + err = got_error_msg(GOT_ERR_BAD_DELTA, + "delta application result size mismatch"); return err; } @@ -333,7 +339,7 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_ *outsize = 0; if (delta_len < GOT_DELTA_STREAM_LENGTH_MIN) - return got_error(GOT_ERR_BAD_DELTA); + return got_error_msg(GOT_ERR_BAD_DELTA, "delta too small"); p = delta_buf; remain = delta_len; @@ -365,7 +371,8 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_ } else { size_t len = (size_t)*p; if (len == 0) { - err = got_error(GOT_ERR_BAD_DELTA); + err = got_error_msg(GOT_ERR_BAD_DELTA, + "zero length delta"); break; } err = next_delta_byte(&p, &remain); @@ -379,7 +386,8 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_ } if (*outsize != result_size) - err = got_error(GOT_ERR_BAD_DELTA); + err = got_error_msg(GOT_ERR_BAD_DELTA, + "delta application result size mismatch"); if (memstream != NULL) { if (fclose(memstream) == EOF)