wsize = size + (offset - woffset);
wsize = PAGE_ALIGN(wsize);
+ /* Avoid SIGBUS on invalid accesses */
+ if (woffset + wsize > (uint64_t) PAGE_ALIGN(f->last_stat.st_size))
+ return -EADDRNOTAVAIL;
+
window = mmap(NULL, wsize, f->prot, MAP_SHARED, f->fd, woffset);
if (window == MAP_FAILED)
return -errno;
} else
delta = 0;
+ if (offset > (uint64_t) f->last_stat.st_size)
+ return -EADDRNOTAVAIL;
+
+ if (offset + size > (uint64_t) f->last_stat.st_size)
+ size = PAGE_ALIGN((uint64_t) f->last_stat.st_size - offset);
+
+ if (size <= 0)
+ return -EADDRNOTAVAIL;
+
r = journal_file_map(f,
offset, size,
&w->ptr, &w->offset, &w->size,
return r;
if (le64toh(o->data.hash) != hash)
- return -EBADMSG;
+ goto next;
if (o->object.flags & OBJECT_COMPRESSED) {
#ifdef HAVE_XZ
return 1;
}
+ next:
p = le64toh(o->data.next_hash_offset);
}
/* This bisects the array in object 'first', but first checks
* an extra */
-
r = test_object(f, extra, needle);
if (r < 0)
return r;
if (offset)
*offset = extra;
+
+ if (idx)
+ *idx = 0;
+
+ return 1;
} else if (r == TEST_RIGHT)
return 0;