projects
/
oweals
/
opkg-lede.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libopkg: fix pkg_deinit() to properly free the resources in the blob buffer
[oweals/opkg-lede.git]
/
libopkg
/
pkg.c
diff --git
a/libopkg/pkg.c
b/libopkg/pkg.c
index 0489c1cc2cb92c2c9b69292df78995a6b1e3e81d..3633a3c932d9e3260517924a3a0528a8371fd85e 100644
(file)
--- a/
libopkg/pkg.c
+++ b/
libopkg/pkg.c
@@
-269,7
+269,10
@@
static void compound_depend_deinit(compound_depend_t * depends)
void pkg_deinit(pkg_t * pkg)
{
void pkg_deinit(pkg_t * pkg)
{
+ int rem;
+ struct blob_attr *cur;
compound_depend_t *deps, *dep;
compound_depend_t *deps, *dep;
+ void *ptr;
if (pkg->name)
free(pkg->name);
if (pkg->name)
free(pkg->name);
@@
-284,24
+287,43
@@
void pkg_deinit(pkg_t * pkg)
pkg->state_flag = SF_OK;
pkg->state_status = SS_NOT_INSTALLED;
pkg->state_flag = SF_OK;
pkg->state_status = SS_NOT_INSTALLED;
- deps = pkg_get_ptr(pkg, PKG_DEPENDS);
+ blob_for_each_attr(cur, pkg->blob.head, rem) {
+ switch (blob_id(cur)) {
+ case PKG_DEPENDS:
+ case PKG_CONFLICTS:
+ deps = pkg_get_ptr(pkg, blob_id(cur));
+
+ if (deps) {
+ for (dep = deps; dep->type; dep++)
+ compound_depend_deinit(dep);
- if (deps) {
- for (dep = deps; dep->type; dep++)
- compound_depend_deinit(dep);
+ free(deps);
+ }
- free(deps);
- pkg_set_ptr(pkg, PKG_DEPENDS, NULL);
- }
+ pkg_set_ptr(pkg, blob_id(cur), NULL);
+ break;
- deps = pkg_get_ptr(pkg, PKG_CONFLICTS);
+ case PKG_REPLACES:
+ case PKG_PROVIDES:
+ ptr = pkg_get_ptr(pkg, blob_id(cur));
- if (deps) {
- for (dep = deps; dep->type; dep++)
- compound_depend_deinit(dep);
+ if (ptr)
+ free(ptr);
- free(deps);
- pkg_set_ptr(pkg, PKG_CONFLICTS, NULL);
+ pkg_set_ptr(pkg, blob_id(cur), NULL);
+ break;
+
+ case PKG_CONFFILES:
+ ptr = pkg_get_ptr(pkg, blob_id(cur));
+
+ if (ptr) {
+ conffile_list_deinit(ptr);
+ free(ptr);
+ }
+
+ pkg_set_ptr(pkg, blob_id(cur), NULL);
+ break;
+ }
}
//conffile_list_deinit(&pkg->conffiles);
}
//conffile_list_deinit(&pkg->conffiles);
@@
-313,7
+335,7
@@
void pkg_deinit(pkg_t * pkg)
pkg_free_installed_files(pkg);
pkg->essential = 0;
pkg_free_installed_files(pkg);
pkg->essential = 0;
-
//
blob_buf_free(&pkg->blob);
+ blob_buf_free(&pkg->blob);
}
int pkg_init_from_file(pkg_t * pkg, const char *filename)
}
int pkg_init_from_file(pkg_t * pkg, const char *filename)
@@
-407,6
+429,9
@@
int pkg_merge(pkg_t * oldpkg, pkg_t * newpkg)
if (!ab || !ab[0] || !ab[1]) {
pkg_set_ptr(oldpkg, PKG_PROVIDES, pkg_get_ptr(newpkg, PKG_PROVIDES));
pkg_set_ptr(newpkg, PKG_PROVIDES, NULL);
if (!ab || !ab[0] || !ab[1]) {
pkg_set_ptr(oldpkg, PKG_PROVIDES, pkg_get_ptr(newpkg, PKG_PROVIDES));
pkg_set_ptr(newpkg, PKG_PROVIDES, NULL);
+
+ if (ab)
+ free(ab);
}
if (!pkg_get_ptr(oldpkg, PKG_CONFLICTS)) {
}
if (!pkg_get_ptr(oldpkg, PKG_CONFLICTS)) {