• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemd / systemd / 14815796853

02 May 2025 11:41AM UTC coverage: 72.24% (-0.003%) from 72.243%
14815796853

push

github

web-flow
Various changes to prepare for running IWYU on the repository (#37319)

These are various commits that were required to get things compiling
after running IWYU. I think all of them make sense on their own, hence
this split PR to merge them ahead of time.

81 of 96 new or added lines in 48 files covered. (84.38%)

209 existing lines in 39 files now uncovered.

297219 of 411432 relevant lines covered (72.24%)

693693.2 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

55.47
/src/core/socket.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include <arpa/inet.h>
4
#include <errno.h>
5
#include <fcntl.h>
6
#include <linux/sctp.h>
7
#include <mqueue.h>
8
#include <netinet/tcp.h>
9
#include <sys/epoll.h>
10
#include <sys/stat.h>
11
#include <unistd.h>
12

13
#include "alloc-util.h"
14
#include "bpf-firewall.h"
15
#include "bus-error.h"
16
#include "bus-util.h"
17
#include "chase.h"
18
#include "constants.h"
19
#include "copy.h"
20
#include "dbus-socket.h"
21
#include "dbus-unit.h"
22
#include "errno-list.h"
23
#include "exit-status.h"
24
#include "fd-util.h"
25
#include "format-util.h"
26
#include "in-addr-util.h"
27
#include "io-util.h"
28
#include "ip-protocol-list.h"
29
#include "label-util.h"
30
#include "log.h"
31
#include "manager.h"
32
#include "mkdir-label.h"
33
#include "parse-util.h"
34
#include "path-util.h"
35
#include "pidfd-util.h"
36
#include "process-util.h"
37
#include "recurse-dir.h"
38
#include "selinux-util.h"
39
#include "serialize.h"
40
#include "service.h"
41
#include "signal-util.h"
42
#include "smack-util.h"
43
#include "socket.h"
44
#include "socket-netlink.h"
45
#include "special.h"
46
#include "string-table.h"
47
#include "string-util.h"
48
#include "strv.h"
49
#include "unit.h"
50
#include "unit-name.h"
51
#include "user-util.h"
52

53
struct SocketPeer {
54
        unsigned n_ref;
55

56
        Socket *socket;
57
        union sockaddr_union peer;
58
        socklen_t peer_salen;
59
        struct ucred peer_cred;
60
};
61

62
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
63
        [SOCKET_DEAD]             = UNIT_INACTIVE,
64
        [SOCKET_START_PRE]        = UNIT_ACTIVATING,
65
        [SOCKET_START_OPEN]       = UNIT_ACTIVATING,
66
        [SOCKET_START_CHOWN]      = UNIT_ACTIVATING,
67
        [SOCKET_START_POST]       = UNIT_ACTIVATING,
68
        [SOCKET_LISTENING]        = UNIT_ACTIVE,
69
        [SOCKET_RUNNING]          = UNIT_ACTIVE,
70
        [SOCKET_STOP_PRE]         = UNIT_DEACTIVATING,
71
        [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
72
        [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
73
        [SOCKET_STOP_POST]        = UNIT_DEACTIVATING,
74
        [SOCKET_FINAL_SIGTERM]    = UNIT_DEACTIVATING,
75
        [SOCKET_FINAL_SIGKILL]    = UNIT_DEACTIVATING,
76
        [SOCKET_FAILED]           = UNIT_FAILED,
77
        [SOCKET_CLEANING]         = UNIT_MAINTENANCE,
78
};
79

80
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
81
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
82

83
static bool SOCKET_STATE_WITH_PROCESS(SocketState state) {
10,184✔
84
        return IN_SET(state,
10,184✔
85
                      SOCKET_START_PRE,
86
                      SOCKET_START_CHOWN,
87
                      SOCKET_START_POST,
88
                      SOCKET_STOP_PRE,
89
                      SOCKET_STOP_PRE_SIGTERM,
90
                      SOCKET_STOP_PRE_SIGKILL,
91
                      SOCKET_STOP_POST,
92
                      SOCKET_FINAL_SIGTERM,
93
                      SOCKET_FINAL_SIGKILL,
94
                      SOCKET_CLEANING);
95
}
96

97
static bool SOCKET_SERVICE_IS_ACTIVE(Service *s, bool allow_finalize) {
3,987✔
98
        assert(s);
3,987✔
99

100
        /* If unit_active_state() reports inactive/failed then it's all good, otherwise we need to
101
         * manually exclude SERVICE_AUTO_RESTART and SERVICE_AUTO_RESTART_QUEUED, in which cases
102
         * the start job hasn't been enqueued/run, but are only placeholders in order to allow
103
         * canceling auto restart. */
104

105
        if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(UNIT(s))))
3,987✔
106
                return false;
107

108
        if (IN_SET(s->state, SERVICE_AUTO_RESTART, SERVICE_AUTO_RESTART_QUEUED))
1,430✔
109
                return false;
110

111
        if (allow_finalize && IN_SET(s->state, SERVICE_FINAL_SIGTERM, SERVICE_FINAL_SIGKILL, SERVICE_CLEANING))
1,421✔
112
                return false;
×
113

114
        return true;
115
}
116

117
static void socket_init(Unit *u) {
5,339✔
118
        Socket *s = ASSERT_PTR(SOCKET(u));
5,339✔
119

120
        assert(u->load_state == UNIT_STUB);
5,339✔
121

122
        s->backlog = SOMAXCONN_DELUXE;
5,339✔
123
        s->timeout_usec = u->manager->defaults.timeout_start_usec;
5,339✔
124
        s->directory_mode = 0755;
5,339✔
125
        s->socket_mode = 0666;
5,339✔
126

127
        s->max_connections = 64;
5,339✔
128

129
        s->priority = -1;
5,339✔
130
        s->ip_tos = -1;
5,339✔
131
        s->ip_ttl = -1;
5,339✔
132
        s->mark = -1;
5,339✔
133

134
        s->exec_context.std_output = u->manager->defaults.std_output;
5,339✔
135
        s->exec_context.std_error = u->manager->defaults.std_error;
5,339✔
136

137
        s->control_pid = PIDREF_NULL;
5,339✔
138
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
5,339✔
139

140
        s->trigger_limit = RATELIMIT_OFF;
5,339✔
141

142
        s->poll_limit = RATELIMIT_OFF;
5,339✔
143
}
5,339✔
144

145
static void socket_unwatch_control_pid(Socket *s) {
23,853✔
146
        assert(s);
23,853✔
147
        unit_unwatch_pidref_done(UNIT(s), &s->control_pid);
23,853✔
148
}
23,853✔
149

150
static void socket_port_close_auxiliary_fds(SocketPort *p) {
7,622✔
151
        assert(p);
7,622✔
152

153
        close_many(p->auxiliary_fds, p->n_auxiliary_fds);
7,622✔
154
        p->auxiliary_fds = mfree(p->auxiliary_fds);
7,622✔
155
        p->n_auxiliary_fds = 0;
7,622✔
156
}
7,622✔
157

158
SocketPort* socket_port_free(SocketPort *p) {
5,663✔
159
        if (!p)
5,663✔
160
                return NULL;
161

162
        sd_event_source_unref(p->event_source);
5,663✔
163

164
        socket_port_close_auxiliary_fds(p);
5,663✔
165
        safe_close(p->fd);
5,663✔
166
        free(p->path);
5,663✔
167

168
        return mfree(p);
5,663✔
169
}
170

171
void socket_free_ports(Socket *s) {
5,339✔
172
        assert(s);
5,339✔
173

174
        LIST_CLEAR(port, s->ports, socket_port_free);
11,002✔
175
}
5,339✔
176

177
static void socket_done(Unit *u) {
5,339✔
178
        Socket *s = ASSERT_PTR(SOCKET(u));
5,339✔
179
        SocketPeer *p;
5,339✔
180

181
        socket_free_ports(s);
5,339✔
182

183
        while ((p = set_steal_first(s->peers_by_address)))
5,339✔
184
                p->socket = NULL;
×
185

186
        s->peers_by_address = set_free(s->peers_by_address);
5,339✔
187

188
        s->exec_runtime = exec_runtime_free(s->exec_runtime);
5,339✔
189

190
        exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
5,339✔
191
        s->control_command = NULL;
5,339✔
192

193
        socket_unwatch_control_pid(s);
5,339✔
194

195
        unit_ref_unset(&s->service);
5,339✔
196

197
        s->tcp_congestion = mfree(s->tcp_congestion);
5,339✔
198
        s->bind_to_device = mfree(s->bind_to_device);
5,339✔
199

200
        s->smack = mfree(s->smack);
5,339✔
201
        s->smack_ip_in = mfree(s->smack_ip_in);
5,339✔
202
        s->smack_ip_out = mfree(s->smack_ip_out);
5,339✔
203

204
        strv_free(s->symlinks);
5,339✔
205

206
        s->user = mfree(s->user);
5,339✔
207
        s->group = mfree(s->group);
5,339✔
208

209
        s->fdname = mfree(s->fdname);
5,339✔
210

211
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
5,339✔
212
}
5,339✔
213

214
static int socket_arm_timer(Socket *s, bool relative, usec_t usec) {
172✔
215
        assert(s);
172✔
216

217
        return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, socket_dispatch_timer);
172✔
218
}
219

220
static bool have_non_accept_socket(Socket *s) {
6,534✔
221
        assert(s);
6,534✔
222

223
        if (!s->accept)
6,534✔
224
                return true;
225

226
        LIST_FOREACH(port, p, s->ports) {
4,792✔
227

228
                if (p->type != SOCKET_SOCKET)
2,396✔
229
                        return true;
230

231
                if (!socket_address_can_accept(&p->address))
2,396✔
232
                        return true;
233
        }
234

235
        return false;
236
}
237

238
static int socket_add_mount_dependencies(Socket *s) {
5,336✔
239
        int r;
5,336✔
240

241
        assert(s);
5,336✔
242

243
        LIST_FOREACH(port, p, s->ports) {
10,999✔
244
                const char *path = NULL;
5,663✔
245

246
                if (p->type == SOCKET_SOCKET)
5,663✔
247
                        path = socket_address_get_path(&p->address);
5,426✔
248
                else if (IN_SET(p->type, SOCKET_FIFO, SOCKET_SPECIAL, SOCKET_USB_FUNCTION))
237✔
249
                        path = p->path;
237✔
250

251
                if (!path)
5,663✔
252
                        continue;
348✔
253

254
                r = unit_add_mounts_for(UNIT(s), path, UNIT_DEPENDENCY_FILE, UNIT_MOUNT_REQUIRES);
5,315✔
255
                if (r < 0)
5,315✔
256
                        return r;
257
        }
258

259
        return 0;
260
}
261

262
static int socket_add_device_dependencies(Socket *s) {
5,336✔
263
        char *t;
5,336✔
264

265
        assert(s);
5,336✔
266

267
        if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
5,336✔
268
                return 0;
269

270
        t = strjoina("/sys/subsystem/net/devices/", s->bind_to_device);
×
271
        return unit_add_node_dependency(UNIT(s), t, UNIT_BINDS_TO, UNIT_DEPENDENCY_FILE);
×
272
}
273

274
static int socket_add_default_dependencies(Socket *s) {
5,336✔
275
        int r;
5,336✔
276

277
        assert(s);
5,336✔
278

279
        if (!UNIT(s)->default_dependencies)
5,336✔
280
                return 0;
281

282
        r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
2,468✔
283
        if (r < 0)
2,468✔
284
                return r;
285

286
        if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
2,468✔
287
                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
1,068✔
288
                if (r < 0)
1,068✔
289
                        return r;
290
        }
291

292
        return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
2,468✔
293
}
294

295
static bool socket_has_exec(Socket *s) {
5,336✔
296
        assert(s);
5,336✔
297

298
        FOREACH_ARRAY(i, s->exec_command, _SOCKET_EXEC_COMMAND_MAX)
31,491✔
299
                if (*i)
26,330✔
300
                        return true;
301

302
        return false;
303
}
304

305
static int socket_add_extras(Socket *s) {
5,336✔
306
        Unit *u = UNIT(ASSERT_PTR(s));
5,336✔
307
        int r;
5,336✔
308

309
        /* Pick defaults for the trigger limit, if nothing was explicitly configured. We pick a relatively high limit
310
         * in Accept=yes mode, and a lower limit for Accept=no. Reason: in Accept=yes mode we are invoking accept()
311
         * ourselves before the trigger limit can hit, thus incoming connections are taken off the socket queue quickly
312
         * and reliably. This is different for Accept=no, where the spawned service has to take the incoming traffic
313
         * off the queues, which it might not necessarily do. Moreover, while Accept=no services are supposed to
314
         * process whatever is queued in one go, and thus should normally never have to be started frequently. This is
315
         * different for Accept=yes where each connection is processed by a new service instance, and thus frequent
316
         * service starts are typical.
317
         *
318
         * For the poll limit we follow a similar rule, but use 3/4th of the trigger limit parameters, to
319
         * trigger this earlier. */
320

321
        if (s->trigger_limit.interval == USEC_INFINITY)
5,336✔
322
                s->trigger_limit.interval = 2 * USEC_PER_SEC;
5,336✔
323
        if (s->trigger_limit.burst == UINT_MAX)
5,336✔
324
                s->trigger_limit.burst = s->accept ? 200 : 20;
9,474✔
325

326
        if (s->poll_limit.interval == USEC_INFINITY)
5,336✔
327
                s->poll_limit.interval = 2 * USEC_PER_SEC;
5,186✔
328
        if (s->poll_limit.burst == UINT_MAX)
5,336✔
329
                s->poll_limit.burst = s->accept ? 150 : 15;
9,324✔
330

331
        if (have_non_accept_socket(s)) {
5,336✔
332

333
                if (!UNIT_ISSET(s->service)) {
4,138✔
334
                        Unit *x;
2,448✔
335

336
                        r = unit_load_related_unit(u, ".service", &x);
2,448✔
337
                        if (r < 0)
2,448✔
338
                                return r;
×
339

340
                        unit_ref_set(&s->service, u, x);
2,448✔
341
                }
342

343
                r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true, UNIT_DEPENDENCY_IMPLICIT);
4,138✔
344
                if (r < 0)
4,138✔
345
                        return r;
346
        }
347

348
        r = socket_add_mount_dependencies(s);
5,336✔
349
        if (r < 0)
5,336✔
350
                return r;
351

352
        r = socket_add_device_dependencies(s);
5,336✔
353
        if (r < 0)
5,336✔
354
                return r;
355

356
        r = unit_patch_contexts(u);
5,336✔
357
        if (r < 0)
5,336✔
358
                return r;
359

360
        if (socket_has_exec(s)) {
5,336✔
361
                r = unit_add_exec_dependencies(u, &s->exec_context);
175✔
362
                if (r < 0)
175✔
363
                        return r;
364
        }
365

366
        r = unit_set_default_slice(u);
5,336✔
367
        if (r < 0)
5,336✔
368
                return r;
369

370
        r = socket_add_default_dependencies(s);
5,336✔
371
        if (r < 0)
5,336✔
372
                return r;
×
373

374
        return 0;
375
}
376

377
static const char* socket_find_symlink_target(Socket *s) {
2,739✔
378
        const char *found = NULL;
2,739✔
379

380
        assert(s);
2,739✔
381

382
        LIST_FOREACH(port, p, s->ports) {
5,478✔
383
                const char *f;
2,931✔
384

385
                switch (p->type) {
2,931✔
386

387
                case SOCKET_FIFO:
132✔
388
                        f = p->path;
132✔
389
                        break;
132✔
390

391
                case SOCKET_SOCKET:
2,799✔
392
                        f = socket_address_get_path(&p->address);
2,799✔
393
                        break;
2,799✔
394

395
                default:
396
                        f = NULL;
397
                }
398

399
                if (f) {
2,931✔
400
                        if (found)
2,865✔
401
                                return NULL;
402

403
                        found = f;
404
                }
405
        }
406

407
        return found;
408
}
409

410
static int socket_verify(Socket *s) {
5,336✔
411
        assert(s);
5,336✔
412
        assert(UNIT(s)->load_state == UNIT_LOADED);
5,336✔
413

414
        if (!s->ports)
5,336✔
415
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit has no Listen setting (ListenStream=, ListenDatagram=, ListenFIFO=, ...). Refusing.");
×
416

417
        if (s->max_connections <= 0)
5,336✔
418
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "MaxConnection= setting too small. Refusing.");
×
419

420
        if (s->accept && have_non_accept_socket(s))
5,336✔
421
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
×
422

423
        if (s->accept && UNIT_ISSET(s->service))
5,336✔
424
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Explicit service configuration for accepting socket units not supported. Refusing.");
×
425

426
        if (!strv_isempty(s->symlinks) && !socket_find_symlink_target(s))
5,661✔
427
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
×
428

429
        return 0;
430
}
431

432
static void peer_address_hash_func(const SocketPeer *s, struct siphash *state) {
3✔
433
        assert(s);
3✔
434

435
        if (s->peer.sa.sa_family == AF_INET)
3✔
436
                siphash24_compress_typesafe(s->peer.in.sin_addr, state);
×
437
        else if (s->peer.sa.sa_family == AF_INET6)
3✔
438
                siphash24_compress_typesafe(s->peer.in6.sin6_addr, state);
×
439
        else if (s->peer.sa.sa_family == AF_VSOCK)
3✔
440
                siphash24_compress_typesafe(s->peer.vm.svm_cid, state);
×
441
        else if (s->peer.sa.sa_family == AF_UNIX)
3✔
442
                siphash24_compress_typesafe(s->peer_cred.uid, state);
3✔
443
        else
444
                assert_not_reached();
×
445
}
3✔
446

447
static int peer_address_compare_func(const SocketPeer *x, const SocketPeer *y) {
2✔
448
        int r;
2✔
449

450
        r = CMP(x->peer.sa.sa_family, y->peer.sa.sa_family);
2✔
451
        if (r != 0)
2✔
452
                return r;
×
453

454
        switch (x->peer.sa.sa_family) {
2✔
455
        case AF_INET:
×
456
                return memcmp(&x->peer.in.sin_addr, &y->peer.in.sin_addr, sizeof(x->peer.in.sin_addr));
×
457
        case AF_INET6:
×
458
                return memcmp(&x->peer.in6.sin6_addr, &y->peer.in6.sin6_addr, sizeof(x->peer.in6.sin6_addr));
×
459
        case AF_VSOCK:
×
460
                return CMP(x->peer.vm.svm_cid, y->peer.vm.svm_cid);
×
461
        case AF_UNIX:
2✔
462
                return CMP(x->peer_cred.uid, y->peer_cred.uid);
2✔
463
        }
464
        assert_not_reached();
×
465
}
466

