return 0;
}
-static int check_overflow(off_t a, size_t b)
+static int check_offset_overflow(off_t offset, uintmax_t len)
{
- if (b > maximum_signed_value_of_type(off_t))
+ if (len > maximum_signed_value_of_type(off_t))
return error("unrepresentable length in delta: "
- "%"PRIuMAX" > OFF_MAX", (uintmax_t) b);
- if (signed_add_overflows(a, (off_t) b))
+ "%"PRIuMAX" > OFF_MAX", len);
+ if (signed_add_overflows(offset, (off_t) len))
return error("unrepresentable offset in delta: "
"%"PRIuMAX" + %"PRIuMAX" > OFF_MAX",
- (uintmax_t) a, (uintmax_t) b);
+ (uintmax_t) offset, len);
return 0;
}
off_t file_offset;
assert(view);
assert(view->width <= view->buf.len);
- assert(!check_overflow(view->off, view->buf.len));
+ assert(!check_offset_overflow(view->off, view->buf.len));
- if (check_overflow(off, width))
+ if (check_offset_overflow(off, width))
return -1;
if (off < view->off || off + width < view->off + view->width)
return error("invalid delta: window slides left");
+ if (view->max_off >= 0 && view->max_off < off + width)
+ return error("delta preimage ends early");
file_offset = view->off + view->buf.len;
if (off < file_offset) {