diff options
author | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2011-01-24 01:35:26 +0000 |
---|---|---|
committer | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2011-01-24 01:35:26 +0000 |
commit | cd0dd955e9d717c36ff11bdd425c92e9a94ce491 (patch) | |
tree | d657236a7f85746bb55efb920c1b84f8848873f0 | |
parent | 7a1561f6471f67a469c73e32c0856cc486ced812 (diff) | |
download | perl-URPM-cd0dd955e9d717c36ff11bdd425c92e9a94ce491.tar perl-URPM-cd0dd955e9d717c36ff11bdd425c92e9a94ce491.tar.gz perl-URPM-cd0dd955e9d717c36ff11bdd425c92e9a94ce491.tar.bz2 perl-URPM-cd0dd955e9d717c36ff11bdd425c92e9a94ce491.tar.xz perl-URPM-cd0dd955e9d717c36ff11bdd425c92e9a94ce491.zip |
always allocate evr returned from get_evr() on the heap..
-rw-r--r-- | URPM.xs | 31 | ||||
-rw-r--r-- | URPM/Resolve.pm | 5 |
2 files changed, 22 insertions, 14 deletions
@@ -405,7 +405,7 @@ get_evr(URPM__Package pkg) { restore_chars(); tmp = pkg->provides; if(!strncmp(pkg->provides, needle+1, namelen+1)) { - tmp = evr = pkg->provides; + evr = (const char*)pkg->provides; } while(tmp && (tmp = strstr(tmp, needle))) { if(evr && (tmp3 = strchr(evr, '@'))) @@ -426,12 +426,14 @@ get_evr(URPM__Package pkg) { tmp = strchr(++evr, ']'); if(tmp) backup_char(tmp); + evr = strdup(evr); + restore_chars(); } } else if(pkg->h) { HE_t val = (HE_t)memset(alloca(sizeof(*val)), 0, sizeof(*val)); val->tag = RPMTAG_PROVIDEVERSION; headerGet(pkg->h, val, 0); - evr = val->p.argv[val->c-1]; + evr = (const char*)val->p.argv[val->c-1]; } return evr; } @@ -1910,7 +1912,7 @@ Pkg_evr(pkg) PPCODE: evr = get_evr(pkg); XPUSHs(sv_2mortal(newSVpv(evr, 0))); - restore_chars(); + _free(evr); void Pkg_fullname(pkg) @@ -1966,20 +1968,19 @@ Pkg_compare_pkg(lpkg, rpkg) char *larch; char *revr; char *rarch; - char *tmp; CODE: if (lpkg == rpkg) RETVAL = 0; else { - tmp = (char*)get_evr(lpkg); - levr = alloca(strlen(tmp)); - stpcpy(levr, tmp); + levr = (char*)get_evr(lpkg); revr = (char*)get_evr(rpkg); if(levr == NULL || revr == NULL) { - restore_chars(); + _free(levr); + _free(revr); croak("undefined package"); } compare = do_rpmEVRcompare(levr, revr); - restore_chars(); + _free(levr); + _free(revr); if (!compare) { int lscore, rscore; char *platform = NULL; @@ -2021,10 +2022,11 @@ Pkg_compare_pkg(lpkg, rpkg) RETVAL int -Pkg_compare(pkg, evr) +Pkg_compare(pkg, revr) URPM::Package pkg - char *evr + const char *revr PREINIT: + const char *levr = NULL; int compare = 0; EVR_t lEVR = rpmEVRnew(RPMSENSE_EQUAL, 0), rEVR = rpmEVRnew(RPMSENSE_EQUAL, 0); @@ -2036,9 +2038,9 @@ Pkg_compare(pkg, evr) * so that ie. if only version is given as an argument, it won't compare * release etc. */ - rpmEVRparse(get_evr(pkg), lEVR); - restore_chars(); - rpmEVRparse(evr, rEVR); + levr = get_evr(pkg); + rpmEVRparse(levr, lEVR); + rpmEVRparse(revr, rEVR); for(i = RPMEVR_V; i <= RPMEVR_D; i++) if(!*(rEVR->F[i])) lEVR->F[i] = ""; @@ -2046,6 +2048,7 @@ Pkg_compare(pkg, evr) compare = rpmEVRcompare(lEVR, rEVR); rpmEVRfree(lEVR); rpmEVRfree(rEVR); + _free(levr); } RETVAL = compare; OUTPUT: diff --git a/URPM/Resolve.pm b/URPM/Resolve.pm index 31b9aab..b7b676e 100644 --- a/URPM/Resolve.pm +++ b/URPM/Resolve.pm @@ -1375,8 +1375,10 @@ sub _set_flag_installed_and_upgrade_if_no_newer { my $upgrade = 1; $db->traverse_tag('name', [ $pkg->name ], sub { my ($p) = @_; + print "P: " . $pkg->fullname . ":\t"; $pkg->set_flag_installed; $upgrade &&= $pkg->compare_pkg($p) > 0; + print $p->fullname . " = " . $pkg->compare_pkg($p) . "\n\n\n\n\n"; }); $pkg->set_flag_upgrade($upgrade); } @@ -1387,10 +1389,13 @@ sub _no_more_recent_installed_and_providing { my ($urpm, $db, $state, $pkg, $required) = @_; my $allow = 1; + print "name: " . $pkg->name . "\n"; $db->traverse_tag('name', [ $pkg->name ], sub { my ($p) = @_; + print "\n\n\n\t $p\n\n\n"; #- allow if a less recent package is installed, if ($allow && $pkg->compare_pkg($p) <= 0) { + print "pkg: " . $pkg->fullname . " vs $p \n"; if ($required =~ /^\d+/ || $p->provides_overlap($required)) { $urpm->{debug_URPM}("not selecting " . $pkg->fullname . " since the more recent " . $p->fullname . " is installed") if $urpm->{debug_URPM}; _set_rejected_old_package($state, $pkg, $p); |