static struct upkg *init_upkg(unsigned char hdr[static UPKG_HDR_SIZE])
{
- struct upkg *pkg;
-
- pkg = malloc(sizeof *pkg);
- if (!pkg) {
- return NULL;
- }
+ struct {
+ struct upkg pkg;
+ struct upkg_private priv;
+ } *alloc;
- pkg->priv = malloc(sizeof *pkg->priv);
- if (!pkg->priv) {
- free(pkg);
+ alloc = malloc(sizeof *alloc);
+ if (!alloc) {
return NULL;
}
- pkg->version = unpack_16_le(hdr+4);
- pkg->license = unpack_16_le(hdr+6);
- pkg->flags = unpack_32_le(hdr+8);
- pkg->name_count = unpack_32_le(hdr+12);
- pkg->export_count = unpack_32_le(hdr+20);
- pkg->import_count = unpack_32_le(hdr+28);
-
- pkg->priv->name_offset = unpack_32_le(hdr+16);
- pkg->priv->export_offset = unpack_32_le(hdr+24);
- pkg->priv->import_offset = unpack_32_le(hdr+32);
-
- return pkg;
+ alloc->pkg = (struct upkg) {
+ .version = unpack_16_le(hdr+4),
+ .license = unpack_16_le(hdr+6),
+ .flags = unpack_32_le(hdr+8),
+ .name_count = unpack_32_le(hdr+12),
+ .export_count = unpack_32_le(hdr+20),
+ .import_count = unpack_32_le(hdr+28),
+ .priv = &alloc->priv,
+ };
+
+ alloc->priv = (struct upkg_private) {
+ .name_offset = unpack_32_le(hdr+16),
+ .export_offset = unpack_32_le(hdr+24),
+ .import_offset = unpack_32_le(hdr+32),
+ };
+
+ return &alloc->pkg;
}
static int pkg_init_names(struct upkg *pkg)
free(pkg->priv->names[i].name);
free(pkg->priv->names);
err2:
- free(pkg->priv);
free(pkg);
err1:
fclose(f);
free(pkg->priv->imports);
free(pkg->priv->exports);
free(pkg->priv->names);
- free(pkg->priv);
free(pkg);
return rc;