467
DEFINE_PRIVATE_HASH_OPS(peer_address_hash_ops, SocketPeer, peer_address_hash_func, peer_address_compare_func);
468

469
static int socket_load(Unit *u) {
5,339✔
470
        Socket *s = ASSERT_PTR(SOCKET(u));
5,339✔
471
        int r;
5,339✔
472

473
        assert(u->load_state == UNIT_STUB);
5,339✔
474

475
        r = unit_load_fragment_and_dropin(u, true);
5,339✔
476
        if (r < 0)
5,339✔
477
                return r;
478

479
        if (u->load_state != UNIT_LOADED)
5,336✔
480
                return 0;
481

482
        /* This is a new unit? Then let's add in some extras */
483
        r = socket_add_extras(s);
5,336✔
484
        if (r < 0)
5,336✔
485
                return r;
486

487
        return socket_verify(s);
5,336✔
488
}
489

490
static SocketPeer* socket_peer_dup(const SocketPeer *q) {
1✔
491
        SocketPeer *p;
1✔
492

493
        assert(q);
1✔
494

495
        p = new(SocketPeer, 1);
1✔
496
        if (!p)
1✔
497
                return NULL;
498

499
        *p = (SocketPeer) {
1✔
500
                .n_ref = 1,
501
                .peer = q->peer,
1✔
502
                .peer_salen = q->peer_salen,
1✔
503
                .peer_cred = q->peer_cred,
1✔
504
        };
505

506
        return p;
1✔
507
}
508

509
static SocketPeer* socket_peer_free(SocketPeer *p) {
1✔
510
        assert(p);
1✔
511

512
        if (p->socket)
1✔
513
                set_remove(p->socket->peers_by_address, p);
1✔
514

515
        return mfree(p);
1✔
516
}
517

518
DEFINE_TRIVIAL_REF_UNREF_FUNC(SocketPeer, socket_peer, socket_peer_free);
3✔
519

520
int socket_acquire_peer(Socket *s, int fd, SocketPeer **ret) {
2✔
521
        _cleanup_(socket_peer_unrefp) SocketPeer *remote = NULL;
2✔
522
        SocketPeer key = {
2✔
523
                .peer_salen = sizeof(union sockaddr_union),
524
                .peer_cred = UCRED_INVALID,
525
        }, *i;
526
        int r;
2✔
527

528
        assert(s);
2✔
529
        assert(fd >= 0);
2✔
530
        assert(ret);
2✔
531

532
        if (getpeername(fd, &key.peer.sa, &key.peer_salen) < 0)
2✔
533
                return log_unit_error_errno(UNIT(s), errno, "getpeername() failed: %m");
×
534

535
        switch (key.peer.sa.sa_family) {
2✔
536
        case AF_INET:
537
        case AF_INET6:
538
        case AF_VSOCK:
539
                break;
540

541
        case AF_UNIX:
2✔
542
                r = getpeercred(fd, &key.peer_cred);
2✔
543
                if (r < 0)
2✔
544
                        return log_unit_error_errno(UNIT(s), r, "Failed to get peer credentials of socket: %m");
×
545
                break;
546

547
        default:
×
548
                *ret = NULL;
×
549
                return 0;
×
550
        }
551

552
        i = set_get(s->peers_by_address, &key);
2✔
553
        if (i) {
2✔
554
                *ret = socket_peer_ref(i);
1✔
555
                return 1;
1✔
556
        }
557

558
        remote = socket_peer_dup(&key);
1✔
559
        if (!remote)
1✔
560
                return log_oom();
×
561

562
        r = set_ensure_put(&s->peers_by_address, &peer_address_hash_ops, remote);
1✔
563
        if (r < 0)
1✔
564
                return log_unit_error_errno(UNIT(s), r, "Failed to insert peer info into hash table: %m");
×
565

566
        remote->socket = s;
1✔
567

568
        *ret = TAKE_PTR(remote);
1✔
569
        return 1;
1✔
570
}
571

572
static const char* listen_lookup(int family, int type) {
×
573

574
        if (family == AF_NETLINK)
×
575
                return "ListenNetlink";
576

577
        if (type == SOCK_STREAM)
×
578
                return "ListenStream";
579
        else if (type == SOCK_DGRAM)
×
580
                return "ListenDatagram";
581
        else if (type == SOCK_SEQPACKET)
×
582
                return "ListenSequentialPacket";
583

584
        assert_not_reached();
×
585
}
586

587
static void socket_dump(Unit *u, FILE *f, const char *prefix) {
×
588
        Socket *s = ASSERT_PTR(SOCKET(u));
×
589
        const char *prefix2, *str;
×
590

591
        assert(f);
×
592

593
        prefix = strempty(prefix);
×
594
        prefix2 = strjoina(prefix, "\t");
×
595

596
        fprintf(f,
×
597
                "%sSocket State: %s\n"
598
                "%sResult: %s\n"
599
                "%sClean Result: %s\n"
600
                "%sBindIPv6Only: %s\n"
601
                "%sBacklog: %u\n"
602
                "%sSocketMode: %04o\n"
603
                "%sDirectoryMode: %04o\n"
604
                "%sKeepAlive: %s\n"
605
                "%sNoDelay: %s\n"
606
                "%sFreeBind: %s\n"
607
                "%sTransparent: %s\n"
608
                "%sBroadcast: %s\n"
609
                "%sPassCredentials: %s\n"
610
                "%sPassFileDescriptorsToExec: %s\n"
611
                "%sPassSecurity: %s\n"
612
                "%sPassPacketInfo: %s\n"
613
                "%sTCPCongestion: %s\n"
614
                "%sRemoveOnStop: %s\n"
615
                "%sWritable: %s\n"
616
                "%sFileDescriptorName: %s\n"
617
                "%sSELinuxContextFromNet: %s\n",
618
                prefix, socket_state_to_string(s->state),
619
                prefix, socket_result_to_string(s->result),
620
                prefix, socket_result_to_string(s->clean_result),
621
                prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
622
                prefix, s->backlog,
623
                prefix, s->socket_mode,
624
                prefix, s->directory_mode,
625
                prefix, yes_no(s->keep_alive),
×
626
                prefix, yes_no(s->no_delay),
×
627
                prefix, yes_no(s->free_bind),
×
628
                prefix, yes_no(s->transparent),
×
629
                prefix, yes_no(s->broadcast),
×
630
                prefix, yes_no(s->pass_cred),
×
631
                prefix, yes_no(s->pass_fds_to_exec),
×
632
                prefix, yes_no(s->pass_sec),
×
633
                prefix, yes_no(s->pass_pktinfo),
×
634
                prefix, strna(s->tcp_congestion),
×
635
                prefix, yes_no(s->remove_on_stop),
×
636
                prefix, yes_no(s->writable),
×
637
                prefix, socket_fdname(s),
638
                prefix, yes_no(s->selinux_context_from_net));
×
639

640
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF)
×
641
                fprintf(f,
×
642
                        "%sTimestamping: %s\n",
643
                        prefix, socket_timestamping_to_string(s->timestamping));
644

645
        if (pidref_is_set(&s->control_pid))
646
                fprintf(f,
×
647
                        "%sControl PID: "PID_FMT"\n",
648
                        prefix, s->control_pid.pid);
649

650
        if (s->bind_to_device)
×
651
                fprintf(f,
×
652
                        "%sBindToDevice: %s\n",
653
                        prefix, s->bind_to_device);
654

655
        if (s->accept)
×
656
                fprintf(f,
×
657
                        "%sAccepted: %u\n"
658
                        "%sNConnections: %u\n"
659
                        "%sMaxConnections: %u\n"
660
                        "%sMaxConnectionsPerSource: %u\n",
661
                        prefix, s->n_accepted,
662
                        prefix, s->n_connections,
663
                        prefix, s->max_connections,
664
                        prefix, s->max_connections_per_source);
665
        else
666
                fprintf(f,
×
667
                        "%sFlushPending: %s\n",
668
                         prefix, yes_no(s->flush_pending));
×
669

670
        if (s->priority >= 0)
×
671
                fprintf(f,
×
672
                        "%sPriority: %i\n",
673
                        prefix, s->priority);
674

675
        if (s->receive_buffer > 0)
×
676
                fprintf(f,
×
677
                        "%sReceiveBuffer: %zu\n",
678
                        prefix, s->receive_buffer);
679

680
        if (s->send_buffer > 0)
×
681
                fprintf(f,
×
682
                        "%sSendBuffer: %zu\n",
683
                        prefix, s->send_buffer);
684

685
        if (s->ip_tos >= 0)
×
686
                fprintf(f,
×
687
                        "%sIPTOS: %i\n",
688
                        prefix, s->ip_tos);
689

690
        if (s->ip_ttl >= 0)
×
691
                fprintf(f,
×
692
                        "%sIPTTL: %i\n",
693
                        prefix, s->ip_ttl);
694

695
        if (s->pipe_size > 0)
×
696
                fprintf(f,
×
697
                        "%sPipeSize: %zu\n",
698
                        prefix, s->pipe_size);
699

700
        if (s->mark >= 0)
×
701
                fprintf(f,
×
702
                        "%sMark: %i\n",
703
                        prefix, s->mark);
704

705
        if (s->mq_maxmsg > 0)
×
706
                fprintf(f,
×
707
                        "%sMessageQueueMaxMessages: %li\n",
708
                        prefix, s->mq_maxmsg);
709

710
        if (s->mq_msgsize > 0)
×
711
                fprintf(f,
×
712
                        "%sMessageQueueMessageSize: %li\n",
713
                        prefix, s->mq_msgsize);
714

715
        if (s->reuse_port)
×
716
                fprintf(f,
×
717
                        "%sReusePort: %s\n",
718
                         prefix, yes_no(s->reuse_port));
719

720
        if (s->smack)
×
721
                fprintf(f,
×
722
                        "%sSmackLabel: %s\n",
723
                        prefix, s->smack);
724

725
        if (s->smack_ip_in)
×
726
                fprintf(f,
×
727
                        "%sSmackLabelIPIn: %s\n",
728
                        prefix, s->smack_ip_in);
729

730
        if (s->smack_ip_out)
×
731
                fprintf(f,
×
732
                        "%sSmackLabelIPOut: %s\n",
733
                        prefix, s->smack_ip_out);
734

735
        if (!isempty(s->user) || !isempty(s->group))
×
736
                fprintf(f,
×
737
                        "%sSocketUser: %s\n"
738
                        "%sSocketGroup: %s\n",
739
                        prefix, strna(s->user),
×
740
                        prefix, strna(s->group));
×
741

742
        if (timestamp_is_set(s->keep_alive_time))
×
743
                fprintf(f,
×
744
                        "%sKeepAliveTimeSec: %s\n",
745
                        prefix, FORMAT_TIMESPAN(s->keep_alive_time, USEC_PER_SEC));
×
746

747
        if (s->keep_alive_interval > 0)
×
748
                fprintf(f,
×
749
                        "%sKeepAliveIntervalSec: %s\n",
750
                        prefix, FORMAT_TIMESPAN(s->keep_alive_interval, USEC_PER_SEC));
×
751

752
        if (s->keep_alive_cnt > 0)
×
753
                fprintf(f,
×
754
                        "%sKeepAliveProbes: %u\n",
755
                        prefix, s->keep_alive_cnt);
756

757
        if (s->defer_accept > 0)
×
758
                fprintf(f,
×
759
                        "%sDeferAcceptSec: %s\n",
760
                        prefix, FORMAT_TIMESPAN(s->defer_accept, USEC_PER_SEC));
×
761

762
        LIST_FOREACH(port, p, s->ports) {
×
763

764
                switch (p->type) {
×
765
                case SOCKET_SOCKET: {
×
766
                        _cleanup_free_ char *k = NULL;
×
767
                        int r;
×
768

769
                        r = socket_address_print(&p->address, &k);
×
770
                        if (r < 0) {
×
771
                                errno = -r;
×
772
                                fprintf(f, "%s%s: %m\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type));
×
773
                        } else
774
                                fprintf(f, "%s%s: %s\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type), k);
×
775
                        break;
×
776
                }
777
                case SOCKET_SPECIAL:
×
778
                        fprintf(f, "%sListenSpecial: %s\n", prefix, p->path);
×
779
                        break;
780
                case SOCKET_USB_FUNCTION:
×
781
                        fprintf(f, "%sListenUSBFunction: %s\n", prefix, p->path);
×
782
                        break;
783
                case SOCKET_MQUEUE:
×
784
                        fprintf(f, "%sListenMessageQueue: %s\n", prefix, p->path);
×
785
                        break;
786
                default:
×
787
                        fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
×
788
                }
789
        }
790

791
        fprintf(f,
×
792
                "%sTriggerLimitIntervalSec: %s\n"
793
                "%sTriggerLimitBurst: %u\n"
794
                "%sPollLimitIntervalSec: %s\n"
795
                "%sPollLimitBurst: %u\n",
796
                prefix, FORMAT_TIMESPAN(s->trigger_limit.interval, USEC_PER_SEC),
×
797
                prefix, s->trigger_limit.burst,
798
                prefix, FORMAT_TIMESPAN(s->poll_limit.interval, USEC_PER_SEC),
×
799
                prefix, s->poll_limit.burst);
800

801
        str = ip_protocol_to_name(s->socket_protocol);
×
802
        if (str)
×
803
                fprintf(f, "%sSocketProtocol: %s\n", prefix, str);
×
804

805
        if (!strv_isempty(s->symlinks)) {
×
806
                fprintf(f, "%sSymlinks:", prefix);
×
807
                STRV_FOREACH(q, s->symlinks)
×
808
                        fprintf(f, " %s", *q);
×
809

810
                fprintf(f, "\n");
×
811
        }
812

813
        fprintf(f,
×
814
                "%sTimeoutSec: %s\n",
815
                prefix, FORMAT_TIMESPAN(s->timeout_usec, USEC_PER_SEC));
×
816

817
        exec_context_dump(&s->exec_context, f, prefix);
×
818
        kill_context_dump(&s->kill_context, f, prefix);
×
819

820
        for (SocketExecCommand c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
×
821
                if (!s->exec_command[c])
×
822
                        continue;
×
823

824
                fprintf(f, "%s%s %s:\n",
×
825
                        prefix, glyph(GLYPH_ARROW_RIGHT), socket_exec_command_to_string(c));
826

827
                exec_command_dump_list(s->exec_command[c], f, prefix2);
×
828
        }
829

830
        cgroup_context_dump(UNIT(s), f, prefix);
×
831
}
×
832

833
static int instance_from_socket(int fd, unsigned nr, char **ret) {
2✔
834
        union sockaddr_union local, remote;
2✔
835
        socklen_t l;
2✔
836
        int r;
2✔
837

838
        assert(fd >= 0);
2✔
839
        assert(ret);
2✔
840

841
        l = sizeof(local);
2✔
842
        if (getsockname(fd, &local.sa, &l) < 0)
2✔
843
                return -errno;
2✔
844

845
        l = sizeof(remote);
2✔
846
        if (getpeername(fd, &remote.sa, &l) < 0)
2✔
847
                return -errno;
×
848

849
        char *s;
2✔
850

851
        switch (local.sa.sa_family) {
2✔
852

853
        case AF_INET: {
×
854
                uint32_t
×
855
                        a = be32toh(local.in.sin_addr.s_addr),
×
856
                        b = be32toh(remote.in.sin_addr.s_addr);
×
857

858
                if (asprintf(&s,
×
859
                             "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
860
                             nr,
861
                             a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
862
                             be16toh(local.in.sin_port),
×
863
                             b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
864
                             be16toh(remote.in.sin_port)) < 0)
×
865
                        return -ENOMEM;
866

867
                break;
868
        }
869

870
        case AF_INET6: {
×
871
                static const unsigned char ipv4_prefix[] = {
×
872
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
873
                };
874

875
                if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
×
876
                    memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
×
877
                        const uint8_t
×
878
                                *a = local.in6.sin6_addr.s6_addr+12,
×
879
                                *b = remote.in6.sin6_addr.s6_addr+12;
×
880

881
                        if (asprintf(&s,
×
882
                                     "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
883
                                     nr,
884
                                     a[0], a[1], a[2], a[3],
×
885
                                     be16toh(local.in6.sin6_port),
×
886
                                     b[0], b[1], b[2], b[3],
×
887
                                     be16toh(remote.in6.sin6_port)) < 0)
×
888
                                return -ENOMEM;
889
                } else {
890
                        if (asprintf(&s,
×
891
                                     "%u-%s:%u-%s:%u",
892
                                     nr,
893
                                     IN6_ADDR_TO_STRING(&local.in6.sin6_addr),
×
894
                                     be16toh(local.in6.sin6_port),
×
895
                                     IN6_ADDR_TO_STRING(&remote.in6.sin6_addr),
×
896
                                     be16toh(remote.in6.sin6_port)) < 0)
×
897
                                return -ENOMEM;
×
898
                }
899

900
                break;
901
        }
902

903
        case AF_UNIX: {
2✔
904
                struct ucred ucred;
2✔
905

906
                r = getpeercred(fd, &ucred);
2✔
907
                if (r >= 0) {
2✔
908
                        _cleanup_close_ int pidfd = getpeerpidfd(fd);
4✔
909
                        uint64_t pidfd_id;
2✔
910

911
                        if (pidfd >= 0 && pidfd_get_inode_id(pidfd, &pidfd_id) >= 0)
2✔
912
                                r = asprintf(&s, "%u-" PID_FMT "_%" PRIu64 "-" UID_FMT,
×
913
                                             nr, ucred.pid, pidfd_id, ucred.uid);
914
                        else
915
                                r = asprintf(&s, "%u-" PID_FMT "-" UID_FMT,
2✔
916
                                             nr, ucred.pid, ucred.uid);
917
                        if (r < 0)
2✔
918
                                return -ENOMEM;
×
919
                } else if (r == -ENODATA) {
×
920
                        /* This handles the case where somebody is connecting from another pid/uid namespace
921
                         * (e.g. from outside of our container). */
922
                        if (asprintf(&s,
×
923
                                     "%u-unknown",
924
                                     nr) < 0)
925
                                return -ENOMEM;
926
                } else
927
                        return r;
928

929
                break;
2✔
930
        }
931

932
        case AF_VSOCK:
×
933
                if (asprintf(&s,
×
934
                             "%u-%u:%u-%u:%u",
935
                             nr,
936
                             local.vm.svm_cid, local.vm.svm_port,
937
                             remote.vm.svm_cid, remote.vm.svm_port) < 0)
938
                        return -ENOMEM;
939

940
                break;
941

942
        default:
×
943
                assert_not_reached();
×
944
        }
945

946
        *ret = s;
2✔
947
        return 0;
2✔
948
}
949

