for (bin_attr = sect_attrs->grp.bin_attrs; *bin_attr; bin_attr++)
                kfree((*bin_attr)->attr.name);
+       kfree(sect_attrs->grp.bin_attrs);
        kfree(sect_attrs);
 }
 
 static int add_sect_attrs(struct module *mod, const struct load_info *info)
 {
-       unsigned int nloaded = 0, i, size[2];
        struct module_sect_attrs *sect_attrs;
        struct bin_attribute **gattr;
        struct bin_attribute *sattr;
+       unsigned int nloaded = 0, i;
        int ret;
 
        /* Count loaded sections and allocate structures */
        for (i = 0; i < info->hdr->e_shnum; i++)
                if (!sect_empty(&info->sechdrs[i]))
                        nloaded++;
-       size[0] = ALIGN(struct_size(sect_attrs, attrs, nloaded),
-                       sizeof(sect_attrs->grp.bin_attrs[0]));
-       size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
-       sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
+       sect_attrs = kzalloc(struct_size(sect_attrs, attrs, nloaded), GFP_KERNEL);
        if (!sect_attrs)
                return -ENOMEM;
 
+       gattr = kcalloc(nloaded + 1, sizeof(*gattr), GFP_KERNEL);
+       if (!gattr) {
+               kfree(sect_attrs);
+               return -ENOMEM;
+       }
+
        /* Setup section attributes. */
        sect_attrs->grp.name = "sections";
-       sect_attrs->grp.bin_attrs = (void *)sect_attrs + size[0];
+       sect_attrs->grp.bin_attrs = gattr;
 
        sattr = §_attrs->attrs[0];
-       gattr = §_attrs->grp.bin_attrs[0];
        for (i = 0; i < info->hdr->e_shnum; i++) {
                Elf_Shdr *sec = &info->sechdrs[i];
 
                sattr->attr.mode = 0400;
                *(gattr++) = sattr++;
        }
-       *gattr = NULL;
 
        ret = sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp);
        if (ret)