53a05a
From 66cdf0a24913a97cfd0909340f2c74b8b60bf56a Mon Sep 17 00:00:00 2001
53a05a
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
53a05a
Date: Mon, 20 Apr 2015 17:38:57 +0200
53a05a
Subject: [PATCH] Fix calling getnameinfo() on tainted value
53a05a
MIME-Version: 1.0
53a05a
Content-Type: text/plain; charset=UTF-8
53a05a
Content-Transfer-Encoding: 8bit
53a05a
53a05a
This is upstream fix for calling getnameinfo() on tained value ported
53a05a
to 2.010:
53a05a
53a05a
2.018   2015/02/12 13:42:41
53a05a
        [BUGFIXES]
53a05a
         * Fix for "addr is not a string" test to use SvPOKp() before 5.18
53a05a
53a05a
2.017   2015/02/10 12:05:14
53a05a
        [BUGFIXES]
53a05a
         * Remember to SvGETMAGIC in getnameinfo() (RT79557)
53a05a
53a05a
https://rt.cpan.org/Public/Bug/Display.html?id=79557
53a05a
https://bugzilla.redhat.com/show_bug.cgi?id=1200167
53a05a
http://www.gossamer-threads.com/lists/spamassassin/users/189005#189005
53a05a
Signed-off-by: Petr Písař <ppisar@redhat.com>
53a05a
53a05a
diff --git a/Socket.xs b/Socket.xs
53a05a
index 3cc90f6..753cd09 100644
53a05a
--- a/Socket.xs
53a05a
+++ b/Socket.xs
53a05a
@@ -520,6 +520,7 @@ static void xs_getnameinfo(pTHX_ CV *cv)
53a05a
 	SP -= items;
53a05a
 
53a05a
 	addr = ST(0);
53a05a
+	SvGETMAGIC(addr);
53a05a
 
53a05a
 	if(items < 2)
53a05a
 		flags = 0;
53a05a
@@ -534,7 +535,7 @@ static void xs_getnameinfo(pTHX_ CV *cv)
53a05a
 	want_host = !(xflags & NIx_NOHOST);
53a05a
 	want_serv = !(xflags & NIx_NOSERV);
53a05a
 
53a05a
-	if(!SvPOK(addr))
53a05a
+	if(!SvPOKp(addr))
53a05a
 		croak("addr is not a string");
53a05a
 
53a05a
 	addr_len = SvCUR(addr);
53a05a
diff --git a/t/getnameinfo.t b/t/getnameinfo.t
53a05a
index ca24e2c..23a7669 100644
53a05a
--- a/t/getnameinfo.t
53a05a
+++ b/t/getnameinfo.t
53a05a
@@ -1,6 +1,6 @@
53a05a
 use strict;
53a05a
 use warnings;
53a05a
-use Test::More tests => 14;
53a05a
+use Test::More tests => 15;
53a05a
 
53a05a
 use Socket qw(:addrinfo AF_INET pack_sockaddr_in inet_aton);
53a05a
 
53a05a
@@ -40,3 +40,8 @@ cmp_ok( $err, "==", 0, '$err == 0 for {family=AF_INET,port=80,sinaddr=127.0.0.1}
53a05a
 
53a05a
 is( $host, "127.0.0.1", '$host is 127.0.0.1 for NH' );
53a05a
 is( $service, $expect_service, "\$service is $expect_service for NH" );
53a05a
+
53a05a
+# RT79557
53a05a
+pack_sockaddr_in( 80, inet_aton( "127.0.0.1" ) ) =~ m/^(.*)$/s;
53a05a
+( $err, $host, $service ) = getnameinfo( $1, NI_NUMERICHOST|NI_NUMERICSERV );
53a05a
+cmp_ok( $err, "==", 0, '$err == 0 for $1' ) or diag( '$err was: ' . $err );
53a05a
-- 
53a05a
2.1.0
53a05a