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