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

systemd / systemd / 14630481637

23 Apr 2025 07:04PM UTC coverage: 72.178% (-0.002%) from 72.18%
14630481637

push

github

DaanDeMeyer
mkosi: Run clangd within the tools tree instead of the build container

Running within the build sandbox has a number of disadvantages:
- We have a separate clangd cache for each distribution/release combo
- It requires to build the full image before clangd can be used
- It breaks every time the image becomes out of date and requires a
  rebuild
- We can't look at system headers as we don't have the knowledge to map
  them from inside the build sandbox to the corresponding path on the host

Instead, let's have mkosi.clangd run clangd within the tools tree. We
already require building systemd for both the host and the target anyway,
and all the dependencies to build systemd are installed in the tools tree
already for that, as well as clangd since it's installed together with the
other clang tooling we install in the tools tree. Unlike the previous approach,
this approach only requires the mkosi tools tree to be built upfront, which has
a much higher chance of not invalidating its cache. We can also trivially map
system header lookups from within the sandbox to the path within mkosi.tools
on the host so that starts working as well.

297054 of 411557 relevant lines covered (72.18%)

686269.58 hits per line

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

56.53
/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 <mqueue.h>
7
#include <netinet/tcp.h>
8
#include <sys/epoll.h>
9
#include <sys/stat.h>
10
#include <unistd.h>
11
#include <linux/sctp.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-name.h"
50
#include "unit.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) {
9,618✔
84
        return IN_SET(state,
9,618✔
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,635✔
98
        assert(s);
3,635✔
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,635✔
106
                return false;
107

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

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

114
        return true;
115
}
116

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

174
        LIST_CLEAR(port, s->ports, socket_port_free);
10,588✔
175
}
5,132✔
176

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

181
        socket_free_ports(s);
5,132✔
182

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

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

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

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

193
        socket_unwatch_control_pid(s);
5,132✔
194

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

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

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

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

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

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

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

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

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

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

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

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

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

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

235
        return false;
236
}
237

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

241
        assert(s);
5,129✔
242

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

246
                if (p->type == SOCKET_SOCKET)
5,456✔
247
                        path = socket_address_get_path(&p->address);
5,219✔
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,456✔
252
                        continue;
348✔
253

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

259
        return 0;
260
}
261

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

265
        assert(s);
5,129✔
266

267
        if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
5,129✔
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,129✔
275
        int r;
5,129✔
276

277
        assert(s);
5,129✔
278

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

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

286
        if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
2,476✔
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,476✔
293
}
294

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

298
        FOREACH_ARRAY(i, s->exec_command, _SOCKET_EXEC_COMMAND_MAX)
30,246✔
299
                if (*i)
25,293✔
300
                        return true;
301

302
        return false;
303
}
304

305
static int socket_add_extras(Socket *s) {
5,129✔
306
        Unit *u = UNIT(ASSERT_PTR(s));
5,129✔
307
        int r;
5,129✔
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,129✔
322
                s->trigger_limit.interval = 2 * USEC_PER_SEC;
5,129✔
323
        if (s->trigger_limit.burst == UINT_MAX)
5,129✔
324
                s->trigger_limit.burst = s->accept ? 200 : 20;
9,059✔
325

326
        if (s->poll_limit.interval == USEC_INFINITY)
5,129✔
327
                s->poll_limit.interval = 2 * USEC_PER_SEC;
4,979✔
328
        if (s->poll_limit.burst == UINT_MAX)
5,129✔
329
                s->poll_limit.burst = s->accept ? 150 : 15;
8,909✔
330

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

333
                if (!UNIT_ISSET(s->service)) {
3,930✔
334
                        Unit *x;
2,453✔
335

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

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

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

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

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

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

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

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

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

374
        return 0;
375
}
376

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

380
        assert(s);
2,682✔
381

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

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

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

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

395
                default:
396
                        f = NULL;
397
                }
398

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

403
                        found = f;
404
                }
405
        }
406

407
        return found;
408
}
409

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

414
        if (!s->ports)
5,129✔
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,129✔
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,129✔
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,129✔
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,454✔
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,132✔
470
        Socket *s = ASSERT_PTR(SOCKET(u));
5,132✔
471
        int r;