950
static void socket_close_fds(Socket *s) {
1,927✔
951
        assert(s);
1,927✔
952

953
        LIST_FOREACH(port, p, s->ports) {
3,886✔
954
                bool was_open = p->fd >= 0;
1,959✔
955

956
                p->event_source = sd_event_source_disable_unref(p->event_source);
1,959✔
957
                p->fd = safe_close(p->fd);
1,959✔
958
                socket_port_close_auxiliary_fds(p);
1,959✔
959

960
                /* One little note: we should normally not delete any sockets in the file system here! After all some
961
                 * other process we spawned might still have a reference of this fd and wants to continue to use
962
                 * it. Therefore we normally delete sockets in the file system before we create a new one, not after we
963
                 * stopped using one! That all said, if the user explicitly requested this, we'll delete them here
964
                 * anyway, but only then. */
965

966
                if (!was_open || !s->remove_on_stop)
1,959✔
967
                        continue;
1,909✔
968

969
                switch (p->type) {
50✔
970

971
                case SOCKET_FIFO:
18✔
972
                        (void) unlink(p->path);
18✔
973
                        break;
18✔
974

975
                case SOCKET_MQUEUE:
×
976
                        (void) mq_unlink(p->path);
×
977
                        break;
×
978

979
                case SOCKET_SOCKET:
32✔
980
                        (void) socket_address_unlink(&p->address);
32✔
981
                        break;
32✔
982

983
                default:
984
                        ;
985
                }
986
        }
987

988
        if (s->remove_on_stop)
1,927✔
989
                STRV_FOREACH(i, s->symlinks)
41✔
990
                        (void) unlink(*i);
×
991

992
        /* Note that we don't return NULL here, since s has not been freed. */
993
}
1,927✔
994

995
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(Socket*, socket_close_fds, NULL);
×
996

997
static void socket_apply_socket_options(Socket *s, SocketPort *p, int fd) {
2,350✔
998
        int r;
2,350✔
999

1000
        assert(s);
2,350✔
1001
        assert(p);
2,350✔
1002
        assert(fd >= 0);
2,350✔
1003

1004
        if (s->keep_alive) {
2,350✔
1005
                r = setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, true);
×
1006
                if (r < 0)
×
1007
                        log_unit_warning_errno(UNIT(s), r, "SO_KEEPALIVE failed: %m");
×
1008
        }
1009

1010
        if (timestamp_is_set(s->keep_alive_time)) {
2,350✔
1011
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPIDLE, s->keep_alive_time / USEC_PER_SEC);
×
1012
                if (r < 0)
×
1013
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPIDLE failed: %m");
×
1014
        }
1015

1016
        if (s->keep_alive_interval > 0) {
2,350✔
1017
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPINTVL, s->keep_alive_interval / USEC_PER_SEC);
×
1018
                if (r < 0)
×
1019
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPINTVL failed: %m");
×
1020
        }
1021

1022
        if (s->keep_alive_cnt > 0) {
2,350✔
1023
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPCNT, s->keep_alive_cnt);
×
1024
                if (r < 0)
×
1025
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPCNT failed: %m");
×
1026
        }
1027

1028
        if (s->defer_accept > 0) {
2,350✔
1029
                r = setsockopt_int(fd, SOL_TCP, TCP_DEFER_ACCEPT, s->defer_accept / USEC_PER_SEC);
×
1030
                if (r < 0)
×
1031
                        log_unit_warning_errno(UNIT(s), r, "TCP_DEFER_ACCEPT failed: %m");
×
1032
        }
1033

1034
        if (s->no_delay) {
2,350✔
1035
                if (s->socket_protocol == IPPROTO_SCTP) {
×
1036
                        r = setsockopt_int(fd, SOL_SCTP, SCTP_NODELAY, true);
×
1037
                        if (r < 0)
×
1038
                                log_unit_warning_errno(UNIT(s), r, "SCTP_NODELAY failed: %m");
×
1039
                } else {
1040
                        r = setsockopt_int(fd, SOL_TCP, TCP_NODELAY, true);
×
1041
                        if (r < 0)
×
1042
                                log_unit_warning_errno(UNIT(s), r, "TCP_NODELAY failed: %m");
×
1043
                }
1044
        }
1045

1046
        if (s->broadcast) {
2,350✔
1047
                r = setsockopt_int(fd, SOL_SOCKET, SO_BROADCAST, true);
×
1048
                if (r < 0)
×
1049
                        log_unit_warning_errno(UNIT(s), r, "SO_BROADCAST failed: %m");
×
1050
        }
1051

1052
        if (s->pass_cred) {
2,350✔
1053
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true);
132✔
1054
                if (r < 0)
132✔
1055
                        log_unit_warning_errno(UNIT(s), r, "SO_PASSCRED failed: %m");
×
1056
        }
1057

1058
        if (s->pass_sec) {
2,350✔
1059
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSSEC, true);
90✔
1060
                if (r < 0)
90✔
1061
                        log_unit_warning_errno(UNIT(s), r, "SO_PASSSEC failed: %m");
×
1062
        }
1063

1064
        if (s->pass_pktinfo) {
2,350✔
1065
                r = socket_set_recvpktinfo(fd, socket_address_family(&p->address), true);
33✔
1066
                if (r < 0)
33✔
1067
                        log_unit_warning_errno(UNIT(s), r, "Failed to enable packet info socket option: %m");
×
1068
        }
1069

1070
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF) {
2,350✔
1071
                r = setsockopt_int(fd, SOL_SOCKET,
180✔
1072
                                   s->timestamping == SOCKET_TIMESTAMPING_NS ? SO_TIMESTAMPNS : SO_TIMESTAMP,
1073
                                   true);
1074
                if (r < 0)
90✔
1075
                        log_unit_warning_errno(UNIT(s), r, "Failed to enable timestamping socket option, ignoring: %m");
×
1076
        }
1077

1078
        if (s->priority >= 0) {
2,350✔
1079
                r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
172✔
1080
                if (r < 0)
172✔
1081
                        log_unit_warning_errno(UNIT(s), r, "SO_PRIORITY failed: %m");
×
1082
        }
1083

1084
        if (s->receive_buffer > 0) {
2,350✔
1085
                r = fd_set_rcvbuf(fd, s->receive_buffer, false);
150✔
1086
                if (r < 0)
150✔
1087
                        log_unit_full_errno(UNIT(s), ERRNO_IS_PRIVILEGE(r) ? LOG_DEBUG : LOG_WARNING, r,
×
1088
                                            "SO_RCVBUF/SO_RCVBUFFORCE failed: %m");
1089
        }
1090

1091
        if (s->send_buffer > 0) {
2,350✔
1092
                r = fd_set_sndbuf(fd, s->send_buffer, false);
30✔
1093
                if (r < 0)
30✔
1094
                        log_unit_full_errno(UNIT(s), ERRNO_IS_PRIVILEGE(r) ? LOG_DEBUG : LOG_WARNING, r,
×
1095
                                            "SO_SNDBUF/SO_SNDBUFFORCE failed: %m");
1096
        }
1097

1098
        if (s->mark >= 0) {
2,350✔
1099
                r = setsockopt_int(fd, SOL_SOCKET, SO_MARK, s->mark);
×
1100
                if (r < 0)
×
1101
                        log_unit_warning_errno(UNIT(s), r, "SO_MARK failed: %m");
×
1102
        }
1103

1104
        if (s->ip_tos >= 0) {
2,350✔
1105
                r = setsockopt_int(fd, IPPROTO_IP, IP_TOS, s->ip_tos);
×
1106
                if (r < 0)
×
1107
                        log_unit_warning_errno(UNIT(s), r, "IP_TOS failed: %m");
×
1108
        }
1109

1110
        if (s->ip_ttl >= 0) {
2,350✔
1111
                r = socket_set_ttl(fd, socket_address_family(&p->address), s->ip_ttl);
×
1112
                if (r < 0)
×
1113
                        log_unit_warning_errno(UNIT(s), r, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
×
1114
        }
1115

1116
        if (s->tcp_congestion)
2,350✔
1117
                if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
×
1118
                        log_unit_warning_errno(UNIT(s), errno, "TCP_CONGESTION failed: %m");
×
1119

1120
        if (s->smack_ip_in) {
2,350✔
1121
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPIN, s->smack_ip_in);
×
1122
                if (r < 0)
×
1123
                        log_unit_error_errno(UNIT(s), r, "mac_smack_apply_ip_in_fd: %m");
×
1124
        }
1125

1126
        if (s->smack_ip_out) {
2,350✔
1127
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPOUT, s->smack_ip_out);
×
1128
                if (r < 0)
×
1129
                        log_unit_error_errno(UNIT(s), r, "mac_smack_apply_ip_out_fd: %m");
×
1130
        }
1131
}
2,350✔
1132

1133
static void socket_apply_fifo_options(Socket *s, int fd) {
66✔
1134
        int r;
66✔
1135

1136
        assert(s);
66✔
1137
        assert(fd >= 0);
66✔
1138

1139
        if (s->pipe_size > 0)
66✔
1140
                if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
×
1141
                        log_unit_warning_errno(UNIT(s), errno, "Setting pipe size failed, ignoring: %m");
×
1142

1143
        if (s->smack) {
66✔
1144
                r = mac_smack_apply_fd(fd, SMACK_ATTR_ACCESS, s->smack);
×
1145
                if (r < 0)
×
1146
                        log_unit_error_errno(UNIT(s), r, "SMACK relabelling failed, ignoring: %m");
×
1147
        }
1148
}
66✔
1149

1150
static int fifo_address_create(
66✔
1151
                const char *path,
1152
                mode_t directory_mode,
1153
                mode_t socket_mode) {
1154

1155
        _cleanup_close_ int fd = -EBADF;
66✔
1156
        mode_t old_mask;
66✔
1157
        struct stat st;
66✔
1158
        int r;
66✔
1159

1160
        assert(path);
66✔
1161

1162
        (void) mkdir_parents_label(path, directory_mode);
66✔
1163

1164
        r = mac_selinux_create_file_prepare(path, S_IFIFO);
66✔
1165
        if (r < 0)
66✔
1166
                return r;
1167

1168
        /* Enforce the right access mode for the fifo */
1169
        old_mask = umask(~socket_mode);
66✔
1170

1171
        /* Include the original umask in our mask */
1172
        (void) umask(~socket_mode | old_mask);
66✔
1173

1174
        r = mkfifo(path, socket_mode);
66✔
1175
        (void) umask(old_mask);
66✔
1176

1177
        if (r < 0 && errno != EEXIST) {
66✔
1178
                r = -errno;
×
1179
                goto fail;
×
1180
        }
1181

1182
        fd = open(path, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK | O_NOFOLLOW);
66✔
1183
        if (fd < 0) {
66✔
1184
                r = -errno;
×
1185
                goto fail;
×
1186
        }
1187

1188
        mac_selinux_create_file_clear();
66✔
1189

1190
        if (fstat(fd, &st) < 0) {
66✔
1191
                r = -errno;
×
1192
                goto fail;
×
1193
        }
1194

1195
        if (!S_ISFIFO(st.st_mode) ||
66✔
1196
            (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
132✔
1197
            st.st_uid != getuid() ||
132✔
1198
            st.st_gid != getgid()) {
66✔
1199
                r = -EEXIST;
×
1200
                goto fail;
×
1201
        }
1202

1203
        return TAKE_FD(fd);
1204

1205
fail:
×
1206
        mac_selinux_create_file_clear();
×
1207
        return r;
1208
}
1209

1210
static int special_address_create(const char *path, bool writable) {
6✔
1211
        _cleanup_close_ int fd = -EBADF;
6✔
1212
        struct stat st;
6✔
1213

1214
        assert(path);
6✔
1215

1216
        fd = open(path, (writable ? O_RDWR : O_RDONLY)|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
6✔
1217
        if (fd < 0)
6✔
1218
                return -errno;
×
1219

1220
        if (fstat(fd, &st) < 0)
6✔
1221
                return -errno;
×
1222

1223
        /* Check whether this is a /proc, /sys or /dev file or char device */
1224
        if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode))
6✔
1225
                return -EEXIST;
×
1226

1227
        return TAKE_FD(fd);
1228
}
1229

1230
static int usbffs_address_create_at(int dfd, const char *name) {
×
1231
        _cleanup_close_ int fd = -EBADF;
×
1232
        struct stat st;
×
1233

1234
        assert(dfd >= 0);
×
1235
        assert(name);
×
1236

1237
        fd = openat(dfd, name, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
×
1238
        if (fd < 0)
×
1239
                return -errno;
×
1240

1241
        if (fstat(fd, &st) < 0)
×
1242
                return -errno;
×
1243

1244
        /* Check whether this is a regular file (ffs endpoint) */
1245
        if (!S_ISREG(st.st_mode))
×
1246
                return -EEXIST;
×
1247

1248
        return TAKE_FD(fd);
1249
}
1250

1251
static int mq_address_create(
×
1252
                const char *path,
1253
                mode_t mq_mode,
1254
                long maxmsg,
1255
                long msgsize) {
1256

1257
        _cleanup_close_ int fd = -EBADF;
×
1258
        struct stat st;
×
1259
        mode_t old_mask;
×
1260
        struct mq_attr _attr, *attr = NULL;
×
1261

1262
        assert(path);
×
1263

1264
        if (maxmsg > 0 && msgsize > 0) {
×
1265
                _attr = (struct mq_attr) {
×
1266
                        .mq_flags = O_NONBLOCK,
1267
                        .mq_maxmsg = maxmsg,
1268
                        .mq_msgsize = msgsize,
1269
                };
1270
                attr = &_attr;
×
1271
        }
1272

1273
        /* Enforce the right access mode for the mq */
1274
        old_mask = umask(~mq_mode);
×
1275

1276
        /* Include the original umask in our mask */
1277
        (void) umask(~mq_mode | old_mask);
×
1278
        fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
×
1279
        (void) umask(old_mask);
×
1280

1281
        if (fd < 0)
×
1282
                return -errno;
×
1283

1284
        if (fstat(fd, &st) < 0)
×
1285
                return -errno;
×
1286

1287
        if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
×
1288
            st.st_uid != getuid() ||
×
1289
            st.st_gid != getgid())
×
1290
                return -EEXIST;
×
1291

1292
        return TAKE_FD(fd);
1293
}
1294

1295
static int socket_symlink(Socket *s) {
2,414✔
1296
        const char *p;
2,414✔
1297
        int r;
2,414✔
1298

1299
        assert(s);
2,414✔
1300

1301
        p = socket_find_symlink_target(s);
2,414✔
1302
        if (!p)
2,414✔
1303
                return 0;
1304

1305
        STRV_FOREACH(i, s->symlinks) {
2,285✔
1306
                (void) mkdir_parents_label(*i, s->directory_mode);
129✔
1307

1308
                r = symlink_idempotent(p, *i, false);
129✔
1309
                if (r == -EEXIST && s->remove_on_stop) {
129✔
1310
                        /* If there's already something where we want to create the symlink, and the destructive
1311
                         * RemoveOnStop= mode is set, then we might as well try to remove what already exists and try
1312
                         * again. */
1313

1314
                        if (unlink(*i) >= 0)
×
1315
                                r = symlink_idempotent(p, *i, false);
×
1316
                }
1317
                if (r < 0)
129✔
1318
                        log_unit_warning_errno(UNIT(s), r, "Failed to create symlink %s %s %s, ignoring: %m",
×
1319
                                               p, glyph(GLYPH_ARROW_RIGHT), *i);
1320
        }
1321

1322
        return 0;
1323
}
1324

1325
static int usbffs_write_descs(int fd, Service *s) {
×
1326
        int r;
×
1327

1328
        assert(fd >= 0);
×
1329
        assert(s);
×
1330

1331
        if (!s->usb_function_descriptors || !s->usb_function_strings)
×
1332
                return -EINVAL;
1333

1334
        r = copy_file_fd(s->usb_function_descriptors, fd, 0);
×
1335
        if (r < 0)
×
1336
                return r;
1337

1338
        return copy_file_fd(s->usb_function_strings, fd, 0);
×
1339
}
1340

1341
static int usbffs_dispatch_eps(SocketPort *p, int dfd) {
×
1342
        _cleanup_free_ DirectoryEntries *des = NULL;
×
1343
        int r;
×
1344

1345
        assert(p);
×
1346
        assert(dfd >= 0);
×
1347

1348
        r = readdir_all(dfd, RECURSE_DIR_SORT|RECURSE_DIR_IGNORE_DOT, &des);
×
1349
        if (r < 0)
×
1350
                return r;
1351

1352
        p->auxiliary_fds = new(int, des->n_entries);
×
1353
        if (!p->auxiliary_fds)
×
1354
                return -ENOMEM;
1355

1356
        FOREACH_ARRAY(i, des->entries, des->n_entries) {
×
1357
                const struct dirent *de = *i;
×
1358

1359
                if (streq(de->d_name, "ep0"))
×
1360
                        continue;
×
1361

1362
                r = usbffs_address_create_at(dfd, de->d_name);
×
1363
                if (r < 0)
×
1364
                        goto fail;
×
1365

1366
                p->auxiliary_fds[p->n_auxiliary_fds++] = r;
×
1367
        }
1368

1369
        assert(p->n_auxiliary_fds < des->n_entries);
×
1370

1371
        return 0;
1372

1373
fail:
×
1374
        socket_port_close_auxiliary_fds(p);
×
1375
        return r;
1376
}
1377

