summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-11-22 21:28:15 -0800
committerFather Chrysostomos <sprout@cpan.org>2011-11-22 21:29:35 -0800
commitbc4eb4d6f895e86a4afbc016eae943c7546c35f2 (patch)
treeef18a6108892dffc3ebf5c7bdc667133a2b37b4f
parenta3f353cf7aaf90ddfb021a9733ff75f4437d4e70 (diff)
downloadperl-bc4eb4d6f895e86a4afbc016eae943c7546c35f2.tar.gz
[perl #102586] version->new("version") SEGVs
This adds an ROK check after calling sv_derived_from, as the latter also works for class names. It is done after sv_derived_from, rather than before, as sv_derived_from calls get-magic.
-rw-r--r--ext/arybase/arybase.pm2
-rw-r--r--lib/version.t13
-rw-r--r--util.c3
3 files changed, 16 insertions, 2 deletions
diff --git a/ext/arybase/arybase.pm b/ext/arybase/arybase.pm
index 829f2dbc3f..aa3946dbdb 100644
--- a/ext/arybase/arybase.pm
+++ b/ext/arybase/arybase.pm
@@ -1,6 +1,6 @@
package arybase;
-our $VERSION = "0.01";
+our $VERSION = "0.02";
require XSLoader;
XSLoader::load(); # This returns true, which makes require happy.
diff --git a/lib/version.t b/lib/version.t
index dd47e87654..da1102378a 100644
--- a/lib/version.t
+++ b/lib/version.t
@@ -739,6 +739,19 @@ SKIP: {
}
}
+eval { version->new("version") };
+pass('no crash with version->new("version")');
+{
+ package _102586;
+ sub TIESCALAR { bless [] }
+ sub FETCH { "version" }
+ sub STORE { }
+ tie my $v, __PACKAGE__;
+ $v = version->new(1);
+ eval { version->new($v) };
+}
+pass('no crash with version->new($tied) where $tied returns "version"');
+
1;
__DATA__
diff --git a/util.c b/util.c
index 8b2e5f54c9..4a170aa24b 100644
--- a/util.c
+++ b/util.c
@@ -4857,7 +4857,8 @@ Perl_new_version(pTHX_ SV *ver)
dVAR;
SV * const rv = newSV(0);
PERL_ARGS_ASSERT_NEW_VERSION;
- if ( sv_derived_from(ver,"version") ) /* can just copy directly */
+ if ( sv_derived_from(ver,"version") && SvROK(ver) )
+ /* can just copy directly */
{
I32 key;
AV * const av = newAV();