5,132✔
472

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

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

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

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

487
        return socket_verify(s);
5,129✔
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,
1✔
913
                                             nr, ucred.pid, pidfd_id, ucred.uid);
914
                        else
915
                                r = asprintf(&s, "%u-" PID_FMT "-" UID_FMT,
1✔
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,890✔
951
        assert(s);
1,890✔
952

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

956
                p->event_source = sd_event_source_disable_unref(p->event_source);
1,922✔
957
                p->fd = safe_close(p->fd);
1,922✔
958
                socket_port_close_auxiliary_fds(p);
1,922✔
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,922✔
967
                        continue;
1,872✔
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,890✔
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,890✔
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,293✔
998
        int r;
2,293✔
999

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

1004
        if (s->keep_alive) {
2,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
1079
                r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
173✔
1080
                if (r < 0)
173✔
1081
                        log_unit_warning_errno(UNIT(s), r, "SO_PRIORITY failed: %m");
×
1082
        }
1083

1084
        if (s->receive_buffer > 0) {
2,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,293✔
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,357✔
1296
        const char *p;
2,357✔
1297
        int r;
2,357✔
1298

1299
        assert(s);
2,357✔
1300

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

1305
        STRV_FOREACH(i, s->symlinks) {
2,228✔
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,275✔
1379
        int r;
2,275✔
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,275✔
1388
        assert(ret);
2,275✔
1389

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

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

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

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

1405
        if (cfd >= 0) {
458✔
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);
914✔
1421
        if (r < 0)
458✔
1422
                return r;
1423

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

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

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

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

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

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

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

1458
        return socket_address_listen(
4,584✔
1459
                        address,
1460
                        SOCK_CLOEXEC|SOCK_NONBLOCK,
1461
                        s->backlog,
2,292✔
1462
                        s->bind_ipv6_only,
1463
                        s->bind_to_device,
2,292✔
1464
                        s->reuse_port,
2,292✔
1465
                        s->free_bind,
2,292✔
1466
                        s->transparent,
2,292✔
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,291✔
1481
        int r;
2,291✔
1482

1483
        assert(address);
2,291✔
1484
        assert(s);
2,291✔
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,291✔
1490
        CGroupContext *c = unit_get_cgroup_context(u);
2,291✔
1491
        if (c)
2,291✔
1492
                FOREACH_ARRAY(nft_set, c->nft_set_context.sets, c->nft_set_context.n_sets)
2,291✔
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,291✔
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,291✔
1505
}
1506

1507
static int socket_address_listen_in_cgroup(
2,291✔
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,291✔
1514
        int fd, r;
2,291✔
1515

1516
        assert(s);
2,291✔
1517
        assert(address);
2,291✔
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,291✔
1525
        if (r < 0)
2,291✔
1526
                return r;
1527
        if (r == 0) {
2,291✔
1528
                /* Shortcut things... */
1529
                fd = socket_address_listen_do(s, address, label);
2,291✔
1530
                if (fd < 0)
2,291✔
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,267✔
1619
        _cleanup_(socket_close_fdsp) Socket *s = orig_s;
2,267✔
1620
        _cleanup_freecon_ char *label = NULL;
2,267✔
1621
        bool know_label = false;
2,267✔
1622
        int r;
2,267✔
1623

1624
        assert(s);
2,267✔
1625

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

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

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

1633
                case SOCKET_SOCKET:
2,291✔
1634

1635
                        if (!know_label) {
2,291✔
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,228✔
1640
                                if (r < 0)
2,228✔
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,291✔
1648

1649
                        case SOCK_STREAM:
2,123✔
1650
                                if (IN_SET(s->socket_protocol, IPPROTO_SCTP, IPPROTO_MPTCP))
2,123✔
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,291✔
1666
                        if (p->fd < 0)
2,291✔
1667
                                return p->fd;
1668

1669
                        socket_apply_socket_options(s, p, p->fd);
2,291✔
1670
                        socket_symlink(s);
2,291✔
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,630✔
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,012✔
1737
        int r;
6,012✔
1738

1739
        assert(s);
6,012✔
1740

1741
        LIST_FOREACH(port, p, s->ports) {
12,335✔
1742
                if (p->fd < 0)
6,323✔
1743
                        continue;
2,363✔
1744

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

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

1754
        assert(s);
3,606✔
1755

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

1760
                if (p->event_source) {
3,810✔
1761
                        r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
580✔
1762
                        if (r < 0)
580✔
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,230✔
1766
                        if (r < 0)
3,230✔
1767
                                goto fail;
×
1768

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

1772
                r = sd_event_source_set_ratelimit(p->event_source, s->poll_limit.interval, s->poll_limit.burst);
3,810✔
1773
                if (r < 0)
3,810✔
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,131✔
1792
        bool have_open = false, have_closed = false;
1,131✔
1793

1794
        assert(s);
1,131✔
1795

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

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

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

1809
        return SOCKET_OPEN_NONE;
1810
}
1811

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

1815
        assert(s);
9,618✔
1816

1817
        if (s->state != state)
9,618✔
1818
                bus_unit_send_pending_change_signal(UNIT(s), false);
8,460✔
1819

1820
        old_state = s->state;
9,618✔
1821
        s->state = state;
9,618✔
1822

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

1830
        if (state != SOCKET_LISTENING)
9,618✔
1831
                socket_unwatch_fds(s);
6,012✔
1832

1833
        if (!IN_SET(state,
6,012✔
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,890✔
1843

1844
        if (state != old_state)
9,618✔
1845
                log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state));
8,460✔
1846

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

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

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

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

1859
        if (pidref_is_set(&s->control_pid) &&
1,131✔
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,131✔
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,131✔
1889
                if (r == SOCKET_OPEN_NONE)
1,131✔
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,131✔
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,131✔
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,131✔
1908
                (void) unit_setup_exec_runtime(u);
1,131✔
1909

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

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

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

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

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

1932
        r = unit_set_exec_params(UNIT(s), &exec_params);
173✔
1933
        if (r < 0)
173✔
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) {
173✔
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),
173✔
1957
                       c,
1958
                       &s->exec_context,
173✔
1959
                       &exec_params,
1960
                       s->exec_runtime,
1961
                       &s->cgroup_context,
173✔
1962
                       &pidref);
1963
        if (r < 0)
173✔
1964
                return r;
1965

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

1970
        *ret_pid = TAKE_PIDREF(pidref);
173✔
1971
        return 0;
173✔
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,890✔
2053
        assert(s);
1,890✔
2054

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

2058
        if (s->result == SOCKET_SUCCESS)
1,890✔
2059
                unit_log_success(UNIT(s));
1,890✔
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,890✔
2064

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

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

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

2071
        unit_unref_uid_gid(UNIT(s), true);
1,890✔
2072
}
1,890✔
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,890✔
2077
        int r;
1,890✔
2078

2079
        assert(s);
1,890✔
2080

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

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

2088
        if (s->control_command) {
1,890✔
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,890✔
2101
}
2102

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

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

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

2112
        return KILL_KILL;
2113
}
2114

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

2118
        assert(s);
3,781✔
2119

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

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

2135
                socket_set_state(s, state);
1✔
2136
        } else if (state == SOCKET_STOP_PRE_SIGTERM)
3,780✔
2137
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
×
2138
        else if (state == SOCKET_STOP_PRE_SIGKILL)
3,780✔
2139
                socket_enter_stop_post(s, SOCKET_SUCCESS);
×
2140
        else if (state == SOCKET_FINAL_SIGTERM)
3,780✔
2141
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
1,890✔
2142
        else
2143
                socket_enter_dead(s, SOCKET_SUCCESS);
1,890✔
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,889✔
2155
        int r;
1,889✔
2156

2157
        assert(s);
1,889✔
2158

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

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

2166
        if (s->control_command) {
1,889✔
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,889✔
2179
}
2180

2181
static void flush_ports(Socket *s) {
3✔
2182
        assert(s);
3✔
2183

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

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

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

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

2199
        assert(s);
2,856✔
2200

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

2206
        r = socket_watch_fds(s);
2,856✔
2207
        if (r < 0) {
2,856✔
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);
2,856✔
2214
}
2215

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

2219
        assert(s);
2,267✔
2220

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

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

2228
                r = socket_spawn(s, s->control_command, &s->control_pid);
173✔
2229
                if (r < 0) {
173✔
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);
173✔
2236
        } else
2237
                socket_enter_listening(s);
2,094✔
2238
}
2239

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

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

2246
        if (!isempty(s->user) || !isempty(s->group)) {
2,267✔
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,267✔
2262
}
2263

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

2267
        assert(s);
2,267✔
2268
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_START_PRE));
2,267✔
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,267✔
2276