1378
int socket_load_service_unit(Socket *s, int cfd, Unit **ret) {
2,334✔
1379
        int r;
2,334✔
1380

1381
        /* Figure out what the unit that will be used to handle the connections on the socket looks like.
1382
         *
1383
         * If cfd < 0, then we don't have a connection yet. In case of Accept=yes sockets, use a fake
1384
         * instance name.
1385
         */
1386

1387
        assert(s);
2,334✔
1388
        assert(ret);
2,334✔
1389

1390
        if (UNIT_ISSET(s->service)) {
2,334✔
1391
                *ret = UNIT_DEREF(s->service);
1,877✔
1392
                return 0;
2,334✔
1393
        }
1394

1395
        if (!s->accept)
457✔
1396
                return -ENODATA;
1397

1398
        /* Build the instance name and load the unit */
1399
        _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
457✔
1400

1401
        r = unit_name_to_prefix(UNIT(s)->id, &prefix);
457✔
1402
        if (r < 0)
457✔
1403
                return r;
1404

1405
        if (cfd >= 0) {
457✔
1406
                r = instance_from_socket(cfd, s->n_accepted, &instance);
2✔
1407
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
1408
                        /* ENOTCONN is legitimate if TCP RST was received. Other socket families might return
1409
                         * different errors. This connection is over, but the socket unit lives on. */
1410
                        return log_unit_debug_errno(UNIT(s), r,
×
1411
                                                    "Got %s on incoming socket, assuming aborted connection attempt, ignoring.",
1412
                                                    errno_to_name(r));
1413
                if (r < 0)
2✔
1414
                        return r;
1415
        }
1416

1417
        /* For accepting sockets, we don't know how the instance will be called until we get a connection and
1418
         * can figure out what the peer name is. So let's use "internal" as the instance to make it clear
1419
         * that this is not an actual peer name. We use "unknown" when we cannot figure out the peer. */
1420
        r = unit_name_build(prefix, instance ?: "internal", ".service", &name);
912✔
1421
        if (r < 0)
457✔
1422
                return r;
1423

1424
        return manager_load_unit(UNIT(s)->manager, name, NULL, NULL, ret);
457✔
1425
}
1426

1427
static int socket_determine_selinux_label(Socket *s, char **ret) {
2,285✔
1428
        Unit *service;
2,285✔
1429
        int r;
2,285✔
1430

1431
        assert(s);
2,285✔
1432
        assert(ret);
2,285✔
1433

1434
        r = socket_load_service_unit(s, /* cfd= */ -EBADF, &service);
2,285✔
1435
        if (r == -ENODATA) {
2,285✔
1436
                *ret = NULL;
×
1437
                return 0;
×
1438
        }
1439
        if (r < 0)
2,285✔
1440
                return r;
1441

1442
        r = service_determine_exec_selinux_label(SERVICE(service), ret);
4,570✔
1443
        if (r == -ENODATA) {
2,285✔
1444
                *ret = NULL;
2,285✔
1445
                return 0;
2,285✔
1446
        }
1447
        return r;
1448
}
1449

1450
static int socket_address_listen_do(
2,349✔
1451
                Socket *s,
1452
                const SocketAddress *address,
1453
                const char *label) {
1454

1455
        assert(s);
2,349✔
1456
        assert(address);
2,349✔
1457

1458
        return socket_address_listen(
4,698✔
1459
                        address,
1460
                        SOCK_CLOEXEC|SOCK_NONBLOCK,
1461
                        s->backlog,
2,349✔
1462
                        s->bind_ipv6_only,
1463
                        s->bind_to_device,
2,349✔
1464
                        s->reuse_port,
2,349✔
1465
                        s->free_bind,
2,349✔
1466
                        s->transparent,
2,349✔
1467
                        s->directory_mode,
1468
                        s->socket_mode,
1469
                        label);
1470
}
1471

1472
#define log_address_error_errno(u, address, error, fmt)          \
1473
        ({                                                       \
1474
                _cleanup_free_ char *_t = NULL;                  \
1475
                                                                 \
1476
                (void) socket_address_print(address, &_t);       \
1477
                log_unit_error_errno(u, error, fmt, strna(_t));  \
1478
        })
1479

1480
static int fork_needed(const SocketAddress *address, Socket *s) {
2,348✔
1481
        int r;
2,348✔
1482

1483
        assert(address);
2,348✔
1484
        assert(s);
2,348✔
1485

1486
        /* Check if we need to do the cgroup or netns stuff. If not we can do things much simpler. */
1487

1488
        /* If there are any NFTSet= directives with cgroup source, we need the cgroup */
1489
        Unit *u = UNIT(s);
2,348✔
1490
        CGroupContext *c = unit_get_cgroup_context(u);
2,348✔
1491
        if (c)
2,348✔
1492
                FOREACH_ARRAY(nft_set, c->nft_set_context.sets, c->nft_set_context.n_sets)
2,348✔
1493
                        if (nft_set->source == NFT_SET_SOURCE_CGROUP)
×
1494
                                return true;
1495

1496
        if (IN_SET(address->sockaddr.sa.sa_family, AF_INET, AF_INET6)) {
2,348✔
1497
                r = bpf_firewall_supported();
×
1498
                if (r < 0)
×
1499
                        return r;
1500
                if (r != BPF_FIREWALL_UNSUPPORTED) /* If BPF firewalling isn't supported anyway — there's no point in this forking complexity */
×
1501
                        return true;
1502
        }
1503

1504
        return exec_needs_network_namespace(&s->exec_context);
2,348✔
1505
}
1506

1507
static int socket_address_listen_in_cgroup(
2,348✔
1508
                Socket *s,
1509
                const SocketAddress *address,
1510
                const char *label) {
1511

1512
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1513
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
2,348✔
1514
        int fd, r;
2,348✔
1515

1516
        assert(s);
2,348✔
1517
        assert(address);
2,348✔
1518

1519
        /* This is a wrapper around socket_address_listen(), that forks off a helper process inside the
1520
         * socket's cgroup and network namespace in which the socket is actually created. This way we ensure
1521
         * the socket is actually properly attached to the unit's cgroup for the purpose of BPF filtering and
1522
         * such. */
1523

1524
        r = fork_needed(address, s);
2,348✔
1525
        if (r < 0)
2,348✔
1526
                return r;
1527
        if (r == 0) {
2,348✔
1528
                /* Shortcut things... */
1529
                fd = socket_address_listen_do(s, address, label);
2,348✔
1530
                if (fd < 0)
2,348✔
1531
                        return log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1532

1533
                return fd;
1534
        }
1535

1536
        r = unit_setup_exec_runtime(UNIT(s));
×
1537
        if (r < 0)
×
1538
                return log_unit_error_errno(UNIT(s), r, "Failed acquire runtime: %m");
×
1539

1540
        if (s->exec_context.network_namespace_path &&
×
1541
            s->exec_runtime &&
×
1542
            s->exec_runtime->shared &&
×
1543
            s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1544
                r = open_shareable_ns_path(s->exec_runtime->shared->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
×
1545
                if (r < 0)
×
1546
                        return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
×
1547
        }
1548

1549
        if (s->exec_context.ipc_namespace_path &&
×
1550
            s->exec_runtime &&
×
1551
            s->exec_runtime->shared &&
×
1552
            s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
×
1553
                r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
×
1554
                if (r < 0)
×
1555
                        return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
×
1556
        }
1557

1558
        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
×
1559
                return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
×
1560

1561
        r = unit_fork_helper_process(UNIT(s), "(sd-listen)", /* into_cgroup= */ true, &pid);
×
1562
        if (r < 0)
1✔
1563
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off listener stub process: %m");
×
1564
        if (r == 0) {
1✔
1565
                /* Child */
1566

1567
                pair[0] = safe_close(pair[0]);
1✔
1568

1569
                if (exec_needs_network_namespace(&s->exec_context) &&
1✔
1570
                    s->exec_runtime &&
×
1571
                    s->exec_runtime->shared &&
×
1572
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1573

1574
                        if (namespace_type_supported(NAMESPACE_NET)) {
×
1575
                                r = setup_shareable_ns(s->exec_runtime->shared->netns_storage_socket, CLONE_NEWNET);
×
1576
                                if (r < 0) {
×
1577
                                        log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
×
1578
                                        _exit(EXIT_NETWORK);
×
1579
                                }
1580
                        } else if (s->exec_context.network_namespace_path) {
×
1581
                                log_unit_error(UNIT(s), "Network namespace path configured but network namespaces not supported.");
×
1582
                                _exit(EXIT_NETWORK);
×
1583
                        } else
1584
                                log_unit_warning(UNIT(s), "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
×
1585
                }
1586

1587
                fd = socket_address_listen_do(s, address, label);
1✔
1588
                if (fd < 0) {
1✔
1589
                        log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1590
                        _exit(EXIT_FAILURE);
×
1591
                }
1592

1593
                r = send_one_fd(pair[1], fd, 0);
1✔
1594
                if (r < 0) {
1✔
1595
                        log_address_error_errno(UNIT(s), address, r, "Failed to send listening socket (%s) to parent: %m");
×
1596
                        _exit(EXIT_FAILURE);
×
1597
                }
1598

1599
                _exit(EXIT_SUCCESS);
1✔
1600
        }
1601

1602
        pair[1] = safe_close(pair[1]);
×
1603
        fd = receive_one_fd(pair[0], 0);
×
1604

1605
        /* We synchronously wait for the helper, as it shouldn't be slow */
1606
        r = wait_for_terminate_and_check("(sd-listen)", pid.pid, WAIT_LOG_ABNORMAL);
×
1607
        if (r < 0) {
×
1608
                safe_close(fd);
×
1609
                return r;
1610
        }
1611

1612
        if (fd < 0)
×
1613
                return log_address_error_errno(UNIT(s), address, fd, "Failed to receive listening socket (%s): %m");
×
1614

1615
        return fd;
1616
}
1617

1618
static int socket_open_fds(Socket *orig_s) {
2,324✔
1619
        _cleanup_(socket_close_fdsp) Socket *s = orig_s;
2,324✔
1620
        _cleanup_freecon_ char *label = NULL;
2,324✔
1621
        bool know_label = false;
2,324✔
1622
        int r;
2,324✔
1623

1624
        assert(s);
2,324✔
1625

1626
        LIST_FOREACH(port, p, s->ports) {
2,324✔
1627

1628
                if (p->fd >= 0)
2,420✔
1629
                        continue;
×
1630

1631
                switch (p->type) {
2,420✔
1632

1633
                case SOCKET_SOCKET:
2,348✔
1634

1635
                        if (!know_label) {
2,348✔
1636
                                /* Figure out the label, if we don't it know yet. We do it once for the first
1637
                                 * socket where we need this and remember it for the rest. */
1638

1639
                                r = socket_determine_selinux_label(s, &label);
2,285✔
1640
                                if (r < 0)
2,285✔
1641
                                        return log_unit_error_errno(UNIT(s), r, "Failed to determine SELinux label: %m");
×
1642

1643
                                know_label = true;
1644
                        }
1645

1646
                        /* Apply the socket protocol */
1647
                        switch (p->address.type) {
2,348✔
1648

1649
                        case SOCK_STREAM:
2,180✔
1650
                                if (IN_SET(s->socket_protocol, IPPROTO_SCTP, IPPROTO_MPTCP))
2,180✔
1651
                                        p->address.protocol = s->socket_protocol;
×
1652
                                break;
1653

1654
                        case SOCK_SEQPACKET:
48✔
1655
                                if (s->socket_protocol == IPPROTO_SCTP)
48✔
1656
                                        p->address.protocol = s->socket_protocol;
×
1657
                                break;
1658

1659
                        case SOCK_DGRAM:
60✔
1660
                                if (s->socket_protocol == IPPROTO_UDPLITE)
60✔
1661
                                        p->address.protocol = s->socket_protocol;
×
1662
                                break;
1663
                        }
1664

1665
                        p->fd = socket_address_listen_in_cgroup(s, &p->address, label);
2,348✔
1666
                        if (p->fd < 0)
2,348✔
1667
                                return p->fd;
1668

1669
                        socket_apply_socket_options(s, p, p->fd);
2,348✔
1670
                        socket_symlink(s);
2,348✔
1671
                        break;
1672

1673
                case SOCKET_SPECIAL:
6✔
1674

1675
                        p->fd = special_address_create(p->path, s->writable);
6✔
1676
                        if (p->fd < 0)
6✔
1677
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open special file '%s': %m", p->path);
×
1678
                        break;
1679

1680
                case SOCKET_FIFO:
66✔
1681

1682
                        p->fd = fifo_address_create(
132✔
1683
                                        p->path,
66✔
1684
                                        s->directory_mode,
1685
                                        s->socket_mode);
1686
                        if (p->fd < 0)
66✔
1687
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open FIFO '%s': %m", p->path);
×
1688

1689
                        socket_apply_fifo_options(s, p->fd);
66✔
1690
                        socket_symlink(s);
66✔
1691
                        break;
1692

1693
                case SOCKET_MQUEUE:
×
1694

1695
                        p->fd = mq_address_create(
×
1696
                                        p->path,
×
1697
                                        s->socket_mode,
1698
                                        s->mq_maxmsg,
1699
                                        s->mq_msgsize);
1700
                        if (p->fd < 0)
×
1701
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open message queue '%s': %m", p->path);
×
1702
                        break;
1703

1704
                case SOCKET_USB_FUNCTION: {
×
1705
                        _cleanup_close_ int dfd = -EBADF;
4,744✔
1706

1707
                        dfd = open(p->path, O_DIRECTORY|O_CLOEXEC);
×
1708
                        if (dfd < 0)
×
1709
                                return log_unit_error_errno(UNIT(s), errno,
×
1710
                                                            "Failed to open USB FunctionFS dir '%s': %m", p->path);
1711

1712
                        p->fd = usbffs_address_create_at(dfd, "ep0");
×
1713
                        if (p->fd < 0)
×
1714
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open USB FunctionFS ep0: %m");
×
1715

1716
                        r = usbffs_write_descs(p->fd, SERVICE(UNIT_DEREF(s->service)));
×
1717
                        if (r < 0)
×
1718
                                return log_unit_error_errno(UNIT(s), r, "Failed to write to USB FunctionFS ep0: %m");
×
1719

1720
                        r = usbffs_dispatch_eps(p, dfd);
×
1721
                        if (r < 0)
×
1722
                                return log_unit_error_errno(UNIT(s), r, "Failed to dispatch USB FunctionFS eps: %m");
×
1723

1724
                        break;
×
1725
                }
1726

1727
                default:
×
1728
                        assert_not_reached();
×
1729
                }
1730
        }
1731

1732
        TAKE_PTR(s);
1733
        return 0;
1734
}
1735

1736
static void socket_unwatch_fds(Socket *s) {
6,430✔
1737
        int r;
6,430✔
1738

1739
        assert(s);
6,430✔
1740

1741
        LIST_FOREACH(port, p, s->ports) {
13,176✔
1742
                if (p->fd < 0)
6,746✔
1743
                        continue;
2,420✔
1744

1745
                r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
4,326✔
1746
                if (r < 0)
4,326✔
1747
                        log_unit_debug_errno(UNIT(s), r, "Failed to disable event source: %m");
×
1748
        }
1749
}
6,430✔
1750

1751
static int socket_watch_fds(Socket *s) {
3,754✔
1752
        int r;
3,754✔
1753

1754
        assert(s);
3,754✔
1755

1756
        LIST_FOREACH(port, p, s->ports) {
7,712✔
1757
                if (p->fd < 0)
3,958✔
1758
                        continue;
×
1759

1760
                if (p->event_source) {
3,958✔
1761
                        r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
670✔
1762
                        if (r < 0)
670✔
1763
                                goto fail;
×
1764
                } else {
1765
                        r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
3,288✔
1766
                        if (r < 0)
3,288✔
1767
                                goto fail;
×
1768

1769
                        (void) sd_event_source_set_description(p->event_source, "socket-port-io");
3,288✔
1770
                }
1771

1772
                r = sd_event_source_set_ratelimit(p->event_source, s->poll_limit.interval, s->poll_limit.burst);
3,958✔
1773
                if (r < 0)
3,958✔
1774
                        log_unit_debug_errno(UNIT(s), r, "Failed to set poll limit on I/O event source, ignoring: %m");
×
1775
        }
1776

1777
        return 0;
1778

1779
fail:
×
1780
        log_unit_warning_errno(UNIT(s), r, "Failed to watch listening fds: %m");
×
1781
        socket_unwatch_fds(s);
×
1782
        return r;
×
1783
}
1784

1785
enum {
1786
        SOCKET_OPEN_NONE,
1787
        SOCKET_OPEN_SOME,
1788
        SOCKET_OPEN_ALL,
1789
};
1790

1791
static int socket_check_open(Socket *s) {
1,233✔
1792
        bool have_open = false, have_closed = false;
1,233✔
1793

1794
        assert(s);
1,233✔
1795

1796
        LIST_FOREACH(port, p, s->ports) {
2,622✔
1797
                if (p->fd < 0)
1,389✔
1798
                        have_closed = true;
1799
                else
1800
                        have_open = true;
1,389✔
1801

1802
                if (have_open && have_closed)
1,389✔
1803
                        return SOCKET_OPEN_SOME;
1804
        }
1805

1806
        if (have_open)
1,233✔
1807
                return SOCKET_OPEN_ALL;
1,233✔
1808

1809
        return SOCKET_OPEN_NONE;
1810
}
1811

1812
static void socket_set_state(Socket *s, SocketState state) {
10,184✔
1813
        SocketState old_state;
10,184✔
1814

1815
        assert(s);
10,184✔
1816

1817
        if (s->state != state)
10,184✔
1818
                bus_unit_send_pending_change_signal(UNIT(s), false);
8,824✔
1819

1820
        old_state = s->state;
10,184✔
1821
        s->state = state;
10,184✔
1822

1823
        if (!SOCKET_STATE_WITH_PROCESS(state)) {
10,184✔
1824
                s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
10,012✔
1825
                socket_unwatch_control_pid(s);
10,012✔
1826
                s->control_command = NULL;
10,012✔
1827
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
10,012✔
1828
        }
1829

1830
        if (state != SOCKET_LISTENING)
10,184✔
1831
                socket_unwatch_fds(s);
6,430✔
1832

1833
        if (!IN_SET(state,
6,430✔
1834
                    SOCKET_START_OPEN,
1835
                    SOCKET_START_CHOWN,
1836
                    SOCKET_START_POST,
1837
                    SOCKET_LISTENING,
1838
                    SOCKET_RUNNING,
1839
                    SOCKET_STOP_PRE,
1840
                    SOCKET_STOP_PRE_SIGTERM,
1841
                    SOCKET_STOP_PRE_SIGKILL))
1842
                socket_close_fds(s);
1,927✔
1843

1844
        if (state != old_state)
10,184✔
1845
                log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state));
8,824✔
1846

1847
        unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], /* reload_success = */ true);
