return NULL;
/* We have all the information we need about the next archive member.
- Now create a descriptor for it. */
- result = read_file (fildes, ref->state.ar.offset + sizeof (struct ar_hdr),
- ref->state.ar.elf_ar_hdr.ar_size, cmd, ref);
+ Now create a descriptor for it. Check parent size can contain member. */
+ size_t max_size = ref->maximum_size;
+ size_t offset = (size_t) ref->state.ar.offset;
+ size_t hdr_size = sizeof (struct ar_hdr);
+ size_t ar_size = (size_t) ref->state.ar.elf_ar_hdr.ar_size;
+ if (max_size - hdr_size < offset)
+ return NULL;
+ else
+ result = read_file (fildes, ref->state.ar.offset + sizeof (struct ar_hdr),
+ MIN (max_size - hdr_size - offset, ar_size), cmd, ref);
if (result != NULL)
{