2277
        r = socket_open_fds(s);
2,267✔
2278
        if (r < 0) {
2,267✔
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,267✔
2285
}
2286

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

2290
        assert(s);
2,267✔
2291

2292
        socket_unwatch_control_pid(s);
2,267✔
2293

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

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

2299
        if (s->control_command) {
2,267✔
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,267✔
2312
}
2313

2314
static void socket_enter_running(Socket *s, int cfd_in) {
197✔
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;
197✔
2318
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
197✔
2319
        int r;
197✔
2320

2321
        assert(s);
197✔
2322

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

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

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

2331
                flush_ports(s);
3✔
2332
                return;
2333
        }
2334

2335
        if (!ratelimit_below(&s->trigger_limit)) {
194✔
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 */
194✔
2342
                bool pending = false;
192✔
2343
                Unit *other;
192✔
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)
669✔
2347
                        if (unit_active_or_pending(other)) {
192✔
2348
                                pending = true;
2349
                                break;
2350
                        }
2351

2352
                if (!pending) {
192✔
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 < 0)
93✔
2361
                                goto queue_error;
×
2362
                }
2363

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

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

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

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

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

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

2411
                s->n_accepted++;
2✔
2412

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

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

2425
                s->n_connections++;
2✔
2426

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

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

2439
        return;
