summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpan/version/lib/version/vpp.pm5
-rw-r--r--cpan/version/t/coretests.pm11
-rw-r--r--vutil.c12
3 files changed, 25 insertions, 3 deletions
diff --git a/cpan/version/lib/version/vpp.pm b/cpan/version/lib/version/vpp.pm
index f6153a6c49..c879c398c8 100644
--- a/cpan/version/lib/version/vpp.pm
+++ b/cpan/version/lib/version/vpp.pm
@@ -674,6 +674,11 @@ sub new
$qv = TRUE;
}
+ if (ref($value) =~ m/ARRAY|HASH/) {
+ require Carp;
+ Carp::croak("Invalid version format (non-numeric data)");
+ }
+
$value = _un_vstring($value);
# exponential notation
diff --git a/cpan/version/t/coretests.pm b/cpan/version/t/coretests.pm
index b7b690aa8c..17bf9ec5fc 100644
--- a/cpan/version/t/coretests.pm
+++ b/cpan/version/t/coretests.pm
@@ -30,6 +30,10 @@ sub BaseTests {
$version = $CLASS->$method(1.23);
is ( "$version" , "1.23" , '1.23 eq "1.23"' );
+ # Test explicit integer
+ $version = $CLASS->$method(23);
+ is ( "$version" , 23 , '23 eq "23"' );
+
# Test quoted number processing
$version = $CLASS->$method("5.005_03");
is ( "$version" , "5.005_03" , '"5.005_03" eq "5.005_03"' );
@@ -582,6 +586,13 @@ SKIP: {
is ref(ver->qv("1.2.3")), 'ver', 'ver can inherit from version';
}
+ { # discovered while integrating with bleadperl
+ eval {my $v = $CLASS->new([1,2,3]) };
+ like $@, qr/Invalid version format/, 'Do not crash for garbage';
+ eval {my $v = $CLASS->new({1 => 2}) };
+ like $@, qr/Invalid version format/, 'Do not crash for garbage';
+ }
+
}
1;
diff --git a/vutil.c b/vutil.c
index 8eafd75d37..06680dd6fb 100644
--- a/vutil.c
+++ b/vutil.c
@@ -572,8 +572,9 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
}
#endif
if (sv) {
- Perl_sv_setpvf(aTHX_ sv, "%.9"NVff, SvNVX(ver));
- buf = SvPV(sv, len);
+ Perl_sv_catpvf(aTHX_ sv, "%.9"NVff, SvNVX(ver));
+ len = SvCUR(sv);
+ buf = SvPVX(sv);
}
else {
len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
@@ -609,7 +610,7 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
else if ( SvUOK(ver) || SvIOK(ver) ) {
version = savesvpv(ver);
}
- else /* must be a string or something like a string */
+ else if ( SvPOK(ver) )/* must be a string or something like a string */
{
STRLEN len;
version = savepvn(SvPV(ver,len), SvCUR(ver));
@@ -650,6 +651,11 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
# endif
#endif
}
+ else
+ {
+ /* no idea what this is */
+ Perl_croak(aTHX_ "Invalid version format (non-numeric data)");
+ }
s = SCAN_VERSION(version, ver, qv);
if ( *s != '\0' )