diff options
author | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2010-10-14 17:50:39 +0000 |
---|---|---|
committer | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2010-10-14 17:50:39 +0000 |
commit | 673bd0ca312d2377a742ea90daad1a91612a3ab7 (patch) | |
tree | 2f6fc2969e526ffefeb5af70f92115a95940e21e | |
parent | 8335fdb3731aac574bed89257a1152fb2e395e63 (diff) | |
download | perl-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.xs | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -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; |