diff options
Diffstat (limited to 'monitor_fdpass.c')
-rw-r--r-- | monitor_fdpass.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/monitor_fdpass.c b/monitor_fdpass.c index 28296d64b..3d3a78391 100644 --- a/monitor_fdpass.c +++ b/monitor_fdpass.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: monitor_fdpass.c,v 1.17 2008/03/24 16:11:07 deraadt Exp $ */ | 1 | /* $OpenBSD: monitor_fdpass.c,v 1.18 2008/11/30 11:59:26 dtucker 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. |
@@ -69,17 +69,16 @@ mm_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)) |
71 | struct msghdr msg; | 71 | struct msghdr msg; |
72 | struct iovec vec; | ||
73 | char ch = '\0'; | ||
74 | ssize_t n; | ||
75 | #ifndef HAVE_ACCRIGHTS_IN_MSGHDR | 72 | #ifndef HAVE_ACCRIGHTS_IN_MSGHDR |
76 | union { | 73 | union { |
77 | struct cmsghdr hdr; | 74 | struct cmsghdr hdr; |
78 | char tmp[CMSG_SPACE(sizeof(int))]; | ||
79 | char buf[CMSG_SPACE(sizeof(int))]; | 75 | char buf[CMSG_SPACE(sizeof(int))]; |
80 | } cmsgbuf; | 76 | } cmsgbuf; |
81 | struct cmsghdr *cmsg; | 77 | struct cmsghdr *cmsg; |
82 | #endif | 78 | #endif |
79 | struct iovec vec; | ||
80 | char ch = '\0'; | ||
81 | ssize_t n; | ||
83 | 82 | ||
84 | memset(&msg, 0, sizeof(msg)); | 83 | memset(&msg, 0, sizeof(msg)); |
85 | #ifdef HAVE_ACCRIGHTS_IN_MSGHDR | 84 | #ifdef HAVE_ACCRIGHTS_IN_MSGHDR |
@@ -100,7 +99,10 @@ mm_send_fd(int sock, int fd) | |||
100 | msg.msg_iov = &vec; | 99 | msg.msg_iov = &vec; |
101 | msg.msg_iovlen = 1; | 100 | msg.msg_iovlen = 1; |
102 | 101 | ||
103 | if ((n = sendmsg(sock, &msg, 0)) == -1) { | 102 | while ((n = sendmsg(sock, &msg, 0)) == -1 && (errno == EAGAIN || |
103 | errno == EINTR)) | ||
104 | debug3("%s: sendmsg(%d): %s", __func__, fd, strerror(errno)); | ||
105 | if (n == -1) { | ||
104 | error("%s: sendmsg(%d): %s", __func__, fd, | 106 | error("%s: sendmsg(%d): %s", __func__, fd, |
105 | strerror(errno)); | 107 | strerror(errno)); |
106 | return -1; | 108 | return -1; |
@@ -123,10 +125,6 @@ mm_receive_fd(int sock) | |||
123 | { | 125 | { |
124 | #if defined(HAVE_RECVMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR)) | 126 | #if defined(HAVE_RECVMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR)) |
125 | struct msghdr msg; | 127 | struct msghdr msg; |
126 | struct iovec vec; | ||
127 | ssize_t n; | ||
128 | char ch; | ||
129 | int fd; | ||
130 | #ifndef HAVE_ACCRIGHTS_IN_MSGHDR | 128 | #ifndef HAVE_ACCRIGHTS_IN_MSGHDR |
131 | union { | 129 | union { |
132 | struct cmsghdr hdr; | 130 | struct cmsghdr hdr; |
@@ -134,6 +132,10 @@ mm_receive_fd(int sock) | |||
134 | } cmsgbuf; | 132 | } cmsgbuf; |
135 | struct cmsghdr *cmsg; | 133 | struct cmsghdr *cmsg; |
136 | #endif | 134 | #endif |
135 | struct iovec vec; | ||
136 | ssize_t n; | ||
137 | char ch; | ||
138 | int fd; | ||
137 | 139 | ||
138 | memset(&msg, 0, sizeof(msg)); | 140 | memset(&msg, 0, sizeof(msg)); |
139 | vec.iov_base = &ch; | 141 | vec.iov_base = &ch; |
@@ -148,10 +150,14 @@ mm_receive_fd(int sock) | |||
148 | msg.msg_controllen = sizeof(cmsgbuf.buf); | 150 | msg.msg_controllen = sizeof(cmsgbuf.buf); |
149 | #endif | 151 | #endif |
150 | 152 | ||
151 | if ((n = recvmsg(sock, &msg, 0)) == -1) { | 153 | while ((n = recvmsg(sock, &msg, 0)) == -1 && (errno == EAGAIN || |
154 | errno == EINTR)) | ||
155 | debug3("%s: recvmsg: %s", __func__, strerror(errno)); | ||
156 | if (n == -1) { | ||
152 | error("%s: recvmsg: %s", __func__, strerror(errno)); | 157 | error("%s: recvmsg: %s", __func__, strerror(errno)); |
153 | return -1; | 158 | return -1; |
154 | } | 159 | } |
160 | |||
155 | if (n != 1) { | 161 | if (n != 1) { |
156 | error("%s: recvmsg: expected received 1 got %ld", | 162 | error("%s: recvmsg: expected received 1 got %ld", |
157 | __func__, (long)n); | 163 | __func__, (long)n); |
@@ -169,6 +175,7 @@ mm_receive_fd(int sock) | |||
169 | error("%s: no message header", __func__); | 175 | error("%s: no message header", __func__); |
170 | return -1; | 176 | return -1; |
171 | } | 177 | } |
178 | |||
172 | if (!cmsg_type_is_broken() && cmsg->cmsg_type != SCM_RIGHTS) { | 179 | if (!cmsg_type_is_broken() && cmsg->cmsg_type != SCM_RIGHTS) { |
173 | error("%s: expected type %d got %d", __func__, | 180 | error("%s: expected type %d got %d", __func__, |
174 | SCM_RIGHTS, cmsg->cmsg_type); | 181 | SCM_RIGHTS, cmsg->cmsg_type); |