static void use(int bytes) { if (bytes > len) die("used more bytes than were available"); len -= bytes; offset += bytes; /* make sure off_t is sufficiently large not to wrap */ if (signed_add_overflows(consumed_bytes, bytes)) die("pack too large for current definition of off_t"); consumed_bytes += bytes; }
static void use(int bytes) { if (bytes > input_len) die(_("used more bytes than were available")); input_crc32 = crc32(input_crc32, input_buffer + input_offset, bytes); input_len -= bytes; input_offset += bytes; /* make sure off_t is sufficiently large not to wrap */ if (signed_add_overflows(consumed_bytes, bytes)) die(_("pack too large for current definition of off_t")); consumed_bytes += bytes; }
static void use(int bytes) { if (bytes > len) die("used more bytes than were available"); len -= bytes; offset += bytes; /* make sure off_t is sufficiently large not to wrap */ if (signed_add_overflows(consumed_bytes, bytes)) die("pack too large for current definition of off_t"); consumed_bytes += bytes; if (max_input_size && consumed_bytes > max_input_size) die(_("pack exceeds maximum allowed size")); }
static int check_offset_overflow(off_t offset, uintmax_t len) { #if 0 if (len > maximum_signed_value_of_type(off_t)) return error("unrepresentable length in delta: " "%"PRIuMAX" > OFF_MAX", len); if (signed_add_overflows(offset, (off_t) len)) return error("unrepresentable offset in delta: " "%"PRIuMAX" + %"PRIuMAX" > OFF_MAX", (uintmax_t) offset, len); #endif if (offset > (INT64_MAX/2) || len > (INT64_MAX/2)) { printf("Overflow or close enough.\n"); return -1; } return 0; }
static long apply_delta(off_t len, struct line_buffer *input, const char *old_data, uint32_t old_mode) { long ret; struct sliding_view preimage = SLIDING_VIEW_INIT(&report_buffer, 0); FILE *out; if (init_postimage() || !(out = buffer_tmpfile_rewind(&postimage))) die("cannot open temporary file for blob retrieval"); if (old_data) { const char *response; printf("cat-blob %s\n", old_data); fflush(stdout); response = get_response_line(); if (parse_cat_response_line(response, &preimage.max_off)) die("invalid cat-blob response: %s", response); check_preimage_overflow(preimage.max_off, 1); } if (old_mode == REPO_MODE_LNK) { strbuf_addstr(&preimage.buf, "link "); check_preimage_overflow(preimage.max_off, strlen("link ")); preimage.max_off += strlen("link "); check_preimage_overflow(preimage.max_off, 1); } if (svndiff0_apply(input, len, &preimage, out)) die("cannot apply delta"); if (old_data) { /* Read the remainder of preimage and trailing newline. */ assert(!signed_add_overflows(preimage.max_off, 1)); preimage.max_off++; /* room for newline */ if (move_window(&preimage, preimage.max_off - 1, 1)) die("cannot seek to end of input"); if (preimage.buf.buf[0] != '\n') die("missing newline after cat-blob response"); } ret = buffer_tmpfile_prepare_to_read(&postimage); if (ret < 0) die("cannot read temporary file for blob retrieval"); strbuf_release(&preimage.buf); return ret; }
static void check_preimage_overflow(off_t a, off_t b) { if (signed_add_overflows(a, b)) die("blob too large for current definition of off_t"); }