aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPer Øyvind Karlsen <peroyvind@mandriva.org>2011-01-24 01:35:26 +0000
committerPer Øyvind Karlsen <peroyvind@mandriva.org>2011-01-24 01:35:26 +0000
commitcd0dd955e9d717c36ff11bdd425c92e9a94ce491 (patch)
treed657236a7f85746bb55efb920c1b84f8848873f0
parent7a1561f6471f67a469c73e32c0856cc486ced812 (diff)
downloadperl-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.xs31
-rw-r--r--URPM/Resolve.pm5
2 files changed, 22 insertions, 14 deletions
diff --git a/URPM.xs b/URPM.xs
index d1fd2c3..a9c10b3 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -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);