summaryrefslogtreecommitdiff
path: root/monitor_fdpass.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor_fdpass.c')
-rw-r--r--monitor_fdpass.c75
1 files changed, 49 insertions, 26 deletions
diff --git a/monitor_fdpass.c b/monitor_fdpass.c
index 52d133647..28296d64b 100644
--- a/monitor_fdpass.c
+++ b/monitor_fdpass.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: monitor_fdpass.c,v 1.12 2006/08/03 03:34:42 deraadt Exp $ */ 1/* $OpenBSD: monitor_fdpass.c,v 1.17 2008/03/24 16:11:07 deraadt Exp $ */
2/* 2/*
3 * Copyright 2001 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2001 Niels Provos <provos@citi.umich.edu>
4 * All rights reserved. 4 * All rights reserved.
@@ -64,7 +64,7 @@ cmsg_type_is_broken(void)
64 return broken_cmsg_type; 64 return broken_cmsg_type;
65} 65}
66 66
67void 67int
68mm_send_fd(int sock, int fd) 68mm_send_fd(int sock, int fd)
69{ 69{
70#if defined(HAVE_SENDMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR)) 70#if defined(HAVE_SENDMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR))
@@ -73,7 +73,11 @@ mm_send_fd(int sock, int fd)
73 char ch = '\0'; 73 char ch = '\0';
74 ssize_t n; 74 ssize_t n;
75#ifndef HAVE_ACCRIGHTS_IN_MSGHDR 75#ifndef HAVE_ACCRIGHTS_IN_MSGHDR
76 char tmp[CMSG_SPACE(sizeof(int))]; 76 union {
77 struct cmsghdr hdr;
78 char tmp[CMSG_SPACE(sizeof(int))];
79 char buf[CMSG_SPACE(sizeof(int))];
80 } cmsgbuf;
77 struct cmsghdr *cmsg; 81 struct cmsghdr *cmsg;
78#endif 82#endif
79 83
@@ -82,8 +86,8 @@ mm_send_fd(int sock, int fd)
82 msg.msg_accrights = (caddr_t)&fd; 86 msg.msg_accrights = (caddr_t)&fd;
83 msg.msg_accrightslen = sizeof(fd); 87 msg.msg_accrightslen = sizeof(fd);
84#else 88#else
85 msg.msg_control = (caddr_t)tmp; 89 msg.msg_control = (caddr_t)&cmsgbuf.buf;
86 msg.msg_controllen = CMSG_LEN(sizeof(int)); 90 msg.msg_controllen = sizeof(cmsgbuf.buf);
87 cmsg = CMSG_FIRSTHDR(&msg); 91 cmsg = CMSG_FIRSTHDR(&msg);
88 cmsg->cmsg_len = CMSG_LEN(sizeof(int)); 92 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
89 cmsg->cmsg_level = SOL_SOCKET; 93 cmsg->cmsg_level = SOL_SOCKET;
@@ -96,15 +100,21 @@ mm_send_fd(int sock, int fd)
96 msg.msg_iov = &vec; 100 msg.msg_iov = &vec;
97 msg.msg_iovlen = 1; 101 msg.msg_iovlen = 1;
98 102
99 if ((n = sendmsg(sock, &msg, 0)) == -1) 103 if ((n = sendmsg(sock, &msg, 0)) == -1) {
100 fatal("%s: sendmsg(%d): %s", __func__, fd, 104 error("%s: sendmsg(%d): %s", __func__, fd,
101 strerror(errno)); 105 strerror(errno));
102 if (n != 1) 106 return -1;
103 fatal("%s: sendmsg: expected sent 1 got %ld", 107 }
108
109 if (n != 1) {
110 error("%s: sendmsg: expected sent 1 got %ld",
104 __func__, (long)n); 111 __func__, (long)n);
112 return -1;
113 }
114 return 0;
105#else 115#else
106 fatal("%s: UsePrivilegeSeparation=yes not supported", 116 error("%s: file descriptor passing not supported", __func__);
107 __func__); 117 return -1;
108#endif 118#endif
109} 119}
110 120
@@ -118,7 +128,10 @@ mm_receive_fd(int sock)
118 char ch; 128 char ch;
119 int fd; 129 int fd;
120#ifndef HAVE_ACCRIGHTS_IN_MSGHDR 130#ifndef HAVE_ACCRIGHTS_IN_MSGHDR
121 char tmp[CMSG_SPACE(sizeof(int))]; 131 union {
132 struct cmsghdr hdr;
133 char buf[CMSG_SPACE(sizeof(int))];
134 } cmsgbuf;
122 struct cmsghdr *cmsg; 135 struct cmsghdr *cmsg;
123#endif 136#endif
124 137
@@ -131,31 +144,41 @@ mm_receive_fd(int sock)
131 msg.msg_accrights = (caddr_t)&fd; 144 msg.msg_accrights = (caddr_t)&fd;
132 msg.msg_accrightslen = sizeof(fd); 145 msg.msg_accrightslen = sizeof(fd);
133#else 146#else
134 msg.msg_control = tmp; 147 msg.msg_control = &cmsgbuf.buf;
135 msg.msg_controllen = sizeof(tmp); 148 msg.msg_controllen = sizeof(cmsgbuf.buf);
136#endif 149#endif
137 150
138 if ((n = recvmsg(sock, &msg, 0)) == -1) 151 if ((n = recvmsg(sock, &msg, 0)) == -1) {
139 fatal("%s: recvmsg: %s", __func__, strerror(errno)); 152 error("%s: recvmsg: %s", __func__, strerror(errno));
140 if (n != 1) 153 return -1;
141 fatal("%s: recvmsg: expected received 1 got %ld", 154 }
155 if (n != 1) {
156 error("%s: recvmsg: expected received 1 got %ld",
142 __func__, (long)n); 157 __func__, (long)n);
158 return -1;
159 }
143 160
144#ifdef HAVE_ACCRIGHTS_IN_MSGHDR 161#ifdef HAVE_ACCRIGHTS_IN_MSGHDR
145 if (msg.msg_accrightslen != sizeof(fd)) 162 if (msg.msg_accrightslen != sizeof(fd)) {
146 fatal("%s: no fd", __func__); 163 error("%s: no fd", __func__);
164 return -1;
165 }
147#else 166#else
148 cmsg = CMSG_FIRSTHDR(&msg); 167 cmsg = CMSG_FIRSTHDR(&msg);
149 if (cmsg == NULL) 168 if (cmsg == NULL) {
150 fatal("%s: no message header", __func__); 169 error("%s: no message header", __func__);
151 if (!cmsg_type_is_broken() && cmsg->cmsg_type != SCM_RIGHTS) 170 return -1;
152 fatal("%s: expected type %d got %d", __func__, 171 }
172 if (!cmsg_type_is_broken() && cmsg->cmsg_type != SCM_RIGHTS) {
173 error("%s: expected type %d got %d", __func__,
153 SCM_RIGHTS, cmsg->cmsg_type); 174 SCM_RIGHTS, cmsg->cmsg_type);
175 return -1;
176 }
154 fd = (*(int *)CMSG_DATA(cmsg)); 177 fd = (*(int *)CMSG_DATA(cmsg));
155#endif 178#endif
156 return fd; 179 return fd;
157#else 180#else
158 fatal("%s: UsePrivilegeSeparation=yes not supported", 181 error("%s: file descriptor passing not supported", __func__);
159 __func__); 182 return -1;
160#endif 183#endif
161} 184}