head 1.2; access; symbols pkgsrc-2013Q2:1.2.0.4 pkgsrc-2013Q2-base:1.2 pkgsrc-2012Q4:1.2.0.2 pkgsrc-2012Q4-base:1.2 pkgsrc-2011Q4:1.1.0.22 pkgsrc-2011Q4-base:1.1 pkgsrc-2011Q3:1.1.0.20 pkgsrc-2011Q3-base:1.1 pkgsrc-2011Q2:1.1.0.18 pkgsrc-2011Q2-base:1.1 pkgsrc-2011Q1:1.1.0.16 pkgsrc-2011Q1-base:1.1 pkgsrc-2010Q4:1.1.0.14 pkgsrc-2010Q4-base:1.1 pkgsrc-2010Q3:1.1.0.12 pkgsrc-2010Q3-base:1.1 pkgsrc-2010Q2:1.1.0.10 pkgsrc-2010Q2-base:1.1 pkgsrc-2010Q1:1.1.0.8 pkgsrc-2010Q1-base:1.1 pkgsrc-2009Q4:1.1.0.6 pkgsrc-2009Q4-base:1.1 pkgsrc-2009Q3:1.1.0.4 pkgsrc-2009Q3-base:1.1 pkgsrc-2009Q2:1.1.0.2 pkgsrc-2009Q2-base:1.1; locks; strict; comment @# @; 1.2 date 2012.02.29.18.49.41; author morr; state dead; branches; next 1.1; 1.1 date 2009.05.19.19.41.19; author snj; state Exp; branches; next ; desc @@ 1.2 log @Update to version 9.15. List of changes is too big to be included here. You can look at http://dist.schmorp.de/rxvt-unicode/Changes to see changelog. @ text @$NetBSD: patch-ad,v 1.1 2009/05/19 19:41:19 snj Exp $ --- src/fdpass.C.orig 2008-05-05 09:51:47.000000000 -0700 +++ src/fdpass.C 2009-05-19 12:28:03.000000000 -0700 @@@@ -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; } @ 1.1 log @Add the upstream version of a patch submitted by Talor R Campbell in PR pkg/38988 to fix a problem with socket control message ancillary data alignment. Bump PKGREVISION to 1. @ text @d1 1 a1 1 $NetBSD$ @