File xinetd-2.3.14-ident-bind.patch of Package xinetd.5694

448069: xinetd: socket bind: Invalid argument (errno = 22) when using USERID on ipv6

Use right size of addresses in bind() call. Also use getpeername addresses when
connecting to ident service to prevent address family mismatch between socket(),
bind() and connect() calls.

Author: Jan Safranek <jsafrane@redhat.com>
Reviewed-By: Adam Tkac <atkac@redhat.com>

Index: xinetd-2.3.14/xinetd/ident.c
===================================================================
--- xinetd-2.3.14.orig/xinetd/ident.c
+++ xinetd-2.3.14/xinetd/ident.c
@@ -97,7 +97,13 @@ idresult_e log_remote_user( const struct
    }
 
    CLEAR( sin_contact );
-   sin_remote = *CONN_XADDRESS( SERVER_CONNECTION( serp ) ) ;
+
+   sin_len = sizeof( sin_remote );
+   if ( getpeername( SERVER_FD( serp ), &sin_remote.sa, &sin_len ) == -1 )
+   {
+      msg( LOG_ERR, func, "(%d) getpeername: %m", getpid() ) ;
+      return( IDR_ERROR ) ;
+   }
    sin_contact = sin_remote;
    memcpy( &sin_bind, &sin_local, sizeof(sin_bind) ) ;
    local_port = 0;
@@ -127,7 +133,13 @@ idresult_e log_remote_user( const struct
       msg( LOG_ERR, func, "socket creation: %m" ) ;
       return( IDR_ERROR ) ;
    }
-   if ( bind(sd, &sin_bind.sa, sizeof(sin_bind.sa)) == -1 )
+
+   if ( sin_bind.sa.sa_family == AF_INET )
+      sin_len = sizeof( sin_bind.sa_in ) ;
+   else
+      sin_len = sizeof( sin_bind.sa_in6 ) ;
+
+   if ( bind(sd, &sin_bind.sa, sin_len) == -1 )
    { 
       msg( LOG_ERR, func, "socket bind: %m" ) ;
       (void) Sclose( sd ) ;
openSUSE Build Service is sponsored by