+ meta_offset = get_position(f);
+ ret = read_int32(f, &meta_size);
+ if (ret <= 0)
+ return NULL;
+ /* shouldn't happen, find_atom_v2 above takes care of it */
+ if (!find_atom(f, meta_offset + 12, meta_size - 12, "ilst"))
+ return NULL;
+ ilst_offset = get_position(f);
+ ret = read_int32(f, &ilst_size);
+ if (ret <= 0)
+ return NULL;
+ if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size))
+ return NULL;
+ size_delta = new_ilst_size - (ilst_size - 8);
+ *out_size = total_size + size_delta;
+ out_buffer = para_malloc(*out_size);
+ p_out = out_buffer;
+ set_position(f, total_base);
+ ret = read_data(f, p_out, udta_offset - total_base);
+ if (ret <= 0)
+ return NULL;
+ p_out += (uint32_t) (udta_offset - total_base);
+ ret = read_int32(f, &tmp);
+ if (ret <= 0)
+ return NULL;
+ *(uint32_t *)p_out = fix_byte_order_32(tmp + size_delta);
+ p_out += 4;
+ ret = read_data(f, p_out, 4);
+ if (ret <= 0)
+ return NULL;
+ p_out += 4;
+ ret = read_data(f, p_out, meta_offset - udta_offset - 8);
+ if (ret <= 0)
+ return NULL;
+ p_out += (uint32_t) (meta_offset - udta_offset - 8);
+ ret = read_int32(f, &tmp);
+ if (ret <= 0)
+ return NULL;
+ *(uint32_t *)p_out = fix_byte_order_32(tmp + size_delta);
+ p_out += 4;
+ ret = read_data(f, p_out, 4);
+ if (ret <= 0)
+ return NULL;
+ p_out += 4;
+ ret = read_data(f, p_out, ilst_offset - meta_offset - 8);
+ if (ret <= 0)
+ return NULL;
+ p_out += (uint32_t) (ilst_offset - meta_offset - 8);
+ ret = read_int32(f, &tmp);
+ if (ret <= 0)
+ return NULL;
+ *(uint32_t *)p_out = fix_byte_order_32(tmp + size_delta);
+ p_out += 4;
+ ret = read_data(f, p_out, 4);
+ if (ret <= 0)
+ return NULL;
+ p_out += 4;
+ memcpy(p_out, new_ilst_buffer, new_ilst_size);
+ p_out += new_ilst_size;
+ set_position(f, ilst_offset + ilst_size);
+ ret = read_data(f, p_out, total_size
+ - (ilst_offset - total_base) - ilst_size);
+ if (ret <= 0)
+ return NULL;
+ free(new_ilst_buffer);
+ return out_buffer;