10,184✔
1848
}
10,184✔
1849

1850
static int socket_coldplug(Unit *u) {
2,952✔
1851
        Socket *s = ASSERT_PTR(SOCKET(u));
2,952✔
1852
        int r;
2,952✔
1853

1854
        assert(s->state == SOCKET_DEAD);
2,952✔
1855

1856
        if (s->deserialized_state == s->state)
2,952✔
1857
                return 0;
1858

1859
        if (pidref_is_set(&s->control_pid) &&
1,233✔
1860
            pidref_is_unwaited(&s->control_pid) > 0 &&
×
1861
            SOCKET_STATE_WITH_PROCESS(s->deserialized_state)) {
×
1862

1863
                r = unit_watch_pidref(UNIT(s), &s->control_pid, /* exclusive= */ false);
×
1864
                if (r < 0)
×
1865
                        return r;
1866

1867
                r = socket_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec));
×
1868
                if (r < 0)
×
1869
                        return r;
1870
        }
1871

1872
        if (IN_SET(s->deserialized_state,
1,233✔
1873
                   SOCKET_START_OPEN,
1874
                   SOCKET_START_CHOWN,
1875
                   SOCKET_START_POST,
1876
                   SOCKET_LISTENING,
1877
                   SOCKET_RUNNING)) {
1878

1879
                /* Originally, we used to simply reopen all sockets here that we didn't have file descriptors
1880
                 * for. However, this is problematic, as we won't traverse through the SOCKET_START_CHOWN state for
1881
                 * them, and thus the UID/GID wouldn't be right. Hence, instead simply check if we have all fds open,
1882
                 * and if there's a mismatch, warn loudly.
1883
                 *
1884
                 * Note that SOCKET_START_OPEN requires no special treatment, as it's only intermediate
1885
                 * between SOCKET_START_PRE and SOCKET_START_CHOWN and shall otherwise not be observed.
1886
                 * It's listed only for consistency. */
1887

1888
                r = socket_check_open(s);
1,233✔
1889
                if (r == SOCKET_OPEN_NONE)
1,233✔
1890
                        log_unit_warning(UNIT(s),
×
1891
                                         "Socket unit configuration has changed while unit has been running, "
1892
                                         "no open socket file descriptor left. "
1893
                                         "The socket unit is not functional until restarted.");
1894
                else if (r == SOCKET_OPEN_SOME)
1,233✔
1895
                        log_unit_warning(UNIT(s),
×
1896
                                         "Socket unit configuration has changed while unit has been running, "
1897
                                         "and some socket file descriptors have not been opened yet. "
1898
                                         "The socket unit is not fully functional until restarted.");
1899
        }
1900

1901
        if (s->deserialized_state == SOCKET_LISTENING) {
1,233✔
1902
                r = socket_watch_fds(s);
750✔
1903
                if (r < 0)
750✔
1904
                        return r;
1905
        }
1906

1907
        if (!IN_SET(s->deserialized_state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_CLEANING))
1,233✔
1908
                (void) unit_setup_exec_runtime(u);
1,233✔
1909

1910
        socket_set_state(s, s->deserialized_state);
1,233✔
1911
        return 0;
1,233✔
1912
}
1913

1914
static int socket_spawn(Socket *s, ExecCommand *c, PidRef *ret_pid) {
172✔
1915
        _cleanup_(exec_params_shallow_clear) ExecParameters exec_params = EXEC_PARAMETERS_INIT(
172✔
1916
                        EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN);
1917
        _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
172✔
1918
        int r;
172✔
1919

1920
        assert(s);
172✔
1921
        assert(c);
172✔
1922
        assert(ret_pid);
172✔
1923

1924
        r = unit_prepare_exec(UNIT(s));
172✔
1925
        if (r < 0)
172✔
1926
                return r;
1927

1928
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
172✔
1929
        if (r < 0)
172✔
1930
                return r;
1931

1932
        r = unit_set_exec_params(UNIT(s), &exec_params);
172✔
1933
        if (r < 0)
172✔
1934
                return r;
1935

1936
        /* Note that ExecStartPre= command doesn't inherit any FDs. It runs before we open listen FDs. */
1937
        if (s->pass_fds_to_exec) {
172✔
1938
                _cleanup_strv_free_ char **fd_names = NULL;
×
1939
                _cleanup_free_ int *fds = NULL;
×
1940
                int n_fds;
×
1941

1942
                n_fds = socket_collect_fds(s, &fds);
×
1943
                if (n_fds < 0)
×
1944
                        return n_fds;
1945

1946
                r = strv_extend_n(&fd_names, socket_fdname(s), n_fds);
×
1947
                if (r < 0)
×
1948
                        return r;
1949

1950
                exec_params.flags |= EXEC_PASS_FDS;
×
1951
                exec_params.fds = TAKE_PTR(fds);
×
1952
                exec_params.fd_names = TAKE_PTR(fd_names);
×
1953
                exec_params.n_socket_fds = n_fds;
×
1954
        }
1955

1956
        r = exec_spawn(UNIT(s),
172✔
1957
                       c,
1958
                       &s->exec_context,
172✔
1959
                       &exec_params,
1960
                       s->exec_runtime,
1961
                       &s->cgroup_context,
172✔
1962
                       &pidref);
1963
        if (r < 0)
172✔
1964
                return r;
1965

1966
        r = unit_watch_pidref(UNIT(s), &pidref, /* exclusive= */ true);
172✔
1967
        if (r < 0)
172✔
1968
                return r;
1969

1970
        *ret_pid = TAKE_PIDREF(pidref);
172✔
1971
        return 0;
172✔
1972
}
1973

1974
static int socket_chown(Socket *s, PidRef *ret_pid) {
×
1975
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1976
        int r;
×
1977

1978
        assert(s);
×
1979

1980
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
1981
        if (r < 0)
×
1982
                return r;
1983

1984
        /* We have to resolve the user names out-of-process, hence
1985
         * let's fork here. It's messy, but well, what can we do? */
1986

1987
        r = unit_fork_helper_process(UNIT(s), "(sd-chown)", /* into_cgroup= */ true, &pid);
×
1988
        if (r < 0)
3✔
1989
                return r;
1990
        if (r == 0) {
3✔
1991
                uid_t uid = UID_INVALID;
3✔
1992
                gid_t gid = GID_INVALID;
3✔
1993

1994
                /* Child */
1995

1996
                if (!isempty(s->user)) {
3✔
1997
                        const char *user = s->user;
1✔
1998

1999
                        r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0);
1✔
2000
                        if (r < 0) {
1✔
2001
                                log_unit_error_errno(UNIT(s), r, "Failed to resolve user %s: %m", user);
×
2002
                                _exit(EXIT_USER);
×
2003
                        }
2004
                }
2005

2006
                if (!isempty(s->group)) {
3✔
2007
                        const char *group = s->group;
3✔
2008

2009
                        r = get_group_creds(&group, &gid, 0);
3✔
2010
                        if (r < 0) {
3✔
2011
                                log_unit_error_errno(UNIT(s), r, "Failed to resolve group %s: %m", group);
×
2012
                                _exit(EXIT_GROUP);
×
2013
                        }
2014
                }
2015

2016
                LIST_FOREACH(port, p, s->ports) {
6✔
2017
                        const char *path = NULL;
3✔
2018

2019
                        if (p->type == SOCKET_SOCKET)
3✔
2020
                                path = socket_address_get_path(&p->address);
2✔
2021
                        else if (p->type == SOCKET_FIFO)
1✔
2022
                                path = p->path;
×
2023
                        else if (p->type == SOCKET_MQUEUE) {
1✔
2024
                                /* Use fchown on the fd since /dev/mqueue might not be mounted. */
2025
                                if (fchown(p->fd, uid, gid) < 0) {
1✔
2026
                                        log_unit_error_errno(UNIT(s), errno, "Failed to fchown(): %m");
×
2027
                                        _exit(EXIT_CHOWN);
×
2028
                                }
2029
                                continue;
1✔
2030
                        }
2031

2032
                        if (!path)
2✔
2033
                                continue;
×
2034

2035
                        if (chown(path, uid, gid) < 0) {
2✔
2036
                                log_unit_error_errno(UNIT(s), errno, "Failed to chown(): %m");
×
2037
                                _exit(EXIT_CHOWN);
×
2038
                        }
2039
                }
2040

2041
                _exit(EXIT_SUCCESS);
3✔
2042
        }
2043

2044
        r = unit_watch_pidref(UNIT(s), &pid, /* exclusive= */ true);
×
2045
        if (r < 0)
×
2046
                return r;
2047

2048
        *ret_pid = TAKE_PIDREF(pid);
×
2049
        return 0;
×
2050
}
2051

2052
static void socket_enter_dead(Socket *s, SocketResult f) {
1,927✔
2053
        assert(s);
1,927✔
2054

2055
        if (s->result == SOCKET_SUCCESS)
1,927✔
2056
                s->result = f;
1,927✔
2057

2058
        if (s->result == SOCKET_SUCCESS)
1,927✔
2059
                unit_log_success(UNIT(s));
1,927✔
2060
        else
2061
                unit_log_failure(UNIT(s), socket_result_to_string(s->result));
×
2062

2063
        unit_warn_leftover_processes(UNIT(s), /* start = */ false);
1,927✔
2064

2065
        socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
3,854✔
2066

2067
        s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
1,927✔
2068

2069
        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
1,927✔
2070

2071
        unit_unref_uid_gid(UNIT(s), true);
1,927✔
2072
}
1,927✔
2073

2074
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
2075

2076
static void socket_enter_stop_post(Socket *s, SocketResult f) {
1,927✔
2077
        int r;
1,927✔
2078

2079
        assert(s);
1,927✔
2080

2081
        if (s->result == SOCKET_SUCCESS)
1,927✔
2082
                s->result = f;
1,927✔
2083

2084
        socket_unwatch_control_pid(s);
1,927✔
2085
        s->control_command_id = SOCKET_EXEC_STOP_POST;
1,927✔
2086
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST];
1,927✔
2087

2088
        if (s->control_command) {
1,927✔
2089
                pidref_done(&s->control_pid);
×
2090

2091
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2092
                if (r < 0) {
×
2093
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-post' task: %m");
×
2094
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2095
                        return;
×
2096
                }
2097

2098
                socket_set_state(s, SOCKET_STOP_POST);
×
2099
        } else
2100
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
1,927✔
2101
}
2102

2103
static int state_to_kill_operation(Socket *s, SocketState state) {
3,854✔
2104
        assert(s);
3,854✔
2105

2106
        if (state == SOCKET_STOP_PRE_SIGTERM)
3,854✔
2107
                return unit_has_job_type(UNIT(s), JOB_RESTART) ? KILL_RESTART : KILL_TERMINATE;
×
2108

2109
        if (state == SOCKET_FINAL_SIGTERM)
3,854✔
2110
                return KILL_TERMINATE;
1,927✔
2111

2112
        return KILL_KILL;
2113
}
2114

2115
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
3,854✔
2116
        int r;
3,854✔
2117

2118
        assert(s);
3,854✔
2119

2120
        if (s->result == SOCKET_SUCCESS)
3,854✔
2121
                s->result = f;
3,854✔
2122

2123
        r = unit_kill_context(UNIT(s), state_to_kill_operation(s, state));
3,854✔
2124
        if (r < 0) {
3,854✔
2125
                log_unit_warning_errno(UNIT(s), r, "Failed to kill processes: %m");
×
2126
                goto fail;
×
2127
        }
2128
        if (r > 0) {
3,854✔
2129
                r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
2130
                if (r < 0) {
×
2131
                        log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2132
                        goto fail;
×
2133
                }
2134

2135
                socket_set_state(s, state);
×
2136
        } else if (state == SOCKET_STOP_PRE_SIGTERM)
3,854✔
2137
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
×
2138
        else if (state == SOCKET_STOP_PRE_SIGKILL)
3,854✔
2139
                socket_enter_stop_post(s, SOCKET_SUCCESS);
×
2140
        else if (state == SOCKET_FINAL_SIGTERM)
3,854✔
2141
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
1,927✔
2142
        else
2143
                socket_enter_dead(s, SOCKET_SUCCESS);
1,927✔
2144

2145
        return;
2146

2147
fail:
×
2148
        if (IN_SET(state, SOCKET_STOP_PRE_SIGTERM, SOCKET_STOP_PRE_SIGKILL))
×
2149
                socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2150
        else
2151
                socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2152
}
2153

2154
static void socket_enter_stop_pre(Socket *s, SocketResult f) {
1,927✔
2155
        int r;
1,927✔
2156

2157
        assert(s);
1,927✔
2158

2159
        if (s->result == SOCKET_SUCCESS)
1,927✔
2160
                s->result = f;
1,927✔
2161

2162
        socket_unwatch_control_pid(s);
1,927✔
2163
        s->control_command_id = SOCKET_EXEC_STOP_PRE;
1,927✔
2164
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE];
1,927✔
2165

2166
        if (s->control_command) {
1,927✔
2167
                pidref_done(&s->control_pid);
×
2168

2169
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2170
                if (r < 0) {
×
2171
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-pre' task: %m");
×
2172
                        socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2173
                        return;
×
2174
                }
2175

2176
                socket_set_state(s, SOCKET_STOP_PRE);
×
2177
        } else
2178
                socket_enter_stop_post(s, SOCKET_SUCCESS);
1,927✔
2179
}
2180

UNCOV
2181
static void flush_ports(Socket *s) {
×
UNCOV
2182
        assert(s);
×
2183

2184
        /* Flush all incoming traffic, regardless if actual bytes or new connections, so that this socket isn't busy
2185
         * anymore */
2186

UNCOV
2187
        LIST_FOREACH(port, p, s->ports) {
×
UNCOV
2188
                if (p->fd < 0)
×
2189
                        continue;
×
2190

UNCOV
2191
                (void) flush_accept(p->fd);
×
UNCOV
2192
                (void) flush_fd(p->fd);
×
2193
        }
UNCOV
2194
}
×
2195

2196
static void socket_enter_listening(Socket *s) {
3,004✔
2197
        int r;
3,004✔
2198

2199
        assert(s);
3,004✔
2200

2201
        if (!s->accept && s->flush_pending) {
3,004✔
2202
                log_unit_debug(UNIT(s), "Flushing socket before listening.");
×
2203
                flush_ports(s);
×
2204
        }
2205

2206
        r = socket_watch_fds(s);
3,004✔
2207
        if (r < 0) {
3,004✔
2208
                log_unit_warning_errno(UNIT(s), r, "Failed to watch sockets: %m");
×
2209
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2210
                return;
×
2211
        }
2212

2213
        socket_set_state(s, SOCKET_LISTENING);
3,004✔
2214
}
2215

2216
static void socket_enter_start_post(Socket *s) {
2,324✔
2217
        int r;
2,324✔
2218

2219
        assert(s);
2,324✔
2220

2221
        socket_unwatch_control_pid(s);
2,324✔
2222
        s->control_command_id = SOCKET_EXEC_START_POST;
2,324✔
2223
        s->control_command = s->exec_command[SOCKET_EXEC_START_POST];
2,324✔
2224

2225
        if (s->control_command) {
2,324✔
2226
                pidref_done(&s->control_pid);
172✔
2227

2228
                r = socket_spawn(s, s->control_command, &s->control_pid);
172✔
2229
                if (r < 0) {
172✔
2230
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-post' task: %m");
×
2231
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2232
                        return;
×
2233
                }
2234

2235
                socket_set_state(s, SOCKET_START_POST);
172✔
2236
        } else
2237
                socket_enter_listening(s);
2,152✔
2238
}
2239

2240
static void socket_enter_start_chown(Socket *s) {
2,324✔
2241
        int r;
2,324✔
2242

2243
        assert(s);
2,324✔
2244
        assert(s->state == SOCKET_START_OPEN);
2,324✔
2245

2246
        if (!isempty(s->user) || !isempty(s->group)) {
2,324✔
2247

2248
                socket_unwatch_control_pid(s);
×
2249
                s->control_command_id = SOCKET_EXEC_START_CHOWN;
×
2250
                s->control_command = NULL;
×
2251

2252
                r = socket_chown(s, &s->control_pid);
×
2253
                if (r < 0) {
×
2254
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-chown' task: %m");
×
2255
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2256
                        return;
×
2257
                }
2258

2259
                socket_set_state(s, SOCKET_START_CHOWN);
×
2260
        } else
2261
                socket_enter_start_post(s);
2,324✔
2262
}
2263

2264
static void socket_enter_start_open(Socket *s) {
2,324✔
2265
        int r;
2,324✔
2266

2267
        assert(s);
2,324✔
2268
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_START_PRE));
2,324✔
2269

2270
        /* We force a state transition here even though we're not spawning any process (i.e. the state is purely
2271
         * intermediate), so that failure of socket_open_fds() always causes a state change in unit_notify().
2272
         * Otherwise, if no Exec*= is defined, we might go from previous SOCKET_FAILED to SOCKET_FAILED,
2273
         * meaning the OnFailure= deps are unexpectedly skipped (#35635). */
2274

2275
        socket_set_state(s, SOCKET_START_OPEN);
2,324✔
2276

2277
        r = socket_open_fds(s);
2,324✔
2278
        if (r < 0) {
2,324✔
2279
                log_unit_error_errno(UNIT(s), r, "Failed to listen on sockets: %m");
×
2280
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2281
                return;
×
2282
        }
2283

2284
        socket_enter_start_chown(s);
2,324✔
2285
}
2286