2440

2441
refuse:
×
2442
        s->n_refused++;
×
2443
        return;
×
2444

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

2450
fail:
×
2451
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2452
}
2453

2454
static void socket_run_next(Socket *s) {
×
2455
        int r;
×
2456

2457
        assert(s);
×
2458
        assert(s->control_command);
×
2459
        assert(s->control_command->command_next);
×
2460

2461
        socket_unwatch_control_pid(s);
×
2462

2463
        s->control_command = s->control_command->command_next;
×
2464

2465
        pidref_done(&s->control_pid);
×
2466

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

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

2480
static int socket_start(Unit *u) {
2,267✔
2481
        Socket *s = ASSERT_PTR(SOCKET(u));
2,267✔
2482
        int r;
2,267✔
2483

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

2496
        /* Already on it! */
2497
        if (IN_SET(s->state,
4,534✔
2498
                   SOCKET_START_PRE,
2499
                   SOCKET_START_OPEN,
2500
                   SOCKET_START_CHOWN,
2501
                   SOCKET_START_POST))
2502
                return 0;
2503

2504
        /* Cannot run this without the service being around */
2505
        if (UNIT_ISSET(s->service)) {
2,267✔
2506
                Service *service = ASSERT_PTR(SERVICE(UNIT_DEREF(s->service)));
1,828✔
2507

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

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

2518
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
2,267✔
2519

2520
        r = unit_acquire_invocation_id(u);
2,267✔
2521
        if (r < 0)
2,267✔
2522
                return r;
2523

2524
        s->result = SOCKET_SUCCESS;
2,267✔
2525
        exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
2,267✔
2526

2527
        if (s->cgroup_runtime)
2,267✔
2528
                s->cgroup_runtime->reset_accounting = true;
60✔
2529

2530
        socket_enter_start_pre(s);
2,267✔
2531
        return 1;
2,267✔
2532
}
2533

2534
static int socket_stop(Unit *u) {
1,890✔
2535
        Socket *s = ASSERT_PTR(SOCKET(u));
1,890✔
2536

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

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

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

2564
        assert(IN_SET(s->state, SOCKET_LISTENING, SOCKET_RUNNING));
1,889✔
2565

2566
        socket_enter_stop_pre(s, SOCKET_SUCCESS);
1,889✔
2567
        return 1;
1,889✔
2568
}
2569

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

2574
        assert(f);
2,335✔
2575
        assert(fds);
2,335✔
2576

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

2583
        if (s->control_command_id >= 0)
2,335✔
2584
                (void) serialize_item(f, "control-command", socket_exec_command_to_string(s->control_command_id));
×
2585

2586
        LIST_FOREACH(port, p, s->ports) {
4,880✔
2587
                int copy;
2,545✔
2588

2589
                if (p->fd < 0)
2,545✔
2590
                        continue;
989✔
2591

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

2596
                if (p->type == SOCKET_SOCKET) {
1,556✔
2597
                        _cleanup_free_ char *t = NULL;
1,416✔
2598

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

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

2619
        (void) serialize_ratelimit(f, "trigger-ratelimit", &s->trigger_limit);
2,335✔
2620

2621
        return 0;
2,335✔
2622
}
2623

2624
static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
10,527✔
2625
        Socket *s = ASSERT_PTR(SOCKET(u));
10,527✔
2626
        int r;
10,527✔
2627

2628
        assert(key);
10,527✔
2629
        assert(value);
10,527✔
2630

2631
        if (streq(key, "state")) {
10,527✔
2632
                SocketState state;
1,848✔
2633

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

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

2648
        } else if (streq(key, "n-accepted")) {
6,831✔
2649
                unsigned k;
1,848✔
2650

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

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

2664
                if (!pidref_is_set(&s->control_pid))
10,527✔
2665
                        (void) deserialize_pidref(fds, value, &s->control_pid);
×
2666

2667
        } else if (streq(key, "control-command")) {
3,135✔
2668
                SocketExecCommand id;
×
2669

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

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

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

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

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

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

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

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

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

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

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

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

2761
        } else if (streq(key, "socket")) {
3,018✔
2762
                _cleanup_free_ char *fdv = NULL, *typev = NULL;
1,086✔
2763
                bool found = false;
1,086✔
2764
                int fd, type;
1,086✔
2765

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

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

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

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

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

2800
        } else if (streq(key, "netlink")) {
1,932✔
2801
                _cleanup_free_ char *fdv = NULL;
84✔
2802
                bool found = false;
84✔
2803
                int fd;
84✔
2804

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

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

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

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

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

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

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

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

2860
        return 0;
2861
}
2862

2863
static void socket_distribute_fds(Unit *u, FDSet *fds) {
1,031✔
2864
        Socket *s = ASSERT_PTR(SOCKET(u));
1,031✔
2865

2866
        LIST_FOREACH(port, p, s->ports) {
2,152✔
2867
                int fd;
1,121✔
2868

2869
                if (p->type != SOCKET_SOCKET)
1,121✔
2870
                        continue;
65✔
2871

2872
                if (p->fd >= 0)
1,056✔
2873
                        continue;
608✔
2874

2875
                FDSET_FOREACH(fd, fds) {
1,380✔
2876
                        if (socket_address_matches_fd(&p->address, fd)) {
932✔
2877
                                p->fd = fdset_remove(fds, fd);
×
2878
                                s->deserialized_state = SOCKET_LISTENING;
×
2879
                                break;
×
2880
                        }
2881
                }
2882
        }
2883
}
1,031✔
2884

2885
static UnitActiveState socket_active_state(Unit *u) {
347,609✔
2886
        Socket *s = ASSERT_PTR(SOCKET(u));
347,609✔
2887

2888
        return state_translation_table[s->state];
347,609✔
2889
}
2890

2891
static const char *socket_sub_state_to_string(Unit *u) {
3,136✔
2892
        Socket *s = ASSERT_PTR(SOCKET(u));
3,136✔
2893

2894
        return socket_state_to_string(s->state);
3,136✔
2895
}
2896

2897
int socket_port_to_address(const SocketPort *p, char **ret) {
111✔
2898
        _cleanup_free_ char *address = NULL;
111✔
2899
        int r;
111✔
2900

2901
        assert(p);
111✔
2902
        assert(ret);
111✔
2903

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

2910
                        break;
2911
                }
2912

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

2922
                default:
×
2923
                        assert_not_reached();
×
2924
        }
2925

2926
        *ret = TAKE_PTR(address);
111✔
2927

2928
        return 0;
111✔
2929
}
2930

2931
const char* socket_port_type_to_string(SocketPort *p) {
111✔
2932
        assert(p);
111✔
2933

2934
        switch (p->type) {
111✔
2935

2936
        case SOCKET_SOCKET:
105✔
2937

2938
                switch (p->address.type) {
105✔
2939

2940
                case SOCK_STREAM:
2941
                        return "Stream";
2942

2943
                case SOCK_DGRAM:
9✔
2944
                        return "Datagram";
9✔
2945

2946
                case SOCK_SEQPACKET:
6✔
2947
                        return "SequentialPacket";
6✔
2948

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

2953
                        _fallthrough_;
×
2954
                default:
2955
                        return NULL;
×
2956
                }
2957

2958
        case SOCKET_SPECIAL:
2959
                return "Special";
2960

2961
        case SOCKET_MQUEUE:
×
2962
                return "MessageQueue";
×
2963

2964
        case SOCKET_FIFO:
6✔
2965
                return "FIFO";
6✔
2966

2967
        case SOCKET_USB_FUNCTION:
×
2968
                return "USBFunction";
×
2969

2970
        default:
×
2971
                return NULL;
×
2972
        }
2973
}
2974

2975
SocketType socket_port_type_from_string(const char *s) {
×
2976
        assert(s);
×
2977

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

2992
static bool socket_may_gc(Unit *u) {
11,620✔
2993
        Socket *s = ASSERT_PTR(SOCKET(u));
11,620✔
2994

2995
        return s->n_connections == 0;
11,620✔
2996
}
2997

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

3001
        assert(s);
2✔
3002
        assert(fd >= 0);
2✔
3003

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

3009
        return cfd;
3010
}
3011

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

3017
        assert(s);
2✔
3018
        assert(p);
2✔
3019
        assert(fd >= 0);
2✔
3020

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

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

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

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

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

3042
                pair[0] = safe_close(pair[0]);
×
3043

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

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

3058
                _exit(EXIT_SUCCESS);
×
3059
        }
