Bug#675913: ldirectord failed to start, RFC2553 compatible getaddrinfo/getnameinfo

2012-10-29 Thread Tom Fernandes
Package: resource-agents
Followup-For: Bug #675913

Hi,

I'm hitting the same bug. It's present in the version in testing (1:3.9.2-5) and
in the version in unstable (1:3.9.3+git20121009-1).

I modified the initially attached patch as the offsets did not apply any more
for the current verion in testing and tested it. It seems to work correctly
although I haven't done intesive testing yet.

Zang - where does this patch come from and are you running it in production use?

I'm not in the position to dive into the code that deep to verify, that it
doesn't have any side effects.

As the issue still persists in version 1:3.9.3+git20121009-1 it looks like that
upstream hasn't yet fixed this issue.

It would be nice to have a working HA-stack for wheezy :-) .

warm regards and thanks for the good work,


Tom



-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable'), (500, 'stable'), (500, 
'oldstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-3-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
--- resource-agents-3.9.2.orig/ldirectord/ldirectord.in
+++ resource-agents-3.9.2/ldirectord/ldirectord.in
@@ -828,7 +828,8 @@ use Pod::Usage;
 #use English;
 #use Time::HiRes qw( gettimeofday tv_interval );
 use Socket;
-use Socket6;
+use Socket::GetAddrInfo qw( getaddrinfo getnameinfo NI_NUMERICHOST NI_NUMERICSERV NI_NAMEREQD );
+#use Socket6;
 use Sys::Hostname;
 use POSIX qw(setsid :sys_wait_h);
 use Sys::Syslog qw(:DEFAULT setlogsock);
@@ -5039,17 +5040,21 @@ sub ld_gethostbyname
if ($name =~ /\[(.*)\]/) {
$name = $1;
}
-   my @host = getaddrinfo($name, 0, $af);
-   if (!defined($host[3])) {
-   return undef;
-   }
-   my @ret = getnameinfo($host[3], NI_NUMERICHOST | NI_NUMERICSERV);
-   if ($host[0] == AF_INET6) {
-   return [$ret[0]];
-   }
-   else {
-   return $ret[0];
-   }
+  my %hints = ( family = $af );
+  my ( $err, @res ) = getaddrinfo($name, 0, \%hints);
+  return undef if ($err);
+  while( my $ai = shift @res ) {
+my ( $err, $hostname, $servicename ) = getnameinfo( $ai-{addr} );
+if (!$err) {
+  if ($ai-{family} == AF_INET6) {
+return [$hostname];
+  }
+  else {
+return $hostname;
+  }
+}
+  }
+  return undef;
 }
 
 # ld_gethostbyaddr
@@ -5064,13 +5069,12 @@ sub ld_gethostbyaddr
my ($ip)=(@_);
 
$ip = ld_strip_brackets($ip);
-   my @host = getaddrinfo($ip,0);
-   if (!defined($host[3])) {
-   return undef;
+  my ( $err, @res ) = getaddrinfo($ip,0);
+  return undef if ($err);
+  while( my $ai = shift @res ) {
+my ( $err, $host, $service ) = getnameinfo($ai-{addr}, NI_NAMEREQD);
+return $host unless($err);
}
-   my @ret = getnameinfo($host[3], NI_NAMEREQD);
-   return undef unless(scalar(@ret) == 2);
-   return $ret[0];
 }
 
 # ld_getservbyname


Bug#675913: ldirectord failed to start, RFC2553 compatible getaddrinfo/getnameinfo

2012-06-04 Thread Zang MingJie
Package: resource-agents
Severity: grave
Tags: upstream patch

ldirectord failed to start, with following error:

Subroutine main::pack_sockaddr_in6 redefined at
/usr/share/perl/5.14/Exporter.pm line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::unpack_sockaddr_in6 redefined at
/usr/share/perl/5.14/Exporter.pm line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::sockaddr_in6 redefined at /usr/share/perl/5.14/Exporter.pm
line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::pack_sockaddr_in6 redefined at /usr/sbin/ldirectord line 3060
Subroutine main::unpack_sockaddr_in6 redefined at /usr/sbin/ldirectord line
3060
Subroutine main::sockaddr_in6 redefined at /usr/sbin/ldirectord line 3060
Subroutine main::pack_sockaddr_in6 redefined at
/usr/share/perl/5.14/Exporter.pm line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::unpack_sockaddr_in6 redefined at
/usr/share/perl/5.14/Exporter.pm line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::sockaddr_in6 redefined at /usr/share/perl/5.14/Exporter.pm
line 67.
 at /usr/sbin/ldirectord line 831
