The attached patch against 0.35 fixes an obscure problem with Net::LDAP
when talking to a round-robin LDAP server(s) using SASL/GSSAPI
authentication.

Without it, the SASL layer is passed the round-robin name, but if, when
the SASL/GSSAPI layer attempts to canonicalise the address, it resolves
to a different host to the one IO::Socket used for its connection, a
service ticket for a conflicting server will be requested, and
authentication will fail.

The patched version has been tested with SASL GSSAPI binds to
round-robin and non round-robin addresses.

Please consider this for inclusion in the next Net::LDAP release.

Thanks,
Dominic

-- 
Dominic Hargreaves, Systems Development and Support Team
Computing Services, University of Oxford
diff -urN perl-ldap-0.35/lib/Net/LDAP.pm perl-ldap-0.35.mine/lib/Net/LDAP.pm
--- perl-ldap-0.35/lib/Net/LDAP.pm	2008-03-30 19:50:13.000000000 +0100
+++ perl-ldap-0.35.mine/lib/Net/LDAP.pm	2008-04-18 17:15:54.000000000 +0100
@@ -377,9 +377,16 @@
       if $ldap->{net_ldap_version} < 3;
 
     my $sasl = $passwd;
+
+    # If we're talking to a round-robin, the canonical name of
+    # the host we are talking to might not match the name we
+    # requested
+    my $connected_name = $ldap->{net_ldap_socket}->peerhost;
+    $connected_name ||= $ldap->{net_ldap_host};
+
     my $sasl_conn = eval {
       local($SIG{__DIE__});
-      $sasl->client_new("ldap",$ldap->{net_ldap_host});
+      $sasl->client_new("ldap",$connected_name);
     };
 
     return _error($ldap, $mesg, LDAP_LOCAL_ERROR, "$@")

Reply via email to