3060

3061
        pair[1] = safe_close(pair[1]);
×
3062
        cfd = receive_one_fd(pair[0], 0);
×
3063

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

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

3078
        return cfd;
3079

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

3087
        return cfd;
3088
}
3089

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

3094
        assert(fd >= 0);
197✔
3095

3096
        if (p->socket->state != SOCKET_LISTENING)
197✔
3097
                return 0;
3098

3099
        log_unit_debug(UNIT(p->socket), "Incoming traffic");
197✔
3100

3101
        if (revents != EPOLLIN) {
197✔
3102
                if (revents & EPOLLHUP)
×
3103
                        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.");
×
3104
                else
3105
                        log_unit_error(UNIT(p->socket), "Got unexpected poll event (0x%x) on socket.", revents);
×
3106
                goto fail;
×
3107
        }
3108

3109
        if (p->socket->accept &&
197✔
3110
            p->type == SOCKET_SOCKET &&
4✔
3111
            socket_address_can_accept(&p->address)) {
2✔
3112

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

3119
                socket_apply_socket_options(p->socket, p, cfd);
2✔
3120
        }
3121

3122
        socket_enter_running(p->socket, cfd);
197✔
3123
        return 0;
197✔
3124

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

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

3134
        assert(pid >= 0);
173✔
3135

