summaryrefslogtreecommitdiff
path: root/t/lib
diff options
context:
space:
mode:
authorÆvar Arnfjörð Bjarmason <avar@cpan.org>2010-09-11 09:58:02 +0000
committerNicholas Clark <nick@ccl4.org>2010-09-11 12:23:45 +0100
commit80b6a949dbabd822cf5e1cf2ece76164d772f0b9 (patch)
tree66971dc37db0dee1bc6222b441e0a0ed00ea83d6 /t/lib
parent3d8e05a034fc6625a503b87c8ac336d4d84fb338 (diff)
downloadperl-80b6a949dbabd822cf5e1cf2ece76164d772f0b9.tar.gz
segfault on &Internals::* due to missing SvROK()
Change the &Internals::* functions that use references in their prototypes to check if the argument is SvROK() before calling SvRV(). If the function is called as Internals::FOO() perl does this check for us, but prototypes are bypassed on &Internals::FOO() so we still have to check this manually. This fixes [perl #77776], this bug was present in 5.10.x, 5.12.x, and probably all earlier perl versions that had these functions, but I haven't tested that. I'm adding a new test file (t/lib/universal.t) to test universal.c functions as part of this patch. The testing for Internal::* in t/ was and is very sparse, but before universal.t there was no obvious place to put these tests. Signed-off-by: Ævar Arnfjörð Bjarmason <avar@cpan.org>
Diffstat (limited to 't/lib')
-rw-r--r--t/lib/universal.t25
1 files changed, 25 insertions, 0 deletions
diff --git a/t/lib/universal.t b/t/lib/universal.t
new file mode 100644
index 0000000000..d8c088920b
--- /dev/null
+++ b/t/lib/universal.t
@@ -0,0 +1,25 @@
+#!./perl
+
+# Test the Internal::* functions and other tibits in universal.c
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require './test.pl';
+ plan( tests => 4 );
+}
+
+for my $arg ('', 'q[]', qw( 1 undef )) {
+ fresh_perl_is(<<"----", <<'====', "Internals::* functions check their argument under func() AND &func() [perl #77776]");
+sub tryit { eval shift or warn \$@ }
+tryit "&Internals::SvREADONLY($arg)";
+tryit "&Internals::SvREFCNT($arg)";
+tryit "&Internals::hv_clear_placeholders($arg)";
+tryit "&Internals::HvREHASH($arg)";
+----
+Usage: Internals::SvREADONLY(SCALAR[, ON]) at (eval 1) line 1.
+Usage: Internals::SvREFCNT(SCALAR[, REFCOUNT]) at (eval 2) line 1.
+Usage: Internals::hv_clear_placeholders(hv) at (eval 3) line 1.
+Internals::HvREHASH $hashref at (eval 4) line 1.
+====
+}