Subroutine main::pack_sockaddr_in6 redefined at /usr/sbin/ldirectord line 3060
Subroutine main::unpack_sockaddr_in6 redefined at /usr/sbin/ldirectord line
3060
Subroutine main::sockaddr_in6 redefined at /usr/sbin/ldirectord line 3060

After comment out `use Socket6;`, got following error:

Bareword NI_NUMERICHOST not allowed while strict subs in use at
/usr/sbin/ldirectord line 5046.
Bareword NI_NUMERICSERV not allowed while strict subs in use at
/usr/sbin/ldirectord line 5046.
Execution of /usr/sbin/ldirectord aborted due to compilation errors.

Additional dependency required:
libsocket-getaddrinfo-perl



-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (300, 
'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Description: short summary of the patch
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 resource-agents (1:3.9.2-5) unstable; urgency=high
 .
   * debian/control: Fix the Conflicts and Replaces lines of resource-agents
 to make sure that cluster-agents and resource-agents are mutually
 exclusive. Setting the urgency to high because this bug keeps people
 from running the whole clusterstack (Closes: #646110)
   * debian/patches/ocf-asterisk: Include the Asterisk PBX OCF resource agent
 written by Florian Haas, Andreas Kurz and me, sponsored by hastexo
Author: Martin Loschwitz madk...@debian.org
Bug-Debian: http://bugs.debian.org/646110

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: vendor|upstream|other, url of original patch
Bug: url in upstream bugtracker
Bug-Debian: http://bugs.debian.org/bugnumber
Bug-Ubuntu: https://launchpad.net/bugs/bugnumber
Forwarded: no|not-needed|url proving that it has been forwarded
Reviewed-By: name and email of someone who approved the patch
Last-Update: -MM-DD

Index: resource-agents-3.9.2/ldirectord/ldirectord.in
===
--- resource-agents-3.9.2.orig/ldirectord/ldirectord.in	2012-06-04 13:24:40.0 +0800
+++ resource-agents-3.9.2/ldirectord/ldirectord.in	2012-06-04 14:16:33.994237831 +0800
@@ -828,7 +828,8 @@
 #use English;
 #use Time::HiRes qw( gettimeofday tv_interval );
 use Socket;
-use Socket6;
+use Socket::GetAddrInfo qw( getaddrinfo getnameinfo NI_NUMERICHOST NI_NUMERICSERV NI_NAMEREQD );
+#use Socket6;
 use Sys::Hostname;
 use POSIX qw(setsid :sys_wait_h);
 use Sys::Syslog qw(:DEFAULT setlogsock);
@@ -5039,17 +5040,21 @@
 	if ($name =~ /\[(.*)\]/) {
 		$name = $1;
 	}
-	my @host = getaddrinfo($name, 0, $af);
-	if (!defined($host[3])) {
-		return undef;
-	}
-	my @ret = getnameinfo($host[3], NI_NUMERICHOST | NI_NUMERICSERV);
-	if ($host[0] == AF_INET6) {
-		return [$ret[0]];
-	}
-	else {
-		return $ret[0];
+	my %hints = ( family = $af );
+	my ( $err, @res ) = getaddrinfo($name, 0, \%hints);
+	return undef if ($err);
+	while( my $ai = shift @res ) {
+		my ( $err, $hostname, $servicename ) = getnameinfo( $ai-{addr} );
+		if (!$err) {
+			if ($ai-{family} == AF_INET6) {
+return [$hostname];
+			}
+			else {
+return $hostname;
+			}
+		}
 	}
+	return undef;
 }
 
 # ld_gethostbyaddr
@@ -5064,13 +5069,13 @@
 	my ($ip)=(@_);
 
 	$ip = ld_strip_brackets($ip);
-	my @host = getaddrinfo($ip,0);
-	if (!defined($host[3])) {
-		return undef;
+	my (