2287
static void socket_enter_start_pre(Socket *s) {
2,324✔
2288
        int r;
2,324✔
2289

2290
        assert(s);
2,324✔
2291

2292
        socket_unwatch_control_pid(s);
2,324✔
2293

2294
        unit_warn_leftover_processes(UNIT(s), /* start = */ true);
2,324✔
2295

2296
        s->control_command_id = SOCKET_EXEC_START_PRE;
2,324✔
2297
        s->control_command = s->exec_command[SOCKET_EXEC_START_PRE];
2,324✔
2298

2299
        if (s->control_command) {
2,324✔
2300
                pidref_done(&s->control_pid);
×
2301

2302
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2303
                if (r < 0) {
×
2304
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-pre' task: %m");
×
2305
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2306
                        return;
×
2307
                }
2308

2309
                socket_set_state(s, SOCKET_START_PRE);
×
2310
        } else
2311
                socket_enter_start_open(s);
2,324✔
2312
}
2313

2314
static void socket_enter_running(Socket *s, int cfd_in) {
211✔
2315
        /* Note that this call takes possession of the connection fd passed. It either has to assign it
2316
         * somewhere or close it. */
2317
        _cleanup_close_ int cfd = cfd_in;
211✔
2318
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
211✔
2319
        int r;
211✔
2320

2321
        assert(s);
211✔
2322

2323
        /* We don't take connections anymore if we are supposed to shut down anyway */
2324
        if (unit_stop_pending(UNIT(s))) {
211✔
2325

UNCOV
2326
                log_unit_debug(UNIT(s), "Suppressing connection request since unit stop is scheduled.");
×
2327

UNCOV
2328
                if (cfd >= 0)
×
2329
                        goto refuse;
×
2330

UNCOV
2331
                flush_ports(s);
×
2332
                return;
2333
        }
2334

2335
        if (!ratelimit_below(&s->trigger_limit)) {
211✔
2336
                log_unit_warning(UNIT(s), "Trigger limit hit, refusing further activation.");
×
2337
                socket_enter_stop_pre(s, SOCKET_FAILURE_TRIGGER_LIMIT_HIT);
×
2338
                goto refuse;
×
2339
        }
2340

2341
        if (cfd < 0) { /* Accept=no case */
211✔
2342
                bool pending = false;
209✔
2343
                Unit *other;
209✔
2344

2345
                /* If there's already a start pending don't bother to do anything */
2346
                UNIT_FOREACH_DEPENDENCY(other, UNIT(s), UNIT_ATOM_TRIGGERS)
720✔
2347
                        if (unit_active_or_pending(other)) {
209✔
2348
                                pending = true;
2349
                                break;
2350
                        }
2351

2352
                if (!pending) {
209✔
2353
                        if (!UNIT_ISSET(s->service)) {
93✔
2354
                                log_unit_warning(UNIT(s),
×
2355
                                                 "Service to activate vanished, refusing activation.");
2356
                                goto fail;
×
2357
                        }
2358

2359
                        r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, /* ret = */ NULL);
93✔
2360
                        if (r == -EDEADLK)
93✔
2361
                                return (void) log_unit_debug_errno(UNIT(s), r, "Failed to queue service startup job, ignoring: %s", bus_error_message(&error, r));
×
2362
                        if (r < 0)
93✔
2363
                                goto queue_error;
×
2364
                }
2365

2366
                socket_set_state(s, SOCKET_RUNNING);
209✔
2367
        } else { /* Accept=yes case */
2368
                _cleanup_(socket_peer_unrefp) SocketPeer *p = NULL;
2✔
2369
                Unit *service;
2✔
2370

2371
                if (s->n_connections >= s->max_connections) {
2✔
2372
                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), dropping connection.",
×
2373
                                         s->n_connections);
2374
                        goto refuse;
×
2375
                }
2376

2377
                if (s->max_connections_per_source > 0) {
2✔
2378
                        r = socket_acquire_peer(s, cfd, &p);
2✔
2379
                        if (r < 0) {
2✔
2380
                                if (ERRNO_IS_DISCONNECT(r))
×
2381
                                        return;
2382
                                /* We didn't have enough resources to acquire peer information, let's fail. */
2383
                                goto fail;
×
2384
                        }
2385
                        if (r > 0 && p->n_ref > s->max_connections_per_source) {
2✔
2386
                                _cleanup_free_ char *t = NULL;
×
2387

2388
                                if (p->peer.sa.sa_family == AF_UNIX)
×
2389
                                        (void) asprintf(&t, "UID " UID_FMT, p->peer_cred.uid);
×
2390
                                else
2391
                                        (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, /* translate_ipv6= */ true, /* include_port= */ false, &t);
×
2392

2393
                                log_unit_warning(UNIT(s),
×
2394
                                                 "Too many incoming connections (%u) from source %s, dropping connection.",
2395
                                                 p->n_ref, strnull(t));
2396
                                goto refuse;
×
2397
                        }
2398
                }
2399

2400
                r = socket_load_service_unit(s, cfd, &service);
2✔
2401
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
2402
                        return;
2403
                if (r < 0 || UNIT_IS_LOAD_ERROR(service->load_state)) {
2✔
2404
                        log_unit_warning_errno(UNIT(s), r < 0 ? r : service->load_error,
×
2405
                                               "Failed to load connection service unit: %m");
2406
                        goto fail;
×
2407
                }
2408
                if (service->load_state == UNIT_MASKED) {
2✔
2409
                        log_unit_warning(UNIT(s), "Connection service unit is masked, refusing.");
×
2410
                        goto fail;
×
2411
                }
2412

2413
                s->n_accepted++;
2✔
2414

2415
                r = service_set_socket_fd(SERVICE(service), cfd, s, p, s->selinux_context_from_net);
4✔
2416
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
2417
                        return;
2418
                if (r < 0) {
2✔
2419
                        log_unit_warning_errno(UNIT(s), r, "Failed to set socket on service: %m");
×
2420
                        goto fail;
×
2421
                }
2422

2423
                /* We passed ownership of the fd and socket peer to the service now. */
2424
                TAKE_FD(cfd);
2✔
2425
                TAKE_PTR(p);
2✔
2426

2427
                s->n_connections++;
2✔
2428

2429
                r = manager_add_job(UNIT(s)->manager, JOB_START, service, JOB_REPLACE, &error, /* ret = */ NULL);
2✔
2430
                if (r < 0) {
2✔
2431
                        /* We failed to activate the new service, but it still exists. Let's make sure the
2432
                         * service closes and forgets the connection fd again, immediately. */
2433
                        service_release_socket_fd(SERVICE(service));
×
2434
                        goto queue_error;
×
2435
                }
2436

2437
                /* Notify clients about changed counters */
2438
                unit_add_to_dbus_queue(UNIT(s));
2✔
2439
        }
2440

2441
        return;
2442

2443
refuse:
×
2444
        s->n_refused++;
×
2445
        return;
×
2446

2447
queue_error:
×
2448
        log_unit_warning_errno(UNIT(s), r, "Failed to queue service startup job%s: %s",
×
2449
                               cfd >= 0 && !ERRNO_IS_RESOURCE(r) ? " (Maybe the service is missing or is a template unit?)" : "",
2450
                               bus_error_message(&error, r));
2451

2452
fail:
×
2453
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2454
}
2455

2456
static void socket_run_next(Socket *s) {
×
2457
        int r;
×
2458

2459
        assert(s);
×
2460
        assert(s->control_command);
×
2461
        assert(s->control_command->command_next);
×
2462

2463
        socket_unwatch_control_pid(s);
×
2464

2465
        s->control_command = s->control_command->command_next;
×
2466

2467
        pidref_done(&s->control_pid);
×
2468

2469
        r = socket_spawn(s, s->control_command, &s->control_pid);
×
2470
        if (r < 0) {
×
2471
                log_unit_warning_errno(UNIT(s), r, "Failed to spawn next task: %m");
×
2472

2473
                if (s->state == SOCKET_START_POST)
×
2474
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2475
                else if (s->state == SOCKET_STOP_POST)
×
2476
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2477
                else
2478
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2479
        }
2480
}
×
2481

2482
static int socket_start(Unit *u) {
2,324✔
2483
        Socket *s = ASSERT_PTR(SOCKET(u));
2,324✔
2484
        int r;
2,324✔
2485

2486
        /* We cannot fulfill this request right now, try again later
2487
         * please! */
2488
        if (IN_SET(s->state,
2,324✔
2489
                   SOCKET_STOP_PRE,
2490
                   SOCKET_STOP_PRE_SIGKILL,
2491
                   SOCKET_STOP_PRE_SIGTERM,
2492
                   SOCKET_STOP_POST,
2493
                   SOCKET_FINAL_SIGTERM,
2494
                   SOCKET_FINAL_SIGKILL,
2495
                   SOCKET_CLEANING))
2496
                return -EAGAIN;
2497

2498
        /* Already on it! */
2499
        if (IN_SET(s->state,
2,324✔
2500
                   SOCKET_START_PRE,
2501
                   SOCKET_START_OPEN,
2502
                   SOCKET_START_CHOWN,
2503
                   SOCKET_START_POST))
2504
                return 0;
2505

2506
        /* Cannot run this without the service being around */
2507
        if (UNIT_ISSET(s->service)) {
2,324✔
2508
                Service *service = ASSERT_PTR(SERVICE(UNIT_DEREF(s->service)));
1,886✔
2509

2510
                if (UNIT(service)->load_state != UNIT_LOADED)
1,886✔
2511
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
×
2512
                                                    "Socket service %s not loaded, refusing.", UNIT(service)->id);
2513

2514
                /* If the service is already active we cannot start the socket */
2515
                if (SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ false))
1,886✔
2516
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY),
×
2517
                                                    "Socket service %s already active, refusing.", UNIT(service)->id);
2518
        }
2519

2520
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
2,324✔
2521

2522
        r = unit_acquire_invocation_id(u);
2,324✔
2523
        if (r < 0)
2,324✔
2524
                return r;
2525

2526
        s->result = SOCKET_SUCCESS;
2,324✔
2527
        exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
2,324✔
2528

2529
        if (s->cgroup_runtime)
2,324✔
2530
                s->cgroup_runtime->reset_accounting = true;
66✔
2531

2532
        socket_enter_start_pre(s);
2,324✔
2533
        return 1;
2,324✔
2534
}
2535

2536
static int socket_stop(Unit *u) {
1,927✔
2537
        Socket *s = ASSERT_PTR(SOCKET(u));
1,927✔
2538

2539
        /* Already on it */
2540
        if (IN_SET(s->state,
1,927✔
2541
                   SOCKET_STOP_PRE,
2542
                   SOCKET_STOP_PRE_SIGTERM,
2543
                   SOCKET_STOP_PRE_SIGKILL,
2544
                   SOCKET_STOP_POST,
2545
                   SOCKET_FINAL_SIGTERM,
2546
                   SOCKET_FINAL_SIGKILL))
2547
                return 0;
2548

2549
        /* If there's already something running we go directly into
2550
         * kill mode. */
2551
        if (IN_SET(s->state,
1,927✔
2552
                   SOCKET_START_PRE,
2553
                   SOCKET_START_OPEN,
2554
                   SOCKET_START_CHOWN,
2555
                   SOCKET_START_POST)) {
2556
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
×
2557
                return -EAGAIN;
×
2558
        }
2559

2560
        /* If we are currently cleaning, then abort it, brutally. */
2561
        if (s->state == SOCKET_CLEANING) {
1,927✔
2562
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
×
2563
                return 0;
×
2564
        }
2565

2566
        assert(IN_SET(s->state, SOCKET_LISTENING, SOCKET_RUNNING));
1,927✔
2567

2568
        socket_enter_stop_pre(s, SOCKET_SUCCESS);
1,927✔
2569
        return 1;
1,927✔
2570
}
2571

2572
static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
2,475✔
2573
        Socket *s = ASSERT_PTR(SOCKET(u));
2,475✔
2574
        int r;
2,475✔
2575

2576
        assert(f);
2,475✔
2577
        assert(fds);
2,475✔
2578

2579
        (void) serialize_item(f, "state", socket_state_to_string(s->state));
2,475✔
2580
        (void) serialize_item(f, "result", socket_result_to_string(s->result));
2,475✔
2581
        (void) serialize_item_format(f, "n-accepted", "%u", s->n_accepted);
2,475✔
2582
        (void) serialize_item_format(f, "n-refused", "%u", s->n_refused);
2,475✔
2583
        (void) serialize_pidref(f, fds, "control-pid", &s->control_pid);
2,475✔
2584

2585
        if (s->control_command_id >= 0)
2,475✔
2586
                (void) serialize_item(f, "control-command", socket_exec_command_to_string(s->control_command_id));
×
2587

2588
        LIST_FOREACH(port, p, s->ports) {
5,160✔
2589
                int copy;
2,685✔
2590

2591
                if (p->fd < 0)
2,685✔
2592
                        continue;
1,007✔
2593

2594
                copy = fdset_put_dup(fds, p->fd);
1,678✔
2595
                if (copy < 0)
1,678✔
2596
                        return log_unit_warning_errno(u, copy, "Failed to serialize socket fd: %m");
×
2597

2598
                if (p->type == SOCKET_SOCKET) {
1,678✔
2599
                        _cleanup_free_ char *t = NULL;
1,538✔
2600

2601
                        r = socket_address_print(&p->address, &t);
1,538✔
2602
                        if (r < 0)
1,538✔
2603
                                return log_unit_error_errno(u, r, "Failed to format socket address: %m");
×
2604

2605
                        if (socket_address_family(&p->address) == AF_NETLINK)
1,538✔
2606
                                (void) serialize_item_format(f, "netlink", "%i %s", copy, t);
106✔
2607
                        else
2608
                                (void) serialize_item_format(f, "socket", "%i %i %s", copy, p->address.type, t);
1,432✔
2609
                } else if (p->type == SOCKET_SPECIAL)
140✔
2610
                        (void) serialize_item_format(f, "special", "%i %s", copy, p->path);
18✔
2611
                else if (p->type == SOCKET_MQUEUE)
122✔
2612
                        (void) serialize_item_format(f, "mqueue", "%i %s", copy, p->path);
×
2613
                else if (p->type == SOCKET_USB_FUNCTION)
122✔
2614
                        (void) serialize_item_format(f, "ffs", "%i %s", copy, p->path);
×
2615
                else {
2616
                        assert(p->type == SOCKET_FIFO);
122✔
2617
                        (void) serialize_item_format(f, "fifo", "%i %s", copy, p->path);
122✔
2618
                }
2619
        }
2620

2621
        (void) serialize_ratelimit(f, "trigger-ratelimit", &s->trigger_limit);
2,475✔
2622

2623
        return 0;
2,475✔
2624
}
2625

2626
static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
11,169✔
2627
        Socket *s = ASSERT_PTR(SOCKET(u));
11,169✔
2628
        int r;
11,169✔
2629

2630
        assert(key);
11,169✔
2631
        assert(value);
11,169✔
2632

2633
        if (streq(key, "state")) {
11,169✔
2634
                SocketState state;
1,956✔
2635

2636
                state = socket_state_from_string(value);
1,956✔
2637
                if (state < 0)
1,956✔
2638
                        log_unit_debug(u, "Failed to parse state value: %s", value);
×
2639
                else
2640
                        s->deserialized_state = state;
1,956✔
2641
        } else if (streq(key, "result")) {
9,213✔
2642
                SocketResult f;
1,956✔
2643

2644
                f = socket_result_from_string(value);
1,956✔
2645
                if (f < 0)
1,956✔
2646
                        log_unit_debug(u, "Failed to parse result value: %s", value);
×
2647
                else if (f != SOCKET_SUCCESS)
1,956✔
2648
                        s->result = f;
×
2649

2650
        } else if (streq(key, "n-accepted")) {
7,257✔
2651
                unsigned k;
1,956✔
2652

2653
                if (safe_atou(value, &k) < 0)
1,956✔
2654
                        log_unit_debug(u, "Failed to parse n-accepted value: %s", value);
×
2655
                else
2656
                        s->n_accepted += k;
1,956✔
2657
        } else if (streq(key, "n-refused")) {
5,301✔
2658
                unsigned k;
1,956✔
2659

2660
                if (safe_atou(value, &k) < 0)
1,956✔
2661
                        log_unit_debug(u, "Failed to parse n-refused value: %s", value);
×
2662
                else
2663
                        s->n_refused += k;
1,956✔
2664
        } else if (streq(key, "control-pid")) {
3,345✔
2665

2666
                if (!pidref_is_set(&s->control_pid))
11,169✔
2667
                        (void) deserialize_pidref(fds, value, &s->control_pid);
×
2668

2669
        } else if (streq(key, "control-command")) {
3,345✔
2670
                SocketExecCommand id;
×
2671

2672
                id = socket_exec_command_from_string(value);
×
2673
                if (id < 0)
×
2674
                        log_unit_debug(u, "Failed to parse exec-command value: %s", value);
×
2675
                else {
2676
                        s->control_command_id = id;
×
2677
                        s->control_command = s->exec_command[id];
×
2678
                }
2679
        } else if (streq(key, "fifo")) {
3,345✔
2680
                _cleanup_free_ char *fdv = NULL;
102✔
2681
                bool found = false;
102✔
2682
                int fd;
102✔
2683

2684
                r = extract_first_word(&value, &fdv, NULL, 0);
102✔
2685
                if (r <= 0) {
102✔
2686
                        log_unit_debug(u, "Failed to parse fifo value: %s", value);
×
2687
                        return 0;
×
2688
                }
2689

2690
                fd = parse_fd(fdv);
102✔
2691
                if (fd < 0 || !fdset_contains(fds, fd)) {
102✔
2692
                        log_unit_debug(u, "Invalid fifo value: %s", fdv);
×
2693
                        return 0;
×
2694
                }
2695

2696
                LIST_FOREACH(port, p, s->ports)
153✔
2697
                        if (p->fd < 0 &&
153✔
2698
                            p->type == SOCKET_FIFO &&
102✔
2699
                            path_equal_or_inode_same(p->path, value, 0)) {
102✔
2700
                                p->fd = fdset_remove(fds, fd);
102✔
2701
                                found = true;
102✔
2702
                                break;
102✔
2703
                        }
2704
                if (!found)
102✔
2705
                        log_unit_debug(u, "No matching fifo socket found: %s", value);
×
2706

2707
        } else if (streq(key, "special")) {
3,243✔
2708
                _cleanup_free_ char *fdv = NULL;
15✔
2709
                bool found = false;
15✔
2710
                int fd;
15✔
2711

2712
                r = extract_first_word(&value, &fdv, NULL, 0);
15✔
2713
                if (r <= 0) {
15✔
2714
                        log_unit_debug(u, "Failed to parse special value: %s", value);
×
2715
                        return 0;
×
2716
                }
2717

2718
                fd = parse_fd(fdv);
15✔
2719
                if (fd < 0 || !fdset_contains(fds, fd)) {
15✔
2720
                        log_unit_debug(u, "Invalid special value: %s", fdv);
×
2721
                        return 0;
×
2722
                }
2723

2724
                LIST_FOREACH(port, p, s->ports)
15✔
2725
                        if (p->fd < 0 &&
15✔
2726
                            p->type == SOCKET_SPECIAL &&
15✔
2727
                            path_equal_or_inode_same(p->path, value, 0)) {
15✔
2728
                                p->fd = fdset_remove(fds, fd);
15✔
2729
                                found = true;
15✔
2730
                                break;
15✔
2731
                        }
2732
                if (!found)
15✔
2733
                        log_unit_debug(u, "No matching special socket found: %s", value);
×
2734

2735
        } else if (streq(key, "mqueue")) {
3,228✔
2736
                _cleanup_free_ char *fdv = NULL;
×
2737
                bool found = false;
×
2738
                int fd;
×
2739

2740
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2741
                if (r <= 0) {
×
2742
                        log_unit_debug(u, "Failed to parse mqueue value: %s", value);
×
2743
                        return 0;
×
2744
                }
2745

2746
                fd = parse_fd(fdv);
×
2747
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2748
                        log_unit_debug(u, "Invalid mqueue value: %s", fdv);
×
2749
                        return 0;
×
2750
                }