3136
        if (pid != s->control_pid.pid)
173✔
3137
                return;
3138

3139
        pidref_done(&s->control_pid);
173✔
3140

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

3152
        if (s->control_command) {
173✔
3153
                exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
173✔
3154

3155
                if (s->control_command->flags & EXEC_COMMAND_IGNORE_FAILURE)
173✔
3156
                        f = SOCKET_SUCCESS;
173✔
3157
        }
3158

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

3166
        if (s->result == SOCKET_SUCCESS)
173✔
3167
                s->result = f;
173✔
3168

3169
        if (s->control_command &&
173✔
3170
            s->control_command->command_next &&
173✔
3171
            f == SOCKET_SUCCESS) {
3172

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

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

3182
                log_unit_debug(u, "Got final SIGCHLD for state %s", socket_state_to_string(s->state));
173✔
3183

3184
                switch (s->state) {
173✔
3185

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

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

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

3207
                case SOCKET_STOP_PRE:
1✔
3208
                case SOCKET_STOP_PRE_SIGTERM:
3209
                case SOCKET_STOP_PRE_SIGKILL:
3210
                        socket_enter_stop_post(s, f);
1✔
3211
                        break;
1✔
3212

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

3219
                case SOCKET_CLEANING:
×
3220

3221
                        if (s->clean_result == SOCKET_SUCCESS)
×
3222
                                s->clean_result = f;
×
3223

3224
                        socket_enter_dead(s, SOCKET_SUCCESS);
×
3225
                        break;
×
3226

3227
                default:
×
3228
                        assert_not_reached();
×
3229
                }
3230
        }
