Skip to content

Commit

Permalink
Prevent attempt to read beyond end of device
Browse files Browse the repository at this point in the history
Closes #48
  • Loading branch information
baruch committed Nov 4, 2015
1 parent 55d6112 commit f8a3746
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions lib/diskscan.c
Expand Up @@ -618,21 +618,23 @@ static void progress_calc(disk_t *disk, struct scan_state *state, uint64_t add)
static bool disk_scan_latency_stride(disk_t *disk, struct scan_state *state, uint64_t base_offset, uint64_t data_size, uint32_t *scan_order)
{
unsigned i;
uint64_t stride_end = base_offset + state->latency_stride * disk->sector_size;
if (stride_end > disk->num_bytes)
stride_end = disk->num_bytes;

for (i = 0; disk->run && scan_order[i] != UINT32_MAX; i++) {
uint64_t offset = base_offset + scan_order[i];

progress_calc(disk, state, data_size);

VVVERBOSE("Scanning at offset %"PRIu64" index %u", offset, i);
uint64_t stride_end = base_offset + state->latency_stride * disk->sector_size;
if (stride_end > disk->num_bytes)
stride_end = disk->num_bytes;
uint64_t remainder = stride_end - offset;
if (remainder < data_size) {
int64_t remainder = stride_end - offset;
if (remainder < (int64_t)data_size) {
data_size = remainder;
VERBOSE("Last part scanning size %"PRIu64, data_size);
}
if (offset > disk->num_bytes || (offset+remainder) > disk->num_bytes)
continue;
if (!disk_scan_part(disk, offset, state->data, data_size, state))
return false;
}
Expand Down

0 comments on commit f8a3746

Please sign in to comment.