zip_int64_t _zip_add_entry(zip_t *za) { zip_uint64_t idx; if (za->nentry+1 >= za->nentry_alloc) { zip_entry_t *rentries; zip_uint64_t nalloc = za->nentry_alloc; zip_uint64_t additional_entries = 2 * nalloc; zip_uint64_t realloc_size; if (additional_entries < 16) { additional_entries = 16; } else if (additional_entries > 1024) { additional_entries = 1024; } /* neither + nor * overflows can happen: nentry_alloc * sizeof(struct zip_entry) < UINT64_MAX */ nalloc += additional_entries; realloc_size = sizeof(struct zip_entry) * (size_t)nalloc; if (sizeof(struct zip_entry) * (size_t)za->nentry_alloc > realloc_size) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } rentries = (zip_entry_t *)realloc(za->entry, sizeof(struct zip_entry) * (size_t)nalloc); if (!rentries) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } za->entry = rentries; za->nentry_alloc = nalloc; } idx = za->nentry++; _zip_entry_init(za->entry+idx); return (zip_int64_t)idx; }
zip_int64_t _zip_add_entry(struct zip *za) { zip_uint64_t idx; if (za->nentry+1 >= za->nentry_alloc) { struct zip_entry *rentries; zip_uint64_t nalloc = za->nentry_alloc + 16; rentries = (struct zip_entry *)realloc(za->entry, sizeof(struct zip_entry) * nalloc); if (!rentries) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } za->entry = rentries; za->nentry_alloc = nalloc; } idx = za->nentry++; _zip_entry_init(za->entry+idx); return (zip_int64_t)idx; }