3231

3232
        /* Notify clients about changed exit status */
3233
        unit_add_to_dbus_queue(u);
173✔
3234
}
3235

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

3239
        assert(s->timer_event_source == source);
×
3240

3241
        switch (s->state) {
×
3242

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

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

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

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

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

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

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

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

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

3297
                if (s->clean_result == SOCKET_SUCCESS)
×
3298
                        s->clean_result = SOCKET_FAILURE_TIMEOUT;
×
3299

3300
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, 0);
×
3301
                break;
×
3302

3303
        default:
×
3304
                assert_not_reached();
×
3305
        }
3306

3307
        return 0;
×
3308
}
3309

3310
int socket_collect_fds(Socket *s, int **ret) {
459✔
3311
        size_t n = 0, k = 0;
459✔
3312

3313
        assert(s);
459✔
3314
        assert(ret);
459✔
3315

3316
        /* Called from the service code for requesting our fds */
3317

3318
        LIST_FOREACH(port, p, s->ports) {
952✔
3319
                if (p->fd >= 0)
493✔
3320
                        n++;
474✔
3321
                n += p->n_auxiliary_fds;
493✔
3322
        }
3323

3324
        if (n == 0) {
459✔
3325
                *ret = NULL;
19✔
3326
                return 0;
19✔
3327
        }
3328

3329
        int *fds = new(int, n);
440✔
3330
        if (!fds)
440✔
3331
                return -ENOMEM;
3332

3333
        LIST_FOREACH(port, p, s->ports) {
914✔
3334
                if (p->fd >= 0)
474✔
3335
                        fds[k++] = p->fd;
474✔
3336
                FOREACH_ARRAY(i, p->auxiliary_fds, p->n_auxiliary_fds)
474✔
3337
                        fds[k++] = *i;
×
3338
        }
3339

3340
        assert(k == n);
440✔
3341

3342
        *ret = fds;
440✔
3343
        return (int) n;
440✔
3344
}
3345

3346
static void socket_reset_failed(Unit *u) {
34✔
3347
        Socket *s = SOCKET(u);
34✔
3348

3349
        assert(s);
×
3350

3351
        if (s->state == SOCKET_FAILED)
34✔
3352
                socket_set_state(s, SOCKET_DEAD);
×
3353

3354
        s->result = SOCKET_SUCCESS;
34✔
3355
        s->clean_result = SOCKET_SUCCESS;
34✔
3356
}
34✔
3357

3358
void socket_connection_unref(Socket *s) {
2✔
3359
        assert(s);
2✔
3360

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

3366
        assert(s->n_connections > 0);
2✔
3367
        s->n_connections--;
2✔
3368

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

3372
static void socket_trigger_notify(Unit *u, Unit *other) {
2,746✔
3373
        Socket *s = ASSERT_PTR(SOCKET(u));
2,746✔
3374

3375
        assert(other);
2,746✔
3376

3377
        /* Filter out invocations with bogus state */
3378
        assert(UNIT_IS_LOAD_COMPLETE(other->load_state));
2,746✔
3379

3380
        Service *service = ASSERT_PTR(SERVICE(other));
2,746✔
3381

3382
        /* Don't propagate state changes from the service if we are already down */
3383
        if (!IN_SET(s->state, SOCKET_RUNNING, SOCKET_LISTENING))
2,746✔
3384
                return;
3385

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

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

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

3400
        if (!SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ true))
1,807✔
3401
                socket_enter_listening(s);
590✔
3402

3403
        if (SERVICE(other)->state == SERVICE_RUNNING)
1,807✔
3404
                socket_set_state(s, SOCKET_RUNNING);
1,108✔
3405
}
3406

