From 79dd803a930da414ec5af1bf41e36317e601fac7 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Mon, 8 Jun 2009 01:35:00 -0400 Subject: [PATCH] Allocate upkg and private structs in one go. --- src/libupkg.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/libupkg.c b/src/libupkg.c index 850c0c7..66546fd 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -93,31 +93,33 @@ static size_t decode_index(long *val, unsigned char *bytes, size_t n) 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) @@ -351,7 +353,6 @@ err3: free(pkg->priv->names[i].name); free(pkg->priv->names); err2: - free(pkg->priv); free(pkg); err1: fclose(f); @@ -373,7 +374,6 @@ int upkg_close(struct upkg *pkg) free(pkg->priv->imports); free(pkg->priv->exports); free(pkg->priv->names); - free(pkg->priv); free(pkg); return rc; -- 2.43.2