aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPer Øyvind Karlsen <peroyvind@mandriva.org>2010-10-14 17:50:39 +0000
committerPer Øyvind Karlsen <peroyvind@mandriva.org>2010-10-14 17:50:39 +0000
commit673bd0ca312d2377a742ea90daad1a91612a3ab7 (patch)
tree2f6fc2969e526ffefeb5af70f92115a95940e21e
parent8335fdb3731aac574bed89257a1152fb2e395e63 (diff)
downloadperl-URPM-673bd0ca312d2377a742ea90daad1a91612a3ab7.tar
perl-URPM-673bd0ca312d2377a742ea90daad1a91612a3ab7.tar.gz
perl-URPM-673bd0ca312d2377a742ea90daad1a91612a3ab7.tar.bz2
perl-URPM-673bd0ca312d2377a742ea90daad1a91612a3ab7.tar.xz
perl-URPM-673bd0ca312d2377a742ea90daad1a91612a3ab7.zip
fix some memleaks
-rw-r--r--URPM.xs31
1 files changed, 19 insertions, 12 deletions
diff --git a/URPM.xs b/URPM.xs
index 79f7ee0..fed0af4 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -220,11 +220,14 @@ get_name(Header header, rpmTag tag) {
static int
get_int(Header header, rpmTag tag) {
HE_t val = (HE_t)memset(alloca(sizeof(*val)), 0, sizeof(*val));
+ int ret;
val->tag = tag;
headerGet(header, val, 0);
- return (val->t == RPM_UINT32_TYPE) ? val->p.ui32p[val->ix >= 0 ? val->ix : 0] : 0;
+ ret = (val->t == RPM_UINT32_TYPE) ? val->p.ui32p[val->ix >= 0 ? val->ix : 0] : 0;
+ val->p.ui32p = _free(val->p.ui32p);
+ return ret;
}
/* This function might modify strings that needs to be reverted after use
@@ -653,8 +656,7 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) {
case RPM_UINT16_TYPE:
case RPM_UINT32_TYPE:
{
- int *r;
- r = (int *)list;
+ int *r = (int *)list;
for (he->ix=0; he->ix < (int)he->c; he->ix++) {
XPUSHs(sv_2mortal(newSViv(r[he->ix])));
}
@@ -667,9 +669,7 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) {
break;
case RPM_STRING_ARRAY_TYPE:
{
- const char **s;
-
- s = (const char **)list;
+ const char **s = (const char **)list;
for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
XPUSHs(sv_2mortal(newSVpv(s[he->ix], 0)));
}
@@ -680,6 +680,7 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) {
case RPM_UINT64_TYPE:
break;
}
+ list = _free(list);
}
} else {
char *name;
@@ -925,6 +926,7 @@ pack_list(Header header, rpmTag tag_name, rpmTag tag_flags, rpmTag tag_version,
}
if (p > buff) p[-1] = 0;
+ flags = _free(flags);
list = _free(list);
list_evr = _free(list_evr);
}
@@ -938,11 +940,13 @@ pack_header(URPM__Package pkg) {
if (pkg->info == NULL) {
char buff[1024];
char *p = buff;
+ const char *group = get_name(pkg->h, RPMTAG_GROUP);
const char *nvra = get_nvra(pkg->h);
p += 1 + snprintf(buff, sizeof(buff), "%s@%d@%d@%s", nvra,
get_int(pkg->h, RPMTAG_EPOCH), get_int(pkg->h, RPMTAG_SIZE),
- get_name(pkg->h, RPMTAG_GROUP));
+ group);
pkg->info = memcpy(malloc(p-buff), buff, p-buff);
+ _free(group);
_free(nvra);
}
if (pkg->filesize == 0) pkg->filesize = sigsize_to_filesize(get_int(pkg->h, RPMTAG_SIGSIZE));
@@ -961,9 +965,7 @@ pack_header(URPM__Package pkg) {
pkg->provides = pack_list(pkg->h, RPMTAG_PROVIDENAME, RPMTAG_PROVIDEFLAGS, RPMTAG_PROVIDEVERSION, NULL);
if (pkg->summary == NULL) {
const char *summary = get_name(pkg->h, RPMTAG_SUMMARY);
- int len = 1 + strlen(summary);
-
- pkg->summary = memcpy(malloc(len), summary, len);
+ pkg->summary = (char*)summary;
}
if (!(pkg->flag & FLAG_NO_HEADER_FREE)) pkg->h =headerFree(pkg->h);
@@ -1017,6 +1019,7 @@ update_provides(URPM__Package pkg, HV *provides) {
len = strlen(list[he->ix]);
if (list[he->ix][0] == '/') (void)hv_fetch(provides, list[he->ix], len, 1);
}
+ list = _free(list);
}
/* update all provides */
@@ -1031,10 +1034,12 @@ update_provides(URPM__Package pkg, HV *provides) {
}
for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
len = strlen(list[he->ix]);
- if (!strncmp(list[he->ix], "rpmlib(", 7)) continue;
+ if (strncmp(list[he->ix], "rpmlib(", 7)) continue;
update_provide_entry(list[he->ix], len, 1, flags && flags[he->ix] & (RPMSENSE_PREREQ|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_POST|RPMSENSE_LESS|RPMSENSE_EQUAL|RPMSENSE_GREATER),
pkg, provides);
}
+ flags = _free(flags);
+ list = _free(list);
}
} else {
char *ps, *s, *es;
@@ -1135,7 +1140,8 @@ update_provides_files(URPM__Package pkg, HV *provides) {
}
baseNames = _free(baseNames);
- baseNames = _free(dirNames);
+ dirNames = _free(dirNames);
+ dirIndexes = _free(dirIndexes);
} else {
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
@@ -1669,6 +1675,7 @@ Pkg_is_arch_compat__XS(pkg)
const char *arch = get_name(pkg->h, RPMTAG_ARCH);
platform = rpmExpand(arch, "-%{_target_vendor}-%{_target_os}%{?_gnu}", NULL);
RETVAL = rpmPlatformScore(platform, NULL, 0);
+ _free(arch);
_free(platform);
} else {
RETVAL = 0;