3407
static void socket_handoff_timestamp(
346✔
3408
                Unit *u,
3409
                const struct ucred *ucred,
3410
                const dual_timestamp *ts) {
3411

3412
        Socket *s = ASSERT_PTR(SOCKET(u));
346✔
3413

3414
        assert(ucred);
346✔
3415
        assert(ts);
346✔
3416

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

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

3428
        if (!s->timer_event_source)
×
3429
                return 0;
×
3430

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

3437
        *timeout = t;
×
3438
        return 1;
×
3439
}
3440

3441
const char* socket_fdname(Socket *s) {
544✔
3442
        assert(s);
544✔
3443

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

3447
        if (s->fdname)
544✔
3448
                return s->fdname;
3449

3450
        if (s->accept)
481✔
3451
                return "connection";
3452

3453
        return UNIT(s)->id;
470✔
3454
}
3455

3456
static PidRef* socket_control_pid(Unit *u) {
7,562✔
3457
        return &ASSERT_PTR(SOCKET(u))->control_pid;
15,124✔
3458
}
3459

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

3465
        assert(mask != 0);
×
3466

3467
        if (s->state != SOCKET_DEAD)
×
3468
                return -EBUSY;
3469

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

3474
        if (strv_isempty(l))
×
3475
                return -EUNATCH;
3476

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

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

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

3494
        socket_set_state(s, SOCKET_CLEANING);
×
3495
        return 0;
3496

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

3503
static int socket_can_clean(Unit *u, ExecCleanMask *ret) {
102✔
3504
        Socket *s = ASSERT_PTR(SOCKET(u));
102✔
3505

3506
        return exec_context_get_clean_mask(&s->exec_context, ret);
102✔
3507
}
3508

3509
static int socket_can_start(Unit *u) {
2,267✔
3510
        Socket *s = ASSERT_PTR(SOCKET(u));
2,267✔
3511
        int r;
2,267✔
3512

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

3519
        return 1;
3520
}
3521

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

3530
DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
229✔
3531

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

3544
DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
6,934✔
3545

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

3552
DEFINE_STRING_TABLE_LOOKUP(socket_timestamping, SocketTimestamping);
320✔
3553

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

3558
        if (!p)
218✔
3559
                return _SOCKET_TIMESTAMPING_INVALID;
3560

3561
        t = socket_timestamping_from_string(p);
218✔
3562
        if (t >= 0)
218✔
3563
                return t;
3564

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

3572
        r = parse_boolean(p);
×
3573
        if (r < 0)
×
3574
                return _SOCKET_TIMESTAMPING_INVALID;
3575

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

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

3587
        .sections =
3588
                "Unit\0"
3589
                "Socket\0"
3590
                "Install\0",
3591
        .private_section = "Socket",
3592

3593
        .can_transient = true,
3594
        .can_trigger = true,
3595
        .can_fail = true,
3596

3597
        .init = socket_init,
3598
        .done = socket_done,
3599
        .load = socket_load,
3600

3601
        .coldplug = socket_coldplug,
3602

3603
        .dump = socket_dump,
3604

3605
        .start = socket_start,
3606
        .stop = socket_stop,
3607

3608
        .clean = socket_clean,
3609
        .can_clean = socket_can_clean,
3610

3611
        .get_timeout = socket_get_timeout,
3612

3613
        .serialize = socket_serialize,
3614
        .deserialize_item = socket_deserialize_item,
3615
        .distribute_fds = socket_distribute_fds,
3616

3617
        .active_state = socket_active_state,
3618
        .sub_state_to_string = socket_sub_state_to_string,
3619

3620
        .will_restart = unit_will_restart_default,
3621

3622
        .may_gc = socket_may_gc,
3623

3624
        .sigchld_event = socket_sigchld_event,
3625

3626
        .trigger_notify = socket_trigger_notify,
3627

3628
        .reset_failed = socket_reset_failed,
3629

3630
        .notify_handoff_timestamp = socket_handoff_timestamp,
3631

3632
        .control_pid = socket_control_pid,
3633

3634
        .bus_set_property = bus_socket_set_property,
3635
        .bus_commit_properties = bus_socket_commit_properties,
3636

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

3650
        .can_start = socket_can_start,
3651
};
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