From b78b66b27c234804499b0cb1e5867bb4d8ea3b30 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 3 May 2009 21:44:08 +0000 Subject: [PATCH] *** empty log message *** --- Changes | 3 +++ src/fdpass.C | 62 +++++++++++++++++++++++++++++++++------------------ src/logging.C | 1 + src/proxy.C | 2 ++ 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/Changes b/Changes index 989c2c8c..19c7590e 100644 --- a/Changes +++ b/Changes @@ -43,6 +43,9 @@ TODO: - gcc-4.4/const/Milos Jakubicek. (adapted from http://achurch.org/patch-pile/). - resizing the window with the scrollbar disabled via the escapes sequence could make the window bigger again (Mikachu). + - make sure the alignment for fd passing control messages + is correct and work around some NetBSD issues (Taylor R Campbell). + - update to libptytty 1.3. 9.06 Sat Nov 8 17:47:18 CET 2008 - NOTICE: this release updates terminfo/termcap. diff --git a/src/fdpass.C b/src/fdpass.C index ed03fa36..2a529e1a 100644 --- a/src/fdpass.C +++ b/src/fdpass.C @@ -26,6 +26,7 @@ #include "../config.h" #include // needed by broken bsds for NULL used in sys/uio.h +#include #include #include @@ -33,16 +34,26 @@ #include "libptytty.h" -#ifndef CMSG_LEN // CMSG_SPACE && CMSG_LEN are rfc2292 extensions to unix +// CMSG_SPACE & CMSG_LEN are rfc2292 extensions to unix +#ifndef CMSG_SPACE +# define CMSG_SPACE(len) (sizeof (cmsghdr) + len) +#endif + +#ifndef CMSG_LEN # define CMSG_LEN(len) (sizeof (cmsghdr) + len) #endif bool ptytty::send_fd (int socket, int fd) { + void *buf = malloc (CMSG_SPACE (sizeof (int))); + + if (!buf) + return 0; + msghdr msg; iovec iov; - char buf [CMSG_LEN (sizeof (int))]; + cmsghdr *cmsg; char data = 0; iov.iov_base = &data; @@ -52,27 +63,33 @@ ptytty::send_fd (int socket, int fd) msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; - msg.msg_control = (void *)buf; - msg.msg_controllen = sizeof buf; + msg.msg_control = buf; + msg.msg_controllen = CMSG_SPACE (sizeof (int)); - cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); + cmsg = CMSG_FIRSTHDR (&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN (sizeof (int)); *(int *)CMSG_DATA (cmsg) = fd; - msg.msg_controllen = cmsg->cmsg_len; + ssize_t result = sendmsg (socket, &msg, 0); + + free (buf); - return sendmsg (socket, &msg, 0) >= 0; + return result >= 0; } int ptytty::recv_fd (int socket) { + void *buf = malloc (CMSG_SPACE (sizeof (int))); + + if (!buf) + return -1; + msghdr msg; iovec iov; - char buf [CMSG_LEN (sizeof (int))]; /* ancillary data buffer */ char data = 1; iov.iov_base = &data; @@ -83,23 +100,24 @@ ptytty::recv_fd (int socket) msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = buf; - msg.msg_controllen = sizeof buf; + msg.msg_controllen = CMSG_SPACE (sizeof (int)); - cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN (sizeof (int)); + int fd = -1; - msg.msg_controllen = cmsg->cmsg_len; + if (recvmsg (socket, &msg, 0) > 0 + && data == 0 + && msg.msg_controllen >= CMSG_SPACE (sizeof (int))) + { + cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); - if (recvmsg (socket, &msg, 0) <= 0 - || data != 0 - || msg.msg_controllen < CMSG_LEN (sizeof (int)) - || cmsg->cmsg_level != SOL_SOCKET - || cmsg->cmsg_type != SCM_RIGHTS - || cmsg->cmsg_len < CMSG_LEN (sizeof (int))) - return -1; + if (cmsg->cmsg_level == SOL_SOCKET + && cmsg->cmsg_type == SCM_RIGHTS + && cmsg->cmsg_len >= CMSG_LEN (sizeof (int))) + fd = *(int *)CMSG_DATA (cmsg); + } + + free (buf); - return *(int *)CMSG_DATA (cmsg); + return fd; } diff --git a/src/logging.C b/src/logging.C index c9106bb8..e7c5caa4 100644 --- a/src/logging.C +++ b/src/logging.C @@ -42,6 +42,7 @@ #if UTMP_SUPPORT #include +#include #include #include diff --git a/src/proxy.C b/src/proxy.C index 887f41ce..94c248b1 100644 --- a/src/proxy.C +++ b/src/proxy.C @@ -27,6 +27,8 @@ #include "ptytty.h" +#include +#include #include #include -- 2.34.1