| 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> |
| |
| #diff -up xinetd-2.3.14/xinetd/ident.c.orig xinetd-2.3.14/xinetd/ident.c |
| --- a/xinetd/ident.c |
| +++ b/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 ) ; |