2751

2752
                LIST_FOREACH(port, p, s->ports)
×
2753
                        if (p->fd < 0 &&
×
2754
                            p->type == SOCKET_MQUEUE &&
×
2755
                            streq(p->path, value)) {
×
2756
                                p->fd = fdset_remove(fds, fd);
×
2757
                                found = true;
×
2758
                                break;
×
2759
                        }
2760
                if (!found)
×
2761
                        log_unit_debug(u, "No matching mqueue socket found: %s", value);
×
2762

2763
        } else if (streq(key, "socket")) {
3,228✔
2764
                _cleanup_free_ char *fdv = NULL, *typev = NULL;
1,188✔
2765
                bool found = false;
1,188✔
2766
                int fd, type;
1,188✔
2767

2768
                r = extract_first_word(&value, &fdv, NULL, 0);
1,188✔
2769
                if (r <= 0) {
1,188✔
2770
                        log_unit_debug(u, "Failed to parse socket fd from value: %s", value);
×
2771
                        return 0;
×
2772
                }
2773

2774
                fd = parse_fd(fdv);
1,188✔
2775
                if (fd < 0 || !fdset_contains(fds, fd)) {
1,188✔
2776
                        log_unit_debug(u, "Invalid socket fd: %s", fdv);
×
2777
                        return 0;
×
2778
                }
2779

2780
                r = extract_first_word(&value, &typev, NULL, 0);
1,188✔
2781
                if (r <= 0) {
1,188✔
2782
                        log_unit_debug(u, "Failed to parse socket type from value: %s", value);
×
2783
                        return 0;
×
2784
                }
2785

2786
                if (safe_atoi(typev, &type) < 0 || type < 0) {
1,188✔
2787
                        log_unit_debug(u, "Invalid socket type: %s", typev);
×
2788
                        return 0;
×
2789
                }
2790

2791
                LIST_FOREACH(port, p, s->ports)
1,293✔
2792
                        if (p->fd < 0 &&
2,481✔
2793
                            socket_address_is(&p->address, value, type)) {
1,188✔
2794
                                p->fd = fdset_remove(fds, fd);
1,188✔
2795
                                found = true;
1,188✔
2796
                                break;
1,188✔
2797
                        }
2798
                if (!found)
1,188✔
2799
                        log_unit_debug(u, "No matching %s socket found: %s",
×
2800
                                       socket_address_type_to_string(type), value);
2801

2802
        } else if (streq(key, "netlink")) {
2,040✔
2803
                _cleanup_free_ char *fdv = NULL;
84✔
2804
                bool found = false;
84✔
2805
                int fd;
84✔
2806

2807
                r = extract_first_word(&value, &fdv, NULL, 0);
84✔
2808
                if (r <= 0) {
84✔
2809
                        log_unit_debug(u, "Failed to parse socket value: %s", value);
×
2810
                        return 0;
×
2811
                }
2812

2813
                fd = parse_fd(fdv);
84✔
2814
                if (fd < 0 || !fdset_contains(fds, fd)) {
84✔
2815
                        log_unit_debug(u, "Invalid socket value: %s", fdv);
×
2816
                        return 0;
×
2817
                }
2818

2819
                LIST_FOREACH(port, p, s->ports)
84✔
2820
                        if (p->fd < 0 &&
168✔
2821
                            socket_address_is_netlink(&p->address, value)) {
84✔
2822
                                p->fd = fdset_remove(fds, fd);
84✔
2823
                                found = true;
84✔
2824
                                break;
84✔
2825
                        }
2826
                if (!found)
84✔
2827
                        log_unit_debug(u, "No matching netlink socket found: %s", value);
×
2828

2829
        } else if (streq(key, "ffs")) {
1,956✔
2830
                _cleanup_free_ char *fdv = NULL;
×
2831
                bool found = false;
×
2832
                int fd;
×
2833

2834
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2835
                if (r <= 0) {
×
2836
                        log_unit_debug(u, "Failed to parse ffs value: %s", value);
×
2837
                        return 0;
×
2838
                }
2839

2840
                fd = parse_fd(fdv);
×
2841
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2842
                        log_unit_debug(u, "Invalid ffs value: %s", fdv);
×
2843
                        return 0;
×
2844
                }
2845

2846
                LIST_FOREACH(port, p, s->ports)
×
2847
                        if (p->fd < 0 &&
×
2848
                            p->type == SOCKET_USB_FUNCTION &&
×
2849
                            path_equal_or_inode_same(p->path, value, 0)) {
×
2850
                                p->fd = fdset_remove(fds, fd);
×
2851
                                found = true;
×
2852
                                break;
×
2853
                        }
2854
                if (!found)
×
2855
                        log_unit_debug(u, "No matching ffs socket found: %s", value);
×
2856

2857
        } else if (streq(key, "trigger-ratelimit"))
1,956✔
2858
                (void) deserialize_ratelimit(&s->trigger_limit, key, value);
1,956✔
2859
        else
2860
                log_unit_debug(UNIT(s), "Unknown serialization key: %s", key);
×
2861

2862
        return 0;
2863
}
2864

2865
static void socket_distribute_fds(Unit *u, FDSet *fds) {
1,091✔
2866
        Socket *s = ASSERT_PTR(SOCKET(u));
1,091✔
2867

2868
        LIST_FOREACH(port, p, s->ports) {
2,272✔
2869
                int fd;
1,181✔
2870

2871
                if (p->type != SOCKET_SOCKET)
1,181✔
2872
                        continue;
65✔
2873

2874
                if (p->fd >= 0)
1,116✔
2875
                        continue;
662✔
2876

2877
                FDSET_FOREACH(fd, fds) {
1,392✔
2878
                        if (socket_address_matches_fd(&p->address, fd)) {
938✔
2879
                                p->fd = fdset_remove(fds, fd);
×
2880
                                s->deserialized_state = SOCKET_LISTENING;
×
2881
                                break;
×
2882
                        }
2883
                }
2884
        }
2885
}
1,091✔
2886

2887
static UnitActiveState socket_active_state(Unit *u) {
359,619✔
2888
        Socket *s = ASSERT_PTR(SOCKET(u));
359,619✔
2889

2890
        return state_translation_table[s->state];
359,619✔
2891
}
2892

2893
static const char *socket_sub_state_to_string(Unit *u) {
3,171✔
2894
        Socket *s = ASSERT_PTR(SOCKET(u));
3,171✔
2895

2896
        return socket_state_to_string(s->state);
3,171✔
2897
}
2898

2899
int socket_port_to_address(const SocketPort *p, char **ret) {
117✔
2900
        _cleanup_free_ char *address = NULL;
117✔
2901
        int r;
117✔
2902

2903
        assert(p);
117✔
2904
        assert(ret);
117✔
2905

2906
        switch (p->type) {
117✔
2907
                case SOCKET_SOCKET: {
111✔
2908
                        r = socket_address_print(&p->address, &address);
111✔
2909
                        if (r < 0)
111✔
2910
                                return r;
2911

2912
                        break;
2913
                }
2914

2915
                case SOCKET_SPECIAL:
6✔
2916
                case SOCKET_MQUEUE:
2917
                case SOCKET_FIFO:
2918
                case SOCKET_USB_FUNCTION:
2919
                        address = strdup(p->path);
6✔
2920
                        if (!address)
6✔
2921
                                return -ENOMEM;
2922
                        break;
2923

2924
                default:
×
2925
                        assert_not_reached();
×
2926
        }
2927

2928
        *ret = TAKE_PTR(address);
117✔
2929

2930
        return 0;
117✔
2931
}
2932

2933
const char* socket_port_type_to_string(SocketPort *p) {
117✔
2934
        assert(p);
117✔
2935

2936
        switch (p->type) {
117✔
2937

2938
        case SOCKET_SOCKET:
111✔
2939

2940
                switch (p->address.type) {
111✔
2941

2942
                case SOCK_STREAM:
2943
                        return "Stream";
2944

2945
                case SOCK_DGRAM:
9✔
2946
                        return "Datagram";
9✔
2947

2948
                case SOCK_SEQPACKET:
6✔
2949
                        return "SequentialPacket";
6✔
2950

2951
                case SOCK_RAW:
9✔
2952
                        if (socket_address_family(&p->address) == AF_NETLINK)
9✔
2953
                                return "Netlink";
2954

2955
                        _fallthrough_;
×
2956
                default:
2957
                        return NULL;
×
2958
                }
2959

2960
        case SOCKET_SPECIAL:
2961
                return "Special";
2962

2963
        case SOCKET_MQUEUE:
×
2964
                return "MessageQueue";
×
2965

2966
        case SOCKET_FIFO:
6✔
2967
                return "FIFO";
6✔
2968

2969
        case SOCKET_USB_FUNCTION:
×
2970
                return "USBFunction";
×
2971

2972
        default:
×
2973
                return NULL;
×
2974
        }
2975
}
2976

2977
SocketType socket_port_type_from_string(const char *s) {
×
2978
        assert(s);
×
2979

2980
        if (STR_IN_SET(s, "Stream", "Datagram", "SequentialPacket", "Netlink"))
×
2981
                return SOCKET_SOCKET;
×
2982
        else if (streq(s, "Special"))
×
2983
                return SOCKET_SPECIAL;
2984
        else if (streq(s, "MessageQueue"))
×
2985
                return SOCKET_MQUEUE;
2986
        else if (streq(s, "FIFO"))
×
2987
                return SOCKET_FIFO;
2988
        else if (streq(s, "USBFunction"))
×
2989
                return SOCKET_USB_FUNCTION;
2990
        else
2991
                return _SOCKET_TYPE_INVALID;
×
2992
}
2993

2994
static bool socket_may_gc(Unit *u) {
12,056✔
2995
        Socket *s = ASSERT_PTR(SOCKET(u));
12,056✔
2996

2997
        return s->n_connections == 0;
12,056✔
2998
}
2999

3000
static int socket_accept_do(Socket *s, int fd) {
2✔
3001
        int cfd;
2✔
3002

3003
        assert(s);
2✔
3004
        assert(fd >= 0);
2✔
3005

3006
        cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
2✔
3007
        if (cfd < 0)
2✔
3008
                /* Convert transient network errors into clean and well-defined EAGAIN */
3009
                return ERRNO_IS_ACCEPT_AGAIN(errno) ? -EAGAIN : -errno;
×
3010

3011
        return cfd;
3012
}
3013

3014
static int socket_accept_in_cgroup(Socket *s, SocketPort *p, int fd) {
2✔
3015
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
3016
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
2✔
3017
        int cfd, r;
2✔
3018

3019
        assert(s);
2✔
3020
        assert(p);
2✔
3021
        assert(fd >= 0);
2✔
3022

3023
        /* Similar to socket_address_listen_in_cgroup(), but for accept() rather than socket(): make sure that any
3024
         * connection socket is also properly associated with the cgroup. */
3025

3026
        if (!IN_SET(p->address.sockaddr.sa.sa_family, AF_INET, AF_INET6))
2✔
3027
                goto shortcut;
2✔
3028

3029
        r = bpf_firewall_supported();
×
3030
        if (r < 0)
×
3031
                return r;
3032
        if (r == BPF_FIREWALL_UNSUPPORTED)
×
3033
                goto shortcut;
×
3034

3035
        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
×
3036
                return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
×
3037

3038
        r = unit_fork_helper_process(UNIT(s), "(sd-accept)", /* into_cgroup= */ true, &pid);
×
3039
        if (r < 0)
×
3040
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off accept stub process: %m");
×
3041
        if (r == 0) {
×
3042
                /* Child */
3043

3044
                pair[0] = safe_close(pair[0]);
×
3045

3046
                cfd = socket_accept_do(s, fd);
×
3047
                if (cfd == -EAGAIN) /* spurious accept() */
×
3048
                        _exit(EXIT_SUCCESS);
×
3049
                if (cfd < 0) {
×
3050
                        log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3051
                        _exit(EXIT_FAILURE);
×
3052
                }
3053

3054
                r = send_one_fd(pair[1], cfd, 0);
×
3055
                if (r < 0) {
×
3056
                        log_unit_error_errno(UNIT(s), r, "Failed to send connection socket to parent: %m");
×
3057
                        _exit(EXIT_FAILURE);
×
3058
                }
3059

3060
                _exit(EXIT_SUCCESS);
×
3061
        }
3062

3063
        pair[1] = safe_close(pair[1]);
×
3064
        cfd = receive_one_fd(pair[0], 0);
×
3065

3066
        /* We synchronously wait for the helper, as it shouldn't be slow */
3067
        r = wait_for_terminate_and_check("(sd-accept)", pid.pid, WAIT_LOG_ABNORMAL);
×
3068
        if (r < 0) {
×
3069
                safe_close(cfd);
×
3070
                return r;
3071
        }
3072

3073
        /* If we received no fd, we got EIO here. If this happens with a process exit code of EXIT_SUCCESS
3074
         * this is a spurious accept(), let's convert that back to EAGAIN here. */
3075
        if (cfd == -EIO)
×
3076
                return -EAGAIN;
3077
        if (cfd < 0)
×
3078
                return log_unit_error_errno(UNIT(s), cfd, "Failed to receive connection socket: %m");
×
3079

3080
        return cfd;
3081

3082
shortcut:
2✔
3083
        cfd = socket_accept_do(s, fd);
2✔
3084
        if (cfd == -EAGAIN) /* spurious accept(), skip it silently */
2✔
3085
                return -EAGAIN;
3086
        if (cfd < 0)
2✔
3087
                return log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3088

3089
        return cfd;
3090
}
3091

3092
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
211✔
3093
        SocketPort *p = ASSERT_PTR(userdata);
211✔
3094
        int cfd = -EBADF;
211✔
3095

3096
        assert(fd >= 0);
211✔
3097

3098
        if (p->socket->state != SOCKET_LISTENING)
211✔
3099
                return 0;
3100

3101
        log_unit_debug(UNIT(p->socket), "Incoming traffic");
211✔
3102

3103
        if (revents != EPOLLIN) {
211✔
3104
                if (revents & EPOLLHUP)
×
3105
                        log_unit_error(UNIT(p->socket), "Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.");
×
3106
                else
3107
                        log_unit_error(UNIT(p->socket), "Got unexpected poll event (0x%x) on socket.", revents);
×
3108
                goto fail;
×
3109
        }
3110

3111
        if (p->socket->accept &&
211✔
3112
            p->type == SOCKET_SOCKET &&
4✔
3113
            socket_address_can_accept(&p->address)) {
2✔
3114

3115
                cfd = socket_accept_in_cgroup(p->socket, p, fd);
2✔
3116
                if (cfd == -EAGAIN) /* Spurious accept() */
2✔
3117
                        return 0;
3118
                if (cfd < 0)
2✔
3119
                        goto fail;
×
3120

3121
                socket_apply_socket_options(p->socket, p, cfd);
2✔
3122
        }
3123

3124
        socket_enter_running(p->socket, cfd);
211✔
3125
        return 0;
211✔
3126

3127
fail:
×
3128
        socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
×
3129
        return 0;
×
3130
}
3131

3132
static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
172✔
3133
        Socket *s = ASSERT_PTR(SOCKET(u));
172✔
3134
        SocketResult f;
172✔
3135

3136
        assert(pid >= 0);
172✔
3137

3138
        if (pid != s->control_pid.pid)
172✔
3139
                return;
3140

3141
        pidref_done(&s->control_pid);
172✔
3142

3143
        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
172✔
3144
                f = SOCKET_SUCCESS;
3145
        else if (code == CLD_EXITED)
×
3146
                f = SOCKET_FAILURE_EXIT_CODE;
3147
        else if (code == CLD_KILLED)
×
3148
                f = SOCKET_FAILURE_SIGNAL;
3149
        else if (code == CLD_DUMPED)
×
3150
                f = SOCKET_FAILURE_CORE_DUMP;
3151
        else
3152
                assert_not_reached();
×
3153

3154
        if (s->control_command) {
172✔
3155
                exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
172✔
3156

3157
                if (s->control_command->flags & EXEC_COMMAND_IGNORE_FAILURE)
172✔
3158
                        f = SOCKET_SUCCESS;
172✔
3159
        }
3160

3161
        unit_log_process_exit(
172✔
3162
                        u,
3163
                        "Control process",
3164
                        socket_exec_command_to_string(s->control_command_id),
3165
                        f == SOCKET_SUCCESS,
3166
                        code, status);
3167

3168
        if (s->result == SOCKET_SUCCESS)
172✔
3169
                s->result = f;
172✔
3170

