Skip to content
Snippets Groups Projects
Commit 81d2b2bb authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Don't send extra messages, will cause interoperability problems

with versions not built to receive these extra messages.
Likewise in reverse.
parent 9702e837
Branches
Tags
No related merge requests found
......@@ -131,10 +131,6 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
}
#undef TRACE
#if !defined(HAVE_GETPEEREID) && !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && defined(HAVE_SENDMSG)
#define DO_SENDMSG
#endif
static int
ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr_un *sa, int async)
{
......@@ -159,25 +155,6 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr_un *sa, int async)
if ( ldap_pvt_ndelay_off(ld, s) == -1 ) {
return ( -1 );
}
#ifdef DO_SENDMSG
/* Send a dummy message with access rights. Remote side will
* obtain our uid/gid by fstat'ing this descriptor.
*/
sendcred: {
int fds[2];
struct iovec iov = {(char *)fds, sizeof(int)};
struct msghdr msg = {0};
if (pipe(fds) == 0) {
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_accrights = (char *)fds;
msg.msg_accrightslen = sizeof(int);
sendmsg( s, &msg, 0 );
close(fds[0]);
close(fds[1]);
}
}
#endif
return ( 0 );
}
......
......@@ -18,11 +18,6 @@
#include <sys/ucred.h>
#endif
#if !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && defined(HAVE_SENDMSG)
#define DO_SENDMSG
#include <sys/stat.h>
#endif
int getpeereid( int s, uid_t *euid, gid_t *egid )
{
#ifdef LDAP_PF_LOCAL
......@@ -51,31 +46,6 @@ int getpeereid( int s, uid_t *euid, gid_t *egid )
*egid = peercred.cr_gid;
return 0;
}
#elif defined( DO_SENDMSG )
int dummy, fd[2];
struct iovec iov = {(char *)&dummy, sizeof(dummy)};
struct msghdr msg = {0};
struct stat st;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_accrights = (char *)fd;
msg.msg_accrightslen = sizeof(fd);
if( recvmsg( s, &msg, 0) >= 0 && msg.msg_accrightslen == sizeof(int) )
{
/* We must receive a valid descriptor, it must be a pipe,
* and it must only be accessible by its owner.
*/
dummy = fstat( fd[0], &st );
close(fd[0]);
if( dummy == 0 && S_ISFIFO(st.st_mode) &&
((st.st_mode & (S_IRWXG|S_IRWXO)) == 0))
{
*euid = st.st_uid;
*egid = st.st_gid;
return 0;
}
}
#endif
#endif
return -1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment