fe3f2f
From 0714c89c318afdc869a6b6e6fe0832dc63cd4ca7 Mon Sep 17 00:00:00 2001
fe3f2f
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
fe3f2f
Date: Mon, 18 Sep 2017 18:22:34 +0200
fe3f2f
Subject: [PATCH] Correct prototol family in hints
fe3f2f
MIME-Version: 1.0
fe3f2f
Content-Type: text/plain; charset=UTF-8
fe3f2f
Content-Transfer-Encoding: 8bit
fe3f2f
fe3f2f
This corrects a warning about undefined protocol passed to Perl
fe3f2f
socket() function after applying the fix for a hostless constructor:
fe3f2f
fe3f2f
$ ./Build test --verbose=1 --test_files t/19no-addrs.t
fe3f2f
t/19no-addrs.t ..
fe3f2f
ok 1 - $sock->fileno for Family => AF_INET
fe3f2f
ok 2 - $sock->sockdomain for Family => AF_INET
fe3f2f
ok 3 - $sock->socktype for Family => AF_INET
fe3f2f
ok 4 - $sock->fileno for Family => AF_INET6
fe3f2f
ok 5 - $sock->sockdomain for Family => AF_INET6
fe3f2f
ok 6 - $sock->socktype for Family => AF_INET6
fe3f2f
ok 7 - $sock->fileno for Type => SOCK_STREAM
fe3f2f
ok 8 - $sock->socktype for Type => SOCK_STREAM
fe3f2f
1..8
fe3f2f
Use of uninitialized value $protocol in socket at /usr/lib64/perl5/IO/Socket.pm line 81.
fe3f2f
ok
fe3f2f
All tests successful.
fe3f2f
fe3f2f
This a port of upstream changes from 0.29 to 0.21 that were described
fe3f2f
as:
fe3f2f
fe3f2f
0.29    2014/02/24 16:06:29
fe3f2f
        [BUGFIXES]
fe3f2f
         * Workaround for OSes that disobey AI_ADDRCONFIG and yield AIs on
fe3f2f
           families the kernel will not support anyway (e.g. HPUX)
fe3f2f
fe3f2f
Signed-off-by: Petr Písař <ppisar@redhat.com>
fe3f2f
---
fe3f2f
 lib/IO/Socket/IP.pm | 21 ++++++++++++---------
fe3f2f
 1 file changed, 12 insertions(+), 9 deletions(-)
fe3f2f
fe3f2f
diff --git a/lib/IO/Socket/IP.pm b/lib/IO/Socket/IP.pm
fe3f2f
index 208d837..bea7d39 100644
fe3f2f
--- a/lib/IO/Socket/IP.pm
fe3f2f
+++ b/lib/IO/Socket/IP.pm
fe3f2f
@@ -521,24 +521,27 @@ sub _configure
fe3f2f
    if( !@infos ) {
fe3f2f
 
fe3f2f
       # If there was a Family hint then create a plain unbound, unconnected socket
fe3f2f
+      if( defined $hints{family} ) {
fe3f2f
+         @infos = ( {
fe3f2f
+            family   => $hints{family},
fe3f2f
+            socktype => $hints{socktype},
fe3f2f
+            protocol => $hints{protocol},
fe3f2f
+         } );
fe3f2f
+      }
fe3f2f
       # If there wasn't, use getaddrinfo()'s AI_ADDRCONFIG side-effect to guess a
fe3f2f
       # suitable family first.
fe3f2f
-      if( !defined $hints{family} ) {
fe3f2f
-         my ( $err, $addrinfo ) = getaddrinfo( "", "0", \%hints );
fe3f2f
+      else {
fe3f2f
+         ( my $err, @infos ) = getaddrinfo( "", "0", \%hints );
fe3f2f
          if( $err ) {
fe3f2f
             $@ = "$err";
fe3f2f
             $! = EINVAL;
fe3f2f
             return;
fe3f2f
          }
fe3f2f
 
fe3f2f
-         $hints{family} = $addrinfo->{family};
fe3f2f
+         # We'll take all the @infos anyway, because some OSes (HPUX) are known to
fe3f2f
+         # ignore the AI_ADDRCONFIG hint and return AF_INET6 even if they don't
fe3f2f
+         # support them
fe3f2f
       }
fe3f2f
-
fe3f2f
-      @infos = ( {
fe3f2f
-         family   => $hints{family},
fe3f2f
-         socktype => $hints{socktype},
fe3f2f
-         protocol => $hints{protocol},
fe3f2f
-      } );
fe3f2f
    }
fe3f2f
 
fe3f2f
    # In the nonblocking case, caller will be calling ->setup multiple times.
fe3f2f
-- 
fe3f2f
2.13.5
fe3f2f