3171
        if (s->control_command &&
172✔
3172
            s->control_command->command_next &&
172✔
3173
            f == SOCKET_SUCCESS) {
3174

3175
                log_unit_debug(u, "Running next command for state %s", socket_state_to_string(s->state));
×
3176
                socket_run_next(s);
×
3177
        } else {
3178
                s->control_command = NULL;
172✔
3179
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
172✔
3180

3181
                /* No further commands for this step, so let's figure
3182
                 * out what to do next */
3183

3184
                log_unit_debug(u, "Got final SIGCHLD for state %s", socket_state_to_string(s->state));
172✔
3185

3186
                switch (s->state) {
172✔
3187

3188
                case SOCKET_START_PRE:
×
3189
                        if (f == SOCKET_SUCCESS)
×
3190
                                socket_enter_start_open(s);
×
3191
                        else
3192
                                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
×
3193
                        break;
3194

3195
                case SOCKET_START_CHOWN:
×
3196
                        if (f == SOCKET_SUCCESS)
×
3197
                                socket_enter_start_post(s);
×
3198
                        else
3199
                                socket_enter_stop_pre(s, f);
×
3200
                        break;
3201

3202
                case SOCKET_START_POST:
172✔
3203
                        if (f == SOCKET_SUCCESS)
172✔
3204
                                socket_enter_listening(s);
172✔
3205
                        else
3206
                                socket_enter_stop_pre(s, f);
×
3207
                        break;
3208

3209
                case SOCKET_STOP_PRE:
×
3210
                case SOCKET_STOP_PRE_SIGTERM:
3211
                case SOCKET_STOP_PRE_SIGKILL:
3212
                        socket_enter_stop_post(s, f);
×
3213
                        break;
×
3214

3215
                case SOCKET_STOP_POST:
×
3216
                case SOCKET_FINAL_SIGTERM:
3217
                case SOCKET_FINAL_SIGKILL:
3218
                        socket_enter_dead(s, f);
×
3219
                        break;
×
3220

3221
                case SOCKET_CLEANING:
×
3222

3223
                        if (s->clean_result == SOCKET_SUCCESS)
×
3224
                                s->clean_result = f;
×
3225

3226
                        socket_enter_dead(s, SOCKET_SUCCESS);
×
3227
                        break;
×
3228

3229
                default:
×
3230
                        assert_not_reached();
×
3231
                }
3232
        }
3233

3234
        /* Notify clients about changed exit status */
3235
        unit_add_to_dbus_queue(u);
172✔
3236
}
3237

3238
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
×
3239
        Socket *s = ASSERT_PTR(SOCKET(userdata));
×
3240

3241
        assert(s->timer_event_source == source);
×
3242

3243
        switch (s->state) {
×
3244

3245
        case SOCKET_START_PRE:
3246
                log_unit_warning(UNIT(s), "Starting timed out. Terminating.");
×
3247
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3248
                break;
×
3249

3250
        case SOCKET_START_CHOWN:
3251
        case SOCKET_START_POST:
3252
                log_unit_warning(UNIT(s), "Starting timed out. Stopping.");
×
3253
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3254
                break;
×
3255

3256
        case SOCKET_STOP_PRE:
3257
                log_unit_warning(UNIT(s), "Stopping timed out. Terminating.");
×
3258
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3259
                break;
×
3260

3261
        case SOCKET_STOP_PRE_SIGTERM:
×
3262
                if (s->kill_context.send_sigkill) {
×
3263
                        log_unit_warning(UNIT(s), "Stopping timed out. Killing.");
×
3264
                        socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3265
                } else {
3266
                        log_unit_warning(UNIT(s), "Stopping timed out. Skipping SIGKILL. Ignoring.");
×
3267
                        socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3268
                }
3269
                break;
3270

3271
        case SOCKET_STOP_PRE_SIGKILL:
3272
                log_unit_warning(UNIT(s), "Processes still around after SIGKILL. Ignoring.");
×
3273
                socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3274
                break;
×
3275

3276
        case SOCKET_STOP_POST:
3277
                log_unit_warning(UNIT(s), "Stopping timed out (2). Terminating.");
×
3278
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3279
                break;
×
3280

3281
        case SOCKET_FINAL_SIGTERM:
×
3282
                if (s->kill_context.send_sigkill) {
×
3283
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Killing.");
×
3284
                        socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3285
                } else {
3286
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
×
3287
                        socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3288
                }
3289
                break;
3290

3291
        case SOCKET_FINAL_SIGKILL:
3292
                log_unit_warning(UNIT(s), "Still around after SIGKILL (2). Entering failed mode.");
×
3293
                socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3294
                break;
×
3295

3296
        case SOCKET_CLEANING:
3297
                log_unit_warning(UNIT(s), "Cleaning timed out. killing.");
×
3298

3299
                if (s->clean_result == SOCKET_SUCCESS)
×
3300
                        s->clean_result = SOCKET_FAILURE_TIMEOUT;
×
3301

3302
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, 0);
×
3303
                break;
×
3304

3305
        default:
×
3306
                assert_not_reached();
×
3307
        }
3308

3309
        return 0;
×
3310
}
3311

3312
int socket_collect_fds(Socket *s, int **ret) {
525✔
3313
        size_t n = 0, k = 0;
525✔
3314

3315
        assert(s);
525✔
3316
        assert(ret);
525✔
3317

3318
        /* Called from the service code for requesting our fds */
3319

3320
        LIST_FOREACH(port, p, s->ports) {
1,084✔
3321
                if (p->fd >= 0)
559✔
3322
                        n++;
540✔
3323
                n += p->n_auxiliary_fds;
559✔
3324
        }
3325

3326
        if (n == 0) {
525✔
3327
                *ret = NULL;
19✔
3328
                return 0;
19✔
3329
        }
3330

3331
        int *fds = new(int, n);
506✔
3332
        if (!fds)
506✔
3333
                return -ENOMEM;
3334

3335
        LIST_FOREACH(port, p, s->ports) {
1,046✔
3336
                if (p->fd >= 0)
540✔
3337
                        fds[k++] = p->fd;
540✔
3338
                FOREACH_ARRAY(i, p->auxiliary_fds, p->n_auxiliary_fds)
540✔
3339
                        fds[k++] = *i;
×
3340
        }
3341

3342
        assert(k == n);
506✔
3343

3344
        *ret = fds;
506✔
3345
        return (int) n;
506✔
3346
}
3347

3348
static void socket_reset_failed(Unit *u) {
36✔
3349
        Socket *s = SOCKET(u);
36✔
3350

3351
        assert(s);
×
3352

3353
        if (s->state == SOCKET_FAILED)
36✔
3354
                socket_set_state(s, SOCKET_DEAD);
×
3355

3356
        s->result = SOCKET_SUCCESS;
36✔
3357
        s->clean_result = SOCKET_SUCCESS;
36✔
3358
}
36✔
3359

3360
void socket_connection_unref(Socket *s) {
2✔
3361
        assert(s);
2✔
3362

3363
        /* The service is dead. Yay!
3364
         *
3365
         * This is strictly for one-instance-per-connection
3366
         * services. */
3367

3368
        assert(s->n_connections > 0);
2✔
3369
        s->n_connections--;
2✔
3370

3371
        log_unit_debug(UNIT(s), "One connection closed, %u left.", s->n_connections);
2✔
3372
}
2✔
3373

3374
static void socket_trigger_notify(Unit *u, Unit *other) {
3,182✔
3375
        Socket *s = ASSERT_PTR(SOCKET(u));
3,182✔
3376

3377
        assert(other);
3,182✔
3378

3379
        /* Filter out invocations with bogus state */
3380
        assert(UNIT_IS_LOAD_COMPLETE(other->load_state));
3,182✔
3381

3382
        Service *service = ASSERT_PTR(SERVICE(other));
3,182✔
3383

3384
        /* Don't propagate state changes from the service if we are already down */
3385
        if (!IN_SET(s->state, SOCKET_RUNNING, SOCKET_LISTENING))
3,182✔
3386
                return;
3387

3388
        /* We don't care for the service state if we are in Accept=yes mode */
3389
        if (s->accept)
2,789✔
3390
                return;
3391

3392
        /* Propagate start limit hit state */
3393
        if (other->start_limit_hit) {
2,781✔
3394
                socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT);
×
3395
                return;
×
3396
        }
3397

3398
        /* Don't propagate anything if there's still a job queued */
3399
        if (other->job)
2,781✔
3400
                return;
3401

3402
        if (!SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ true))
2,101✔
3403
                socket_enter_listening(s);
680✔
3404

3405
        if (SERVICE(other)->state == SERVICE_RUNNING)
2,101✔
3406
                socket_set_state(s, SOCKET_RUNNING);
1,315✔
3407
}
3408

3409
static void socket_handoff_timestamp(
344✔
3410
                Unit *u,
3411
                const struct ucred *ucred,
3412
                const dual_timestamp *ts) {
3413

3414
        Socket *s = ASSERT_PTR(SOCKET(u));
344✔
3415

3416
        assert(ucred);
344✔
3417
        assert(ts);
344✔
3418

3419
        if (s->control_pid.pid == ucred->pid && s->control_command) {
344✔
3420
                exec_status_handoff(&s->control_command->exec_status, ucred, ts);
344✔
3421
                unit_add_to_dbus_queue(u);
344✔
3422
        }
3423
}
344✔
3424

3425
static int socket_get_timeout(Unit *u, usec_t *timeout) {
×
3426
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3427
        usec_t t;
×
3428
        int r;
×
3429

3430
        if (!s->timer_event_source)
×
3431
                return 0;
×
3432

3433
        r = sd_event_source_get_time(s->timer_event_source, &t);
×
3434
        if (r < 0)
×
3435
                return r;
3436
        if (t == USEC_INFINITY)
×
3437
                return 0;
3438

3439
        *timeout = t;
×
3440
        return 1;
×
3441
}
3442

3443
const char* socket_fdname(Socket *s) {
616✔
3444
        assert(s);
616✔
3445

3446
        /* Returns the name to use for $LISTEN_FDNAMES. If the user didn't specify anything specifically,
3447
         * use the socket unit's name as fallback for Accept=no sockets, "connection" otherwise. */
3448

3449
        if (s->fdname)
616✔
3450
                return s->fdname;
3451

3452
        if (s->accept)
481✔
3453
                return "connection";
3454

3455
        return UNIT(s)->id;
470✔
3456
}
3457

3458
static PidRef* socket_control_pid(Unit *u) {
7,708✔
3459
        return &ASSERT_PTR(SOCKET(u))->control_pid;
15,416✔
3460
}
3461

3462
static int socket_clean(Unit *u, ExecCleanMask mask) {
×
3463
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3464
        _cleanup_strv_free_ char **l = NULL;
×
3465
        int r;
×
3466

3467
        assert(mask != 0);
×
3468

3469
        if (s->state != SOCKET_DEAD)
×
3470
                return -EBUSY;
3471

3472
        r = exec_context_get_clean_directories(&s->exec_context, u->manager->prefix, mask, &l);
×
3473
        if (r < 0)
×
3474
                return r;
3475

3476
        if (strv_isempty(l))
×
3477
                return -EUNATCH;
3478

3479
        socket_unwatch_control_pid(s);
×
3480
        s->clean_result = SOCKET_SUCCESS;
×
3481
        s->control_command = NULL;
×
3482
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
×
3483

3484
        r = socket_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec);
×
3485
        if (r < 0) {
×
3486
                log_unit_warning_errno(u, r, "Failed to install timer: %m");
×
3487
                goto fail;
×
3488
        }
3489

3490
        r = unit_fork_and_watch_rm_rf(u, l, &s->control_pid);
×
3491
        if (r < 0) {
×
3492
                log_unit_warning_errno(u, r, "Failed to spawn cleaning task: %m");
×
3493
                goto fail;
×
3494
        }
3495

3496
        socket_set_state(s, SOCKET_CLEANING);
×
3497
        return 0;
3498

3499
fail:
×
3500
        s->clean_result = SOCKET_FAILURE_RESOURCES;
×
3501
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
×
3502
        return r;
×
3503
}
3504

3505
static int socket_can_clean(Unit *u, ExecCleanMask *ret) {
108✔
3506
        Socket *s = ASSERT_PTR(SOCKET(u));
108✔
3507

3508
        return exec_context_get_clean_mask(&s->exec_context, ret);
108✔
3509
}
3510

3511
static int socket_can_start(Unit *u) {
2,324✔
3512
        Socket *s = ASSERT_PTR(SOCKET(u));
2,324✔
3513
        int r;
2,324✔
3514

3515
        r = unit_test_start_limit(u);
2,324✔
3516
        if (r < 0) {
2,324✔
3517
                socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT);
×
3518
                return r;
×
3519
        }
3520

3521
        return 1;
3522
}
3523

3524
static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
3525
        [SOCKET_EXEC_START_PRE]   = "ExecStartPre",
3526
        [SOCKET_EXEC_START_CHOWN] = "ExecStartChown",
3527
        [SOCKET_EXEC_START_POST]  = "ExecStartPost",
3528
        [SOCKET_EXEC_STOP_PRE]    = "ExecStopPre",
3529
        [SOCKET_EXEC_STOP_POST]   = "ExecStopPost",
3530
};
3531

3532
DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
228✔
3533

3534
static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
3535
        [SOCKET_SUCCESS]                         = "success",
3536
        [SOCKET_FAILURE_RESOURCES]               = "resources",
3537
        [SOCKET_FAILURE_TIMEOUT]                 = "timeout",
3538
        [SOCKET_FAILURE_EXIT_CODE]               = "exit-code",
3539
        [SOCKET_FAILURE_SIGNAL]                  = "signal",
3540
        [SOCKET_FAILURE_CORE_DUMP]               = "core-dump",
3541
        [SOCKET_FAILURE_START_LIMIT_HIT]         = "start-limit-hit",
3542
        [SOCKET_FAILURE_TRIGGER_LIMIT_HIT]       = "trigger-limit-hit",
3543
        [SOCKET_FAILURE_SERVICE_START_LIMIT_HIT] = "service-start-limit-hit",
3544
};
3545

3546
DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
7,191✔
3547

3548
static const char* const socket_timestamping_table[_SOCKET_TIMESTAMPING_MAX] = {
3549
        [SOCKET_TIMESTAMPING_OFF] = "off",
3550
        [SOCKET_TIMESTAMPING_US]  = "us",
3551
        [SOCKET_TIMESTAMPING_NS]  = "ns",
3552
};
3553

3554
DEFINE_STRING_TABLE_LOOKUP(socket_timestamping, SocketTimestamping);
326✔
3555

3556
SocketTimestamping socket_timestamping_from_string_harder(const char *p) {
218✔
3557
        SocketTimestamping t;
218✔
3558
        int r;
218✔
3559

3560
        if (!p)
218✔
3561
                return _SOCKET_TIMESTAMPING_INVALID;
3562

3563
        t = socket_timestamping_from_string(p);
218✔
3564
        if (t >= 0)
218✔
3565
                return t;
3566

3567
        /* Let's alternatively support the various other aliases parse_time() accepts for ns and µs here,
3568
         * too. */
3569
        if (streq(p, "nsec"))
×
3570
                return SOCKET_TIMESTAMPING_NS;
3571
        if (STR_IN_SET(p, "usec", "µs", "μs")) /* Accept both small greek letter mu + micro sign unicode codepoints */
×
3572
                return SOCKET_TIMESTAMPING_US;
×
3573

3574
        r = parse_boolean(p);
×
3575
        if (r < 0)
×
3576
                return _SOCKET_TIMESTAMPING_INVALID;
3577

3578
        return r ? SOCKET_TIMESTAMPING_NS : SOCKET_TIMESTAMPING_OFF; /* If boolean yes, default to ns accuracy */
×
3579
}
3580

3581
const UnitVTable socket_vtable = {
3582
        .object_size = sizeof(Socket),
3583
        .exec_context_offset = offsetof(Socket, exec_context),
3584
        .cgroup_context_offset = offsetof(Socket, cgroup_context),
3585
        .kill_context_offset = offsetof(Socket, kill_context),
3586
        .exec_runtime_offset = offsetof(Socket, exec_runtime),
3587
        .cgroup_runtime_offset = offsetof(Socket, cgroup_runtime),
3588

3589
        .sections =
3590
                "Unit\0"
3591
                "Socket\0"
3592
                "Install\0",
3593
        .private_section = "Socket",
3594

3595
        .can_transient = true,
3596
        .can_trigger = true,
3597
        .can_fail = true,
3598

3599
        .init = socket_init,
3600
        .done = socket_done,
3601
        .load = socket_load,
3602

3603
        .coldplug = socket_coldplug,
3604

3605
        .dump = socket_dump,
3606

3607
        .start = socket_start,
3608
        .stop = socket_stop,
3609

3610
        .clean = socket_clean,
3611
        .can_clean = socket_can_clean,
3612

3613
        .get_timeout = socket_get_timeout,
3614

3615
        .serialize = socket_serialize,
3616
        .deserialize_item = socket_deserialize_item,
3617
        .distribute_fds = socket_distribute_fds,
3618

3619
        .active_state = socket_active_state,
3620
        .sub_state_to_string = socket_sub_state_to_string,
3621

3622
        .will_restart = unit_will_restart_default,
3623

3624
        .may_gc = socket_may_gc,
3625

3626
        .sigchld_event = socket_sigchld_event,
3627

3628
        .trigger_notify = socket_trigger_notify,
3629

3630
        .reset_failed = socket_reset_failed,
3631

3632
        .notify_handoff_timestamp = socket_handoff_timestamp,
3633

3634
        .control_pid = socket_control_pid,
3635

3636
        .bus_set_property = bus_socket_set_property,
3637
        .bus_commit_properties = bus_socket_commit_properties,
3638

3639
        .status_message_formats = {
3640
                .finished_start_job = {
3641
                        [JOB_DONE]       = "Listening on %s.",
3642
                        [JOB_FAILED]     = "Failed to listen on %s.",
3643
                        [JOB_TIMEOUT]    = "Timed out starting %s.",
3644
                },
3645
                .finished_stop_job = {
3646
                        [JOB_DONE]       = "Closed %s.",
3647
                        [JOB_FAILED]     = "Failed stopping %s.",
3648
                        [JOB_TIMEOUT]    = "Timed out stopping %s.",
3649
                },
3650
        },
3651

3652
        .can_start = socket_can_start,
3653
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc