chiark / gitweb /
52883fa8cde2d7ee34a1a7a83c0f19ac8af3eb3b
[elogind.git] / src / libsystemd / sd-bus / bus-socket.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <endian.h>
23 #include <assert.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26 #include <poll.h>
27 #include <byteswap.h>
28
29 #include "util.h"
30 #include "macro.h"
31 #include "missing.h"
32 #include "strv.h"
33 #include "utf8.h"
34 #include "sd-daemon.h"
35
36 #include "sd-bus.h"
37 #include "bus-socket.h"
38 #include "bus-internal.h"
39 #include "bus-message.h"
40
41 #define SNDBUF_SIZE (8*1024*1024)
42
43 static void iovec_advance(struct iovec iov[], unsigned *idx, size_t size) {
44
45         while (size > 0) {
46                 struct iovec *i = iov + *idx;
47
48                 if (i->iov_len > size) {
49                         i->iov_base = (uint8_t*) i->iov_base + size;
50                         i->iov_len -= size;
51                         return;
52                 }
53
54                 size -= i->iov_len;
55
56                 i->iov_base = NULL;
57                 i->iov_len = 0;
58
59                 (*idx) ++;
60         }
61 }
62
63 static int append_iovec(sd_bus_message *m, const void *p, size_t sz) {
64         assert(m);
65         assert(p);
66         assert(sz > 0);
67
68         m->iovec[m->n_iovec].iov_base = (void*) p;
69         m->iovec[m->n_iovec].iov_len = sz;
70         m->n_iovec++;
71
72         return 0;
73 }
74
75 static int bus_message_setup_iovec(sd_bus_message *m) {
76         struct bus_body_part *part;
77         unsigned n, i;
78         int r;
79
80         assert(m);
81         assert(m->sealed);
82
83         if (m->n_iovec > 0)
84                 return 0;
85
86         assert(!m->iovec);
87
88         n = 1 + m->n_body_parts;
89         if (n < ELEMENTSOF(m->iovec_fixed))
90                 m->iovec = m->iovec_fixed;
91         else {
92                 m->iovec = new(struct iovec, n);
93                 if (!m->iovec) {
94                         r = -ENOMEM;
95                         goto fail;
96                 }
97         }
98
99         r = append_iovec(m, m->header, BUS_MESSAGE_BODY_BEGIN(m));
100         if (r < 0)
101                 goto fail;
102
103         MESSAGE_FOREACH_PART(part, i, m)  {
104                 r = bus_body_part_map(part);
105                 if (r < 0)
106                         goto fail;
107
108                 r = append_iovec(m, part->data, part->size);
109                 if (r < 0)
110                         goto fail;
111         }
112
113         assert(n == m->n_iovec);
114
115         return 0;
116
117 fail:
118         m->poisoned = true;
119         return r;
120 }
121
122 bool bus_socket_auth_needs_write(sd_bus *b) {
123
124         unsigned i;
125
126         if (b->auth_index >= ELEMENTSOF(b->auth_iovec))
127                 return false;
128
129         for (i = b->auth_index; i < ELEMENTSOF(b->auth_iovec); i++) {
130                 struct iovec *j = b->auth_iovec + i;
131
132                 if (j->iov_len > 0)
133                         return true;
134         }
135
136         return false;
137 }
138
139 static int bus_socket_write_auth(sd_bus *b) {
140         ssize_t k;
141
142         assert(b);
143         assert(b->state == BUS_AUTHENTICATING);
144
145         if (!bus_socket_auth_needs_write(b))
146                 return 0;
147
148         if (b->prefer_writev)
149                 k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
150         else {
151                 struct msghdr mh;
152                 zero(mh);
153
154                 mh.msg_iov = b->auth_iovec + b->auth_index;
155                 mh.msg_iovlen = ELEMENTSOF(b->auth_iovec) - b->auth_index;
156
157                 k = sendmsg(b->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
158                 if (k < 0 && errno == ENOTSOCK) {
159                         b->prefer_writev = true;
160                         k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
161                 }
162         }
163
164         if (k < 0)
165                 return errno == EAGAIN ? 0 : -errno;
166
167         iovec_advance(b->auth_iovec, &b->auth_index, (size_t) k);
168         return 1;
169 }
170
171 static int bus_socket_auth_verify_client(sd_bus *b) {
172         char *e, *f, *start;
173         sd_id128_t peer;
174         unsigned i;
175         int r;
176
177         assert(b);
178
179         /* We expect two response lines: "OK" and possibly
180          * "AGREE_UNIX_FD" */
181
182         e = memmem(b->rbuffer, b->rbuffer_size, "\r\n", 2);
183         if (!e)
184                 return 0;
185
186         if (b->hello_flags & KDBUS_HELLO_ACCEPT_FD) {
187                 f = memmem(e + 2, b->rbuffer_size - (e - (char*) b->rbuffer) - 2, "\r\n", 2);
188                 if (!f)
189                         return 0;
190
191                 start = f + 2;
192         } else {
193                 f = NULL;
194                 start = e + 2;
195         }
196
197         /* Nice! We got all the lines we need. First check the OK
198          * line */
199
200         if (e - (char*) b->rbuffer != 3 + 32)
201                 return -EPERM;
202
203         if (memcmp(b->rbuffer, "OK ", 3))
204                 return -EPERM;
205
206         b->auth = b->anonymous_auth ? BUS_AUTH_ANONYMOUS : BUS_AUTH_EXTERNAL;
207
208         for (i = 0; i < 32; i += 2) {
209                 int x, y;
210
211                 x = unhexchar(((char*) b->rbuffer)[3 + i]);
212                 y = unhexchar(((char*) b->rbuffer)[3 + i + 1]);
213
214                 if (x < 0 || y < 0)
215                         return -EINVAL;
216
217                 peer.bytes[i/2] = ((uint8_t) x << 4 | (uint8_t) y);
218         }
219
220         if (!sd_id128_equal(b->server_id, SD_ID128_NULL) &&
221             !sd_id128_equal(b->server_id, peer))
222                 return -EPERM;
223
224         b->server_id = peer;
225
226         /* And possibly check the second line, too */
227
228         if (f)
229                 b->can_fds =
230                         (f - e == strlen("\r\nAGREE_UNIX_FD")) &&
231                         memcmp(e + 2, "AGREE_UNIX_FD", strlen("AGREE_UNIX_FD")) == 0;
232
233         b->rbuffer_size -= (start - (char*) b->rbuffer);
234         memmove(b->rbuffer, start, b->rbuffer_size);
235
236         r = bus_start_running(b);
237         if (r < 0)
238                 return r;
239
240         return 1;
241 }
242
243 static bool line_equals(const char *s, size_t m, const char *line) {
244         size_t l;
245
246         l = strlen(line);
247         if (l != m)
248                 return false;
249
250         return memcmp(s, line, l) == 0;
251 }
252
253 static bool line_begins(const char *s, size_t m, const char *word) {
254         size_t l;
255
256         l = strlen(word);
257         if (m < l)
258                 return false;
259
260         if (memcmp(s, word, l) != 0)
261                 return false;
262
263         return m == l || (m > l && s[l] == ' ');
264 }
265
266 static int verify_anonymous_token(sd_bus *b, const char *p, size_t l) {
267         _cleanup_free_ char *token = NULL;
268
269         if (!b->anonymous_auth)
270                 return 0;
271
272         if (l <= 0)
273                 return 1;
274
275         assert(p[0] == ' ');
276         p++; l--;
277
278         if (l % 2 != 0)
279                 return 0;
280         token = unhexmem(p, l);
281         if (!token)
282                 return -ENOMEM;
283
284         if (memchr(token, 0, l/2))
285                 return 0;
286
287         return !!utf8_is_valid(token);
288 }
289
290 static int verify_external_token(sd_bus *b, const char *p, size_t l) {
291         _cleanup_free_ char *token = NULL;
292         uid_t u;
293         int r;
294
295         /* We don't do any real authentication here. Instead, we if
296          * the owner of this bus wanted authentication he should have
297          * checked SO_PEERCRED before even creating the bus object. */
298
299         if (!b->anonymous_auth && !b->ucred_valid)
300                 return 0;
301
302         if (l <= 0)
303                 return 1;
304
305         assert(p[0] == ' ');
306         p++; l--;
307
308         if (l % 2 != 0)
309                 return 0;
310
311         token = unhexmem(p, l);
312         if (!token)
313                 return -ENOMEM;
314
315         if (memchr(token, 0, l/2))
316                 return 0;
317
318         r = parse_uid(token, &u);
319         if (r < 0)
320                 return 0;
321
322         /* We ignore the passed value if anonymous authentication is
323          * on anyway. */
324         if (!b->anonymous_auth && u != b->ucred.uid)
325                 return 0;
326
327         return 1;
328 }
329
330 static int bus_socket_auth_write(sd_bus *b, const char *t) {
331         char *p;
332         size_t l;
333
334         assert(b);
335         assert(t);
336
337         /* We only make use of the first iovec */
338         assert(b->auth_index == 0 || b->auth_index == 1);
339
340         l = strlen(t);
341         p = malloc(b->auth_iovec[0].iov_len + l);
342         if (!p)
343                 return -ENOMEM;
344
345         memcpy(p, b->auth_iovec[0].iov_base, b->auth_iovec[0].iov_len);
346         memcpy(p + b->auth_iovec[0].iov_len, t, l);
347
348         b->auth_iovec[0].iov_base = p;
349         b->auth_iovec[0].iov_len += l;
350
351         free(b->auth_buffer);
352         b->auth_buffer = p;
353         b->auth_index = 0;
354         return 0;
355 }
356
357 static int bus_socket_auth_write_ok(sd_bus *b) {
358         char t[3 + 32 + 2 + 1];
359
360         assert(b);
361
362         xsprintf(t, "OK " SD_ID128_FORMAT_STR "\r\n", SD_ID128_FORMAT_VAL(b->server_id));
363
364         return bus_socket_auth_write(b, t);
365 }
366
367 static int bus_socket_auth_verify_server(sd_bus *b) {
368         char *e;
369         const char *line;
370         size_t l;
371         bool processed = false;
372         int r;
373
374         assert(b);
375
376         if (b->rbuffer_size < 1)
377                 return 0;
378
379         /* First char must be a NUL byte */
380         if (*(char*) b->rbuffer != 0)
381                 return -EIO;
382
383         if (b->rbuffer_size < 3)
384                 return 0;
385
386         /* Begin with the first line */
387         if (b->auth_rbegin <= 0)
388                 b->auth_rbegin = 1;
389
390         for (;;) {
391                 /* Check if line is complete */
392                 line = (char*) b->rbuffer + b->auth_rbegin;
393                 e = memmem(line, b->rbuffer_size - b->auth_rbegin, "\r\n", 2);
394                 if (!e)
395                         return processed;
396
397                 l = e - line;
398
399                 if (line_begins(line, l, "AUTH ANONYMOUS")) {
400
401                         r = verify_anonymous_token(b, line + 14, l - 14);
402                         if (r < 0)
403                                 return r;
404                         if (r == 0)
405                                 r = bus_socket_auth_write(b, "REJECTED\r\n");
406                         else {
407                                 b->auth = BUS_AUTH_ANONYMOUS;
408                                 r = bus_socket_auth_write_ok(b);
409                         }
410
411                 } else if (line_begins(line, l, "AUTH EXTERNAL")) {
412
413                         r = verify_external_token(b, line + 13, l - 13);
414                         if (r < 0)
415                                 return r;
416                         if (r == 0)
417                                 r = bus_socket_auth_write(b, "REJECTED\r\n");
418                         else {
419                                 b->auth = BUS_AUTH_EXTERNAL;
420                                 r = bus_socket_auth_write_ok(b);
421                         }
422
423                 } else if (line_begins(line, l, "AUTH"))
424                         r = bus_socket_auth_write(b, "REJECTED EXTERNAL ANONYMOUS\r\n");
425                 else if (line_equals(line, l, "CANCEL") ||
426                          line_begins(line, l, "ERROR")) {
427
428                         b->auth = _BUS_AUTH_INVALID;
429                         r = bus_socket_auth_write(b, "REJECTED\r\n");
430
431                 } else if (line_equals(line, l, "BEGIN")) {
432
433                         if (b->auth == _BUS_AUTH_INVALID)
434                                 r = bus_socket_auth_write(b, "ERROR\r\n");
435                         else {
436                                 /* We can't leave from the auth phase
437                                  * before we haven't written
438                                  * everything queued, so let's check
439                                  * that */
440
441                                 if (bus_socket_auth_needs_write(b))
442                                         return 1;
443
444                                 b->rbuffer_size -= (e + 2 - (char*) b->rbuffer);
445                                 memmove(b->rbuffer, e + 2, b->rbuffer_size);
446                                 return bus_start_running(b);
447                         }
448
449                 } else if (line_begins(line, l, "DATA")) {
450
451                         if (b->auth == _BUS_AUTH_INVALID)
452                                 r = bus_socket_auth_write(b, "ERROR\r\n");
453                         else {
454                                 if (b->auth == BUS_AUTH_ANONYMOUS)
455                                         r = verify_anonymous_token(b, line + 4, l - 4);
456                                 else
457                                         r = verify_external_token(b, line + 4, l - 4);
458
459                                 if (r < 0)
460                                         return r;
461                                 if (r == 0) {
462                                         b->auth = _BUS_AUTH_INVALID;
463                                         r = bus_socket_auth_write(b, "REJECTED\r\n");
464                                 } else
465                                         r = bus_socket_auth_write_ok(b);
466                         }
467                 } else if (line_equals(line, l, "NEGOTIATE_UNIX_FD")) {
468                         if (b->auth == _BUS_AUTH_INVALID || !(b->hello_flags & KDBUS_HELLO_ACCEPT_FD))
469                                 r = bus_socket_auth_write(b, "ERROR\r\n");
470                         else {
471                                 b->can_fds = true;
472                                 r = bus_socket_auth_write(b, "AGREE_UNIX_FD\r\n");
473                         }
474                 } else
475                         r = bus_socket_auth_write(b, "ERROR\r\n");
476
477                 if (r < 0)
478                         return r;
479
480                 b->auth_rbegin = e + 2 - (char*) b->rbuffer;
481
482                 processed = true;
483         }
484 }
485
486 static int bus_socket_auth_verify(sd_bus *b) {
487         assert(b);
488
489         if (b->is_server)
490                 return bus_socket_auth_verify_server(b);
491         else
492                 return bus_socket_auth_verify_client(b);
493 }
494
495 static int bus_socket_read_auth(sd_bus *b) {
496         struct msghdr mh;
497         struct iovec iov;
498         size_t n;
499         ssize_t k;
500         int r;
501         void *p;
502         union {
503                 struct cmsghdr cmsghdr;
504                 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
505                             CMSG_SPACE(sizeof(struct ucred)) +
506                             CMSG_SPACE(NAME_MAX)]; /*selinux label */
507         } control;
508         struct cmsghdr *cmsg;
509         bool handle_cmsg = false;
510
511         assert(b);
512         assert(b->state == BUS_AUTHENTICATING);
513
514         r = bus_socket_auth_verify(b);
515         if (r != 0)
516                 return r;
517
518         n = MAX(256u, b->rbuffer_size * 2);
519
520         if (n > BUS_AUTH_SIZE_MAX)
521                 n = BUS_AUTH_SIZE_MAX;
522
523         if (b->rbuffer_size >= n)
524                 return -ENOBUFS;
525
526         p = realloc(b->rbuffer, n);
527         if (!p)
528                 return -ENOMEM;
529
530         b->rbuffer = p;
531
532         zero(iov);
533         iov.iov_base = (uint8_t*) b->rbuffer + b->rbuffer_size;
534         iov.iov_len = n - b->rbuffer_size;
535
536         if (b->prefer_readv)
537                 k = readv(b->input_fd, &iov, 1);
538         else {
539                 zero(mh);
540                 mh.msg_iov = &iov;
541                 mh.msg_iovlen = 1;
542                 mh.msg_control = &control;
543                 mh.msg_controllen = sizeof(control);
544
545                 k = recvmsg(b->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
546                 if (k < 0 && errno == ENOTSOCK) {
547                         b->prefer_readv = true;
548                         k = readv(b->input_fd, &iov, 1);
549                 } else
550                         handle_cmsg = true;
551         }
552         if (k < 0)
553                 return errno == EAGAIN ? 0 : -errno;
554         if (k == 0)
555                 return -ECONNRESET;
556
557         b->rbuffer_size += k;
558
559         if (handle_cmsg) {
560                 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
561                         if (cmsg->cmsg_level == SOL_SOCKET &&
562                             cmsg->cmsg_type == SCM_RIGHTS) {
563                                 int j;
564
565                                 /* Whut? We received fds during the auth
566                                  * protocol? Somebody is playing games with
567                                  * us. Close them all, and fail */
568                                 j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
569                                 close_many((int*) CMSG_DATA(cmsg), j);
570                                 return -EIO;
571
572                         } else if (cmsg->cmsg_level == SOL_SOCKET &&
573                                    cmsg->cmsg_type == SCM_CREDENTIALS &&
574                                    cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
575
576                                 /* Ignore bogus data, which we might
577                                  * get on socketpair() sockets */
578                                 if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
579                                         memcpy(&b->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
580                                         b->ucred_valid = true;
581                                 }
582
583                         } else if (cmsg->cmsg_level == SOL_SOCKET &&
584                                    cmsg->cmsg_type == SCM_SECURITY) {
585
586                                 size_t l;
587
588                                 l = cmsg->cmsg_len - CMSG_LEN(0);
589                                 if (l > 0) {
590                                         memcpy(&b->label, CMSG_DATA(cmsg), l);
591                                         b->label[l] = 0;
592                                 }
593                         }
594                 }
595         }
596
597         r = bus_socket_auth_verify(b);
598         if (r != 0)
599                 return r;
600
601         return 1;
602 }
603
604 void bus_socket_setup(sd_bus *b) {
605         int enable;
606
607         assert(b);
608
609         /* Enable SO_PASSCRED + SO_PASSEC. We try this on any
610          * socket, just in case. */
611         enable = !b->bus_client;
612         (void)setsockopt(b->input_fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
613
614         enable = !b->bus_client && (b->attach_flags & KDBUS_ATTACH_SECLABEL);
615         (void)setsockopt(b->input_fd, SOL_SOCKET, SO_PASSSEC, &enable, sizeof(enable));
616
617         /* Increase the buffers to 8 MB */
618         fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE);
619         fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE);
620
621         b->is_kernel = false;
622         b->message_version = 1;
623         b->message_endian = 0;
624 }
625
626 static void bus_get_peercred(sd_bus *b) {
627         assert(b);
628
629         /* Get the peer for socketpair() sockets */
630         b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
631 }
632
633 static int bus_socket_start_auth_client(sd_bus *b) {
634         size_t l;
635         const char *auth_suffix, *auth_prefix;
636
637         assert(b);
638
639         if (b->anonymous_auth) {
640                 auth_prefix = "\0AUTH ANONYMOUS ";
641
642                 /* For ANONYMOUS auth we send some arbitrary "trace" string */
643                 l = 9;
644                 b->auth_buffer = hexmem("anonymous", l);
645         } else {
646                 char text[DECIMAL_STR_MAX(uid_t) + 1];
647
648                 auth_prefix = "\0AUTH EXTERNAL ";
649
650                 xsprintf(text, UID_FMT, geteuid());
651
652                 l = strlen(text);
653                 b->auth_buffer = hexmem(text, l);
654         }
655
656         if (!b->auth_buffer)
657                 return -ENOMEM;
658
659         if (b->hello_flags & KDBUS_HELLO_ACCEPT_FD)
660                 auth_suffix = "\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n";
661         else
662                 auth_suffix = "\r\nBEGIN\r\n";
663
664         b->auth_iovec[0].iov_base = (void*) auth_prefix;
665         b->auth_iovec[0].iov_len = 1 + strlen(auth_prefix + 1);
666         b->auth_iovec[1].iov_base = (void*) b->auth_buffer;
667         b->auth_iovec[1].iov_len = l * 2;
668         b->auth_iovec[2].iov_base = (void*) auth_suffix;
669         b->auth_iovec[2].iov_len = strlen(auth_suffix);
670
671         return bus_socket_write_auth(b);
672 }
673
674 int bus_socket_start_auth(sd_bus *b) {
675         assert(b);
676
677         bus_get_peercred(b);
678
679         b->state = BUS_AUTHENTICATING;
680         b->auth_timeout = now(CLOCK_MONOTONIC) + BUS_DEFAULT_TIMEOUT;
681
682         if (sd_is_socket(b->input_fd, AF_UNIX, 0, 0) <= 0)
683                 b->hello_flags &= ~KDBUS_HELLO_ACCEPT_FD;
684
685         if (b->output_fd != b->input_fd)
686                 if (sd_is_socket(b->output_fd, AF_UNIX, 0, 0) <= 0)
687                         b->hello_flags &= ~KDBUS_HELLO_ACCEPT_FD;
688
689         if (b->is_server)
690                 return bus_socket_read_auth(b);
691         else
692                 return bus_socket_start_auth_client(b);
693 }
694
695 int bus_socket_connect(sd_bus *b) {
696         int r;
697
698         assert(b);
699         assert(b->input_fd < 0);
700         assert(b->output_fd < 0);
701         assert(b->sockaddr.sa.sa_family != AF_UNSPEC);
702
703         b->input_fd = socket(b->sockaddr.sa.sa_family, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
704         if (b->input_fd < 0)
705                 return -errno;
706
707         b->output_fd = b->input_fd;
708
709         bus_socket_setup(b);
710
711         r = connect(b->input_fd, &b->sockaddr.sa, b->sockaddr_size);
712         if (r < 0) {
713                 if (errno == EINPROGRESS)
714                         return 1;
715
716                 return -errno;
717         }
718
719         return bus_socket_start_auth(b);
720 }
721
722 int bus_socket_exec(sd_bus *b) {
723         int s[2], r;
724         pid_t pid;
725
726         assert(b);
727         assert(b->input_fd < 0);
728         assert(b->output_fd < 0);
729         assert(b->exec_path);
730
731         r = socketpair(AF_UNIX, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0, s);
732         if (r < 0)
733                 return -errno;
734
735         pid = fork();
736         if (pid < 0) {
737                 safe_close_pair(s);
738                 return -errno;
739         }
740         if (pid == 0) {
741                 /* Child */
742
743                 reset_all_signal_handlers();
744
745                 close_all_fds(s+1, 1);
746
747                 assert_se(dup3(s[1], STDIN_FILENO, 0) == STDIN_FILENO);
748                 assert_se(dup3(s[1], STDOUT_FILENO, 0) == STDOUT_FILENO);
749
750                 if (s[1] != STDIN_FILENO && s[1] != STDOUT_FILENO)
751                         safe_close(s[1]);
752
753                 fd_cloexec(STDIN_FILENO, false);
754                 fd_cloexec(STDOUT_FILENO, false);
755                 fd_nonblock(STDIN_FILENO, false);
756                 fd_nonblock(STDOUT_FILENO, false);
757
758                 if (b->exec_argv)
759                         execvp(b->exec_path, b->exec_argv);
760                 else {
761                         const char *argv[] = { b->exec_path, NULL };
762                         execvp(b->exec_path, (char**) argv);
763                 }
764
765                 _exit(EXIT_FAILURE);
766         }
767
768         safe_close(s[1]);
769         b->output_fd = b->input_fd = s[0];
770
771         bus_socket_setup(b);
772
773         return bus_socket_start_auth(b);
774 }
775
776 int bus_socket_take_fd(sd_bus *b) {
777         assert(b);
778
779         bus_socket_setup(b);
780
781         return bus_socket_start_auth(b);
782 }
783
784 int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
785         struct iovec *iov;
786         ssize_t k;
787         size_t n;
788         unsigned j;
789         int r;
790
791         assert(bus);
792         assert(m);
793         assert(idx);
794         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
795
796         if (*idx >= BUS_MESSAGE_SIZE(m))
797                 return 0;
798
799         r = bus_message_setup_iovec(m);
800         if (r < 0)
801                 return r;
802
803         n = m->n_iovec * sizeof(struct iovec);
804         iov = alloca(n);
805         memcpy(iov, m->iovec, n);
806
807         j = 0;
808         iovec_advance(iov, &j, *idx);
809
810         if (bus->prefer_writev)
811                 k = writev(bus->output_fd, iov, m->n_iovec);
812         else {
813                 struct msghdr mh;
814                 zero(mh);
815
816                 if (m->n_fds > 0) {
817                         struct cmsghdr *control;
818                         control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));
819
820                         mh.msg_control = control;
821                         control->cmsg_level = SOL_SOCKET;
822                         control->cmsg_type = SCM_RIGHTS;
823                         mh.msg_controllen = control->cmsg_len = CMSG_LEN(sizeof(int) * m->n_fds);
824                         memcpy(CMSG_DATA(control), m->fds, sizeof(int) * m->n_fds);
825                 }
826
827                 mh.msg_iov = iov;
828                 mh.msg_iovlen = m->n_iovec;
829
830                 k = sendmsg(bus->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
831                 if (k < 0 && errno == ENOTSOCK) {
832                         bus->prefer_writev = true;
833                         k = writev(bus->output_fd, iov, m->n_iovec);
834                 }
835         }
836
837         if (k < 0)
838                 return errno == EAGAIN ? 0 : -errno;
839
840         *idx += (size_t) k;
841         return 1;
842 }
843
844 static int bus_socket_read_message_need(sd_bus *bus, size_t *need) {
845         uint32_t a, b;
846         uint8_t e;
847         uint64_t sum;
848
849         assert(bus);
850         assert(need);
851         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
852
853         if (bus->rbuffer_size < sizeof(struct bus_header)) {
854                 *need = sizeof(struct bus_header) + 8;
855
856                 /* Minimum message size:
857                  *
858                  * Header +
859                  *
860                  *  Method Call: +2 string headers
861                  *       Signal: +3 string headers
862                  * Method Error: +1 string headers
863                  *               +1 uint32 headers
864                  * Method Reply: +1 uint32 headers
865                  *
866                  * A string header is at least 9 bytes
867                  * A uint32 header is at least 8 bytes
868                  *
869                  * Hence the minimum message size of a valid message
870                  * is header + 8 bytes */
871
872                 return 0;
873         }
874
875         a = ((const uint32_t*) bus->rbuffer)[1];
876         b = ((const uint32_t*) bus->rbuffer)[3];
877
878         e = ((const uint8_t*) bus->rbuffer)[0];
879         if (e == BUS_LITTLE_ENDIAN) {
880                 a = le32toh(a);
881                 b = le32toh(b);
882         } else if (e == BUS_BIG_ENDIAN) {
883                 a = be32toh(a);
884                 b = be32toh(b);
885         } else
886                 return -EBADMSG;
887
888         sum = (uint64_t) sizeof(struct bus_header) + (uint64_t) ALIGN_TO(b, 8) + (uint64_t) a;
889         if (sum >= BUS_MESSAGE_SIZE_MAX)
890                 return -ENOBUFS;
891
892         *need = (size_t) sum;
893         return 0;
894 }
895
896 static int bus_socket_make_message(sd_bus *bus, size_t size) {
897         sd_bus_message *t;
898         void *b;
899         int r;
900
901         assert(bus);
902         assert(bus->rbuffer_size >= size);
903         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
904
905         r = bus_rqueue_make_room(bus);
906         if (r < 0)
907                 return r;
908
909         if (bus->rbuffer_size > size) {
910                 b = memdup((const uint8_t*) bus->rbuffer + size,
911                            bus->rbuffer_size - size);
912                 if (!b)
913                         return -ENOMEM;
914         } else
915                 b = NULL;
916
917         r = bus_message_from_malloc(bus,
918                                     bus->rbuffer, size,
919                                     bus->fds, bus->n_fds,
920                                     !bus->bus_client && bus->ucred_valid ? &bus->ucred : NULL,
921                                     !bus->bus_client && bus->label[0] ? bus->label : NULL,
922                                     &t);
923         if (r < 0) {
924                 free(b);
925                 return r;
926         }
927
928         bus->rbuffer = b;
929         bus->rbuffer_size -= size;
930
931         bus->fds = NULL;
932         bus->n_fds = 0;
933
934         bus->rqueue[bus->rqueue_size++] = t;
935
936         return 1;
937 }
938
939 int bus_socket_read_message(sd_bus *bus) {
940         struct msghdr mh;
941         struct iovec iov;
942         ssize_t k;
943         size_t need;
944         int r;
945         void *b;
946         union {
947                 struct cmsghdr cmsghdr;
948                 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
949                             CMSG_SPACE(sizeof(struct ucred)) +
950                             CMSG_SPACE(NAME_MAX)]; /*selinux label */
951         } control;
952         struct cmsghdr *cmsg;
953         bool handle_cmsg = false;
954
955         assert(bus);
956         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
957
958         r = bus_socket_read_message_need(bus, &need);
959         if (r < 0)
960                 return r;
961
962         if (bus->rbuffer_size >= need)
963                 return bus_socket_make_message(bus, need);
964
965         b = realloc(bus->rbuffer, need);
966         if (!b)
967                 return -ENOMEM;
968
969         bus->rbuffer = b;
970
971         zero(iov);
972         iov.iov_base = (uint8_t*) bus->rbuffer + bus->rbuffer_size;
973         iov.iov_len = need - bus->rbuffer_size;
974
975         if (bus->prefer_readv)
976                 k = readv(bus->input_fd, &iov, 1);
977         else {
978                 zero(mh);
979                 mh.msg_iov = &iov;
980                 mh.msg_iovlen = 1;
981                 mh.msg_control = &control;
982                 mh.msg_controllen = sizeof(control);
983
984                 k = recvmsg(bus->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
985                 if (k < 0 && errno == ENOTSOCK) {
986                         bus->prefer_readv = true;
987                         k = readv(bus->input_fd, &iov, 1);
988                 } else
989                         handle_cmsg = true;
990         }
991         if (k < 0)
992                 return errno == EAGAIN ? 0 : -errno;
993         if (k == 0)
994                 return -ECONNRESET;
995
996         bus->rbuffer_size += k;
997
998         if (handle_cmsg) {
999                 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
1000                         if (cmsg->cmsg_level == SOL_SOCKET &&
1001                             cmsg->cmsg_type == SCM_RIGHTS) {
1002                                 int n, *f;
1003
1004                                 n = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
1005
1006                                 if (!bus->can_fds) {
1007                                         /* Whut? We received fds but this
1008                                          * isn't actually enabled? Close them,
1009                                          * and fail */
1010
1011                                         close_many((int*) CMSG_DATA(cmsg), n);
1012                                         return -EIO;
1013                                 }
1014
1015                                 f = realloc(bus->fds, sizeof(int) + (bus->n_fds + n));
1016                                 if (!f) {
1017                                         close_many((int*) CMSG_DATA(cmsg), n);
1018                                         return -ENOMEM;
1019                                 }
1020
1021                                 memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
1022                                 bus->fds = f;
1023                                 bus->n_fds += n;
1024                         } else if (cmsg->cmsg_level == SOL_SOCKET &&
1025                                    cmsg->cmsg_type == SCM_CREDENTIALS &&
1026                                    cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
1027
1028                                 /* Ignore bogus data, which we might
1029                                  * get on socketpair() sockets */
1030                                 if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
1031                                         memcpy(&bus->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
1032                                         bus->ucred_valid = true;
1033                                 }
1034
1035                         } else if (cmsg->cmsg_level == SOL_SOCKET &&
1036                                    cmsg->cmsg_type == SCM_SECURITY) {
1037
1038                                 size_t l;
1039                                 l = cmsg->cmsg_len - CMSG_LEN(0);
1040                                 if (l > 0) {
1041                                         memcpy(&bus->label, CMSG_DATA(cmsg), l);
1042                                         bus->label[l] = 0;
1043                                 }
1044                         }
1045                 }
1046         }
1047
1048         r = bus_socket_read_message_need(bus, &need);
1049         if (r < 0)
1050                 return r;
1051
1052         if (bus->rbuffer_size >= need)
1053                 return bus_socket_make_message(bus, need);
1054
1055         return 1;
1056 }
1057
1058 int bus_socket_process_opening(sd_bus *b) {
1059         int error = 0;
1060         socklen_t slen = sizeof(error);
1061         struct pollfd p = {
1062                 .fd = b->output_fd,
1063                 .events = POLLOUT,
1064         };
1065         int r;
1066
1067         assert(b->state == BUS_OPENING);
1068
1069         r = poll(&p, 1, 0);
1070         if (r < 0)
1071                 return -errno;
1072
1073         if (!(p.revents & (POLLOUT|POLLERR|POLLHUP)))
1074                 return 0;
1075
1076         r = getsockopt(b->output_fd, SOL_SOCKET, SO_ERROR, &error, &slen);
1077         if (r < 0)
1078                 b->last_connect_error = errno;
1079         else if (error != 0)
1080                 b->last_connect_error = error;
1081         else if (p.revents & (POLLERR|POLLHUP))
1082                 b->last_connect_error = ECONNREFUSED;
1083         else
1084                 return bus_socket_start_auth(b);
1085
1086         return bus_next_address(b);
1087 }
1088
1089 int bus_socket_process_authenticating(sd_bus *b) {
1090         int r;
1091
1092         assert(b);
1093         assert(b->state == BUS_AUTHENTICATING);
1094
1095         if (now(CLOCK_MONOTONIC) >= b->auth_timeout)
1096                 return -ETIMEDOUT;
1097
1098         r = bus_socket_write_auth(b);
1099         if (r != 0)
1100                 return r;
1101
1102         return bus_socket_read_auth(b);
1103 }