From 6e59ec90af245ddf2d2534981fa0eb7804a8686d Mon Sep 17 00:00:00 2001 From: "graham.gower" Date: Tue, 10 Nov 2009 05:00:45 +0000 Subject: [PATCH] Remove the assumption that pkg fields have been allocated and need free()ing. git-svn-id: http://opkg.googlecode.com/svn/trunk@276 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- libopkg/pkg.c | 240 +++++++++++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 101 deletions(-) diff --git a/libopkg/pkg.c b/libopkg/pkg.c index 7f7a5f3..3b1f21b 100644 --- a/libopkg/pkg.c +++ b/libopkg/pkg.c @@ -158,123 +158,161 @@ void compound_depend_deinit (compound_depend_t *depends) void pkg_deinit(pkg_t *pkg) { - int i; + int i; - free(pkg->name); - pkg->name = NULL; - pkg->epoch = 0; - free(pkg->version); - pkg->version = NULL; - /* revision shares storage with version, so - don't free */ - pkg->revision = NULL; - /* owned by opkg_conf_t */ - pkg->dest = NULL; - /* owned by opkg_conf_t */ - pkg->src = NULL; - free(pkg->architecture); - pkg->architecture = NULL; - free(pkg->maintainer); - pkg->maintainer = NULL; - free(pkg->section); - pkg->section = NULL; - free(pkg->description); - pkg->description = NULL; - pkg->state_want = SW_UNKNOWN; - pkg->state_flag = SF_OK; - pkg->state_status = SS_NOT_INSTALLED; + if (pkg->name) + free(pkg->name); + pkg->name = NULL; - active_list_clear(&pkg->list); + pkg->epoch = 0; - free (pkg->replaces); - pkg->replaces = NULL; - - for (i = 0; i < pkg->depends_count; i++) - free (pkg->depends_str[i]); - free(pkg->depends_str); - pkg->depends_str = NULL; + if (pkg->version) + free(pkg->version); + pkg->version = NULL; + /* revision shares storage with version, so don't free */ + pkg->revision = NULL; - for (i = 0; i < pkg->provides_count; i++) - free (pkg->provides_str[i]); - free(pkg->provides_str); - pkg->provides_str = NULL; + /* owned by opkg_conf_t */ + pkg->dest = NULL; + /* owned by opkg_conf_t */ + pkg->src = NULL; - for (i = 0; i < pkg->conflicts_count; i++) - free (pkg->conflicts_str[i]); - free(pkg->conflicts_str); - pkg->conflicts_str = NULL; + if (pkg->architecture) + free(pkg->architecture); + pkg->architecture = NULL; - for (i = 0; i < pkg->replaces_count; i++) - free (pkg->replaces_str[i]); - free(pkg->replaces_str); - pkg->replaces_str = NULL; + if (pkg->maintainer) + free(pkg->maintainer); + pkg->maintainer = NULL; - for (i = 0; i < pkg->recommends_count; i++) - free (pkg->recommends_str[i]); - free(pkg->recommends_str); - pkg->recommends_str = NULL; - - for (i = 0; i < pkg->suggests_count; i++) - free (pkg->suggests_str[i]); - free(pkg->suggests_str); - pkg->suggests_str = NULL; - - if (pkg->depends) - { - int count = pkg->pre_depends_count + pkg->depends_count + pkg->recommends_count + pkg->suggests_count; - int x; - - for (x = 0; x < count; x++) - compound_depend_deinit (&pkg->depends[x]); - free (pkg->depends); - } - - if (pkg->conflicts) - { - int x; - for (x = 0; x < pkg->conflicts_count; x++) - compound_depend_deinit (&pkg->conflicts[x]); - free (pkg->conflicts); - } + if (pkg->section) + free(pkg->section); + pkg->section = NULL; - free (pkg->provides); + if (pkg->description) + free(pkg->description); + pkg->description = NULL; + + pkg->state_want = SW_UNKNOWN; + pkg->state_flag = SF_OK; + pkg->state_status = SS_NOT_INSTALLED; + + active_list_clear(&pkg->list); + + if (pkg->replaces) + free (pkg->replaces); + pkg->replaces = NULL; + + for (i = 0; i < pkg->depends_count; i++) + free (pkg->depends_str[i]); + free(pkg->depends_str); + pkg->depends_str = NULL; + + for (i = 0; i < pkg->provides_count-1; i++) + free (pkg->provides_str[i]); + free(pkg->provides_str); + pkg->provides_str = NULL; + + for (i = 0; i < pkg->conflicts_count; i++) + free (pkg->conflicts_str[i]); + free(pkg->conflicts_str); + pkg->conflicts_str = NULL; + + for (i = 0; i < pkg->replaces_count; i++) + free (pkg->replaces_str[i]); + free(pkg->replaces_str); + pkg->replaces_str = NULL; + + for (i = 0; i < pkg->recommends_count; i++) + free (pkg->recommends_str[i]); + free(pkg->recommends_str); + pkg->recommends_str = NULL; + + for (i = 0; i < pkg->suggests_count; i++) + free (pkg->suggests_str[i]); + free(pkg->suggests_str); + pkg->suggests_str = NULL; + + if (pkg->depends) { + int count = pkg->pre_depends_count + + pkg->depends_count + + pkg->recommends_count + + pkg->suggests_count; + + for (i=0; idepends[i]); + free (pkg->depends); + } + + if (pkg->conflicts) { + for (i=0; iconflicts_count; i++) + compound_depend_deinit (&pkg->conflicts[i]); + free (pkg->conflicts); + } + + if (pkg->provides) + free (pkg->provides); + + pkg->pre_depends_count = 0; + if (pkg->pre_depends_str) + free(pkg->pre_depends_str); + pkg->pre_depends_str = NULL; + + pkg->provides_count = 0; + + if (pkg->filename) + free(pkg->filename); + pkg->filename = NULL; + + if (pkg->local_filename) + free(pkg->local_filename); + pkg->local_filename = NULL; - pkg->pre_depends_count = 0; - free(pkg->pre_depends_str); - pkg->pre_depends_str = NULL; - pkg->provides_count = 0; - free(pkg->filename); - pkg->filename = NULL; - free(pkg->local_filename); - pkg->local_filename = NULL; /* CLEANUP: It'd be nice to pullin the cleanup function from opkg_install.c here. See comment in opkg_install.c:cleanup_temporary_files */ - free(pkg->tmp_unpack_dir); - pkg->tmp_unpack_dir = NULL; - free(pkg->md5sum); - pkg->md5sum = NULL; + if (pkg->tmp_unpack_dir) + free(pkg->tmp_unpack_dir); + pkg->tmp_unpack_dir = NULL; + + if (pkg->md5sum) + free(pkg->md5sum); + pkg->md5sum = NULL; + #if defined HAVE_SHA256 - free(pkg->sha256sum); - pkg->sha256sum = NULL; + if (pkg->sha256sum) + free(pkg->sha256sum); + pkg->sha256sum = NULL; #endif - free(pkg->size); - pkg->size = NULL; - free(pkg->installed_size); - pkg->installed_size = NULL; - free(pkg->priority); - pkg->priority = NULL; - free(pkg->source); - pkg->source = NULL; - conffile_list_deinit(&pkg->conffiles); - /* XXX: QUESTION: Is forcing this to 1 correct? I suppose so, + + if (pkg->size) + free(pkg->size); + pkg->size = NULL; + + if (pkg->installed_size) + free(pkg->installed_size); + pkg->installed_size = NULL; + + if (pkg->priority) + free(pkg->priority); + pkg->priority = NULL; + + if (pkg->source) + free(pkg->source); + pkg->source = NULL; + + conffile_list_deinit(&pkg->conffiles); + + /* XXX: QUESTION: Is forcing this to 1 correct? I suppose so, since if they are calling deinit, they should know. Maybe do an assertion here instead? */ - pkg->installed_files_ref_cnt = 1; - pkg_free_installed_files(pkg); - pkg->essential = 0; - free (pkg->tags); - pkg->tags = NULL; + pkg->installed_files_ref_cnt = 1; + pkg_free_installed_files(pkg); + pkg->essential = 0; + + if (pkg->tags) + free (pkg->tags); + pkg->tags = NULL; } int pkg_init_from_file(pkg_t *pkg, const char *filename) -- 2.25.1