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

systemd / systemd / 20151578145

11 Dec 2025 05:38AM UTC coverage: 72.698% (-0.02%) from 72.713%
20151578145

push

github

web-flow
core: gracefully skip unknown policy designators in RootImagePolicy et al (#40060)

Usually we gracefully ignore unknown configuration parameters, so that
service files can be written by upstreams and used across a variegated
range of distributions with various versions of systemd, to avoid
forcing users to the minimum common denominator and only adding settings
that are supported by the oldest distro supported.

Image policies do not behave like this, and any unknown partition or
policy designator causes the whole unit to fail to parse and a hard
error.

Change it so that parsing RootImagePolicy and friends via unit file or
D-Bus logs but otherwise ignores unknown specifiers, like other options
do.

This allows us to add new specifiers in the future, and users to adopt
them immediately.

Follow-up for d452335aa

44 of 49 new or added lines in 7 files covered. (89.8%)

297 existing lines in 37 files now uncovered.

309479 of 425707 relevant lines covered (72.7%)

1150153.67 hits per line

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

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

3
#include <fcntl.h>
4
#include <linux/sctp.h>
5
#include <mqueue.h>
6
#include <netinet/tcp.h>
7
#include <sys/stat.h>
8
#include <unistd.h>
9

10
#include "sd-bus.h"
11

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

56
typedef struct SocketPeer {
57
        unsigned n_ref;
58

59
        Socket *socket;
60
        union sockaddr_union peer;
61
        socklen_t peer_salen;
62
        struct ucred peer_cred;
63
} SocketPeer;
64

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

84
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
85
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
86

87
static bool SOCKET_STATE_WITH_PROCESS(SocketState state) {
13,675✔
88
        return IN_SET(state,
13,675✔
89
                      SOCKET_START_PRE,
90
                      SOCKET_START_CHOWN,
91
                      SOCKET_START_POST,
92
                      SOCKET_STOP_PRE,
93
                      SOCKET_STOP_PRE_SIGTERM,
94
                      SOCKET_STOP_PRE_SIGKILL,
95
                      SOCKET_STOP_POST,
96
                      SOCKET_FINAL_SIGTERM,
97
                      SOCKET_FINAL_SIGKILL,
98
                      SOCKET_CLEANING);
99
}
100

101
static bool SOCKET_SERVICE_IS_ACTIVE(Service *s, bool allow_finalize) {
5,388✔
102
        assert(s);
5,388✔
103

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

109
        if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(UNIT(s))))
5,388✔
110
                return false;
111

112
        if (IN_SET(s->state, SERVICE_AUTO_RESTART, SERVICE_AUTO_RESTART_QUEUED))
1,812✔
113
                return false;
114

115
        if (allow_finalize && IN_SET(s->state, SERVICE_FINAL_SIGTERM, SERVICE_FINAL_SIGKILL, SERVICE_CLEANING))
1,803✔
116
                return false;
×
117

118
        return true;
119
}
120

121
static void socket_init(Unit *u) {
6,700✔
122
        Socket *s = ASSERT_PTR(SOCKET(u));
6,700✔
123

124
        assert(u->load_state == UNIT_STUB);
6,700✔
125

126
        s->backlog = SOMAXCONN_DELUXE;
6,700✔
127
        s->timeout_usec = u->manager->defaults.timeout_start_usec;
6,700✔
128
        s->directory_mode = 0755;
6,700✔
129
        s->socket_mode = 0666;
6,700✔
130

131
        s->max_connections = 64;
6,700✔
132

133
        s->pass_rights = true; /* defaults to enabled in kernel */
6,700✔
134
        s->priority = -1;
6,700✔
135
        s->ip_tos = -1;
6,700✔
136
        s->ip_ttl = -1;
6,700✔
137
        s->mark = -1;
6,700✔
138

139
        s->exec_context.std_output = u->manager->defaults.std_output;
6,700✔
140
        s->exec_context.std_error = u->manager->defaults.std_error;
6,700✔
141

142
        s->control_pid = PIDREF_NULL;
6,700✔
143
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
6,700✔
144

145
        s->trigger_limit = RATELIMIT_OFF;
6,700✔
146

147
        s->poll_limit = RATELIMIT_OFF;
6,700✔
148

149
        s->defer_trigger_max_usec = USEC_INFINITY;
6,700✔
150
}
6,700✔
151

152
static void socket_unwatch_control_pid(Socket *s) {
32,427✔
153
        assert(s);
32,427✔
154
        unit_unwatch_pidref_done(UNIT(s), &s->control_pid);
32,427✔
155
}
32,427✔
156

157
static void socket_port_close_auxiliary_fds(SocketPort *p) {
10,253✔
158
        assert(p);
10,253✔
159

160
        close_many(p->auxiliary_fds, p->n_auxiliary_fds);
10,253✔
161
        p->auxiliary_fds = mfree(p->auxiliary_fds);
10,253✔
162
        p->n_auxiliary_fds = 0;
10,253✔
163
}
10,253✔
164

165
SocketPort* socket_port_free(SocketPort *p) {
7,227✔
166
        if (!p)
7,227✔
167
                return NULL;
168

169
        sd_event_source_unref(p->event_source);
7,227✔
170

171
        socket_port_close_auxiliary_fds(p);
7,227✔
172
        safe_close(p->fd);
7,227✔
173
        free(p->path);
7,227✔
174

175
        return mfree(p);
7,227✔
176
}
177

178
void socket_free_ports(Socket *s) {
6,700✔
179
        assert(s);
6,700✔
180

181
        LIST_CLEAR(port, s->ports, socket_port_free);
13,926✔
182
}
6,700✔
183

184
static void socket_done(Unit *u) {
6,700✔
185
        Socket *s = ASSERT_PTR(SOCKET(u));
6,700✔
186
        SocketPeer *p;
6,700✔
187

188
        socket_free_ports(s);
6,700✔
189

190
        while ((p = set_steal_first(s->peers_by_address)))
6,700✔
191
                p->socket = NULL;
×
192

193
        s->peers_by_address = set_free(s->peers_by_address);
6,700✔
194

195
        s->exec_runtime = exec_runtime_free(s->exec_runtime);
6,700✔
196

197
        exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
6,700✔
198
        s->control_command = NULL;
6,700✔
199

200
        socket_unwatch_control_pid(s);
6,700✔
201

202
        unit_ref_unset(&s->service);
6,700✔
203

204
        s->tcp_congestion = mfree(s->tcp_congestion);
6,700✔
205
        s->bind_to_device = mfree(s->bind_to_device);
6,700✔
206

207
        s->smack = mfree(s->smack);
6,700✔
208
        s->smack_ip_in = mfree(s->smack_ip_in);
6,700✔
209
        s->smack_ip_out = mfree(s->smack_ip_out);
6,700✔
210

211
        strv_free(s->symlinks);
6,700✔
212

213
        s->user = mfree(s->user);
6,700✔
214
        s->group = mfree(s->group);
6,700✔
215

216
        s->fdname = mfree(s->fdname);
6,700✔
217

218
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
6,700✔
219
}
6,700✔
220

221
static int socket_arm_timer(Socket *s, bool relative, usec_t usec) {
202✔
222
        assert(s);
202✔
223

224
        return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, socket_dispatch_timer);
202✔
225
}
226

227
static bool have_non_accept_socket(Socket *s) {
8,163✔
228
        assert(s);
8,163✔
229

230
        if (!s->accept)
8,163✔
231
                return true;
232

233
        LIST_FOREACH(port, p, s->ports) {
5,872✔
234

235
                if (p->type != SOCKET_SOCKET)
2,936✔
236
                        return true;
237

238
                if (!socket_address_can_accept(&p->address))
2,936✔
239
                        return true;
240
        }
241

242
        return false;
243
}
244

245
static int socket_add_mount_dependencies(Socket *s) {
6,695✔
246
        int r;
6,695✔
247

248
        assert(s);
6,695✔
249

250
        LIST_FOREACH(port, p, s->ports) {
13,921✔
251
                const char *path = NULL;
7,226✔
252

253
                if (p->type == SOCKET_SOCKET)
7,226✔
254
                        path = socket_address_get_path(&p->address);
6,980✔
255
                else if (IN_SET(p->type, SOCKET_FIFO, SOCKET_SPECIAL, SOCKET_USB_FUNCTION))
246✔
256
                        path = p->path;
246✔
257

258
                if (!path)
7,226✔
259
                        continue;
363✔
260

261
                r = unit_add_mounts_for(UNIT(s), path, UNIT_DEPENDENCY_FILE, UNIT_MOUNT_REQUIRES);
6,863✔
262
                if (r < 0)
6,863✔
263
                        return r;
264
        }
265

266
        return 0;
267
}
268

269
static int socket_add_device_dependencies(Socket *s) {
6,695✔
270
        char *t;
6,695✔
271

272
        assert(s);
6,695✔
273

274
        if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
6,695✔
275
                return 0;
276

277
        t = strjoina("/sys/subsystem/net/devices/", s->bind_to_device);
×
278
        return unit_add_node_dependency(UNIT(s), t, UNIT_BINDS_TO, UNIT_DEPENDENCY_FILE);
×
279
}
280

281
static int socket_add_default_dependencies(Socket *s) {
6,695✔
282
        int r;
6,695✔
283

284
        assert(s);
6,695✔
285

286
        if (!UNIT(s)->default_dependencies)
6,695✔
287
                return 0;
288

289
        r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
3,306✔
290
        if (r < 0)
3,306✔
291
                return r;
292

293
        if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
3,306✔
294
                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
1,205✔
295
                if (r < 0)
1,205✔
296
                        return r;
297
        }
298

299
        return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
3,306✔
300
}
301

302
static bool socket_has_exec(Socket *s) {
6,695✔
303
        assert(s);
6,695✔
304

305
        FOREACH_ARRAY(i, s->exec_command, _SOCKET_EXEC_COMMAND_MAX)
39,525✔
306
                if (*i)
33,045✔
307
                        return true;
308

309
        return false;
310
}
311

312
static int socket_add_extras(Socket *s) {
6,695✔
313
        Unit *u = UNIT(ASSERT_PTR(s));
6,695✔
314
        int r;
6,695✔
315

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

328
        if (s->trigger_limit.interval == USEC_INFINITY)
6,695✔
329
                s->trigger_limit.interval = 2 * USEC_PER_SEC;
6,695✔
330
        if (s->trigger_limit.burst == UINT_MAX)
6,695✔
331
                s->trigger_limit.burst = s->accept ? 200 : 20;
11,922✔
332

333
        if (s->poll_limit.interval == USEC_INFINITY)
6,695✔
334
                s->poll_limit.interval = 2 * USEC_PER_SEC;
6,549✔
335
        if (s->poll_limit.burst == UINT_MAX)
6,695✔
336
                s->poll_limit.burst = s->accept ? 150 : 15;
11,776✔
337

338
        if (have_non_accept_socket(s)) {
6,695✔
339

340
                if (!UNIT_ISSET(s->service)) {
5,227✔
341
                        Unit *x;
3,114✔
342

343
                        r = unit_load_related_unit(u, ".service", &x);
3,114✔
344
                        if (r < 0)
3,114✔
345
                                return r;
×
346

347
                        unit_ref_set(&s->service, u, x);
3,114✔
348
                }
349

350
                r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true, UNIT_DEPENDENCY_IMPLICIT);
5,227✔
351
                if (r < 0)
5,227✔
352
                        return r;
353
        }
354

355
        r = socket_add_mount_dependencies(s);
6,695✔
356
        if (r < 0)
6,695✔
357
                return r;
358

359
        r = socket_add_device_dependencies(s);
6,695✔
360
        if (r < 0)
6,695✔
361
                return r;
362

363
        r = unit_patch_contexts(u);
6,695✔
364
        if (r < 0)
6,695✔
365
                return r;
366

367
        if (socket_has_exec(s)) {
6,695✔
368
                r = unit_add_exec_dependencies(u, &s->exec_context);
215✔
369
                if (r < 0)
215✔
370
                        return r;
371
        }
372

373
        r = unit_set_default_slice(u);
6,695✔
374
        if (r < 0)
6,695✔
375
                return r;
376

377
        r = socket_add_default_dependencies(s);
6,695✔
378
        if (r < 0)
6,695✔
379
                return r;
×
380

381
        return 0;
382
}
383

384
static const char* socket_find_symlink_target(Socket *s) {
3,937✔
385
        const char *found = NULL;
3,937✔
386

387
        assert(s);
3,937✔
388

389
        LIST_FOREACH(port, p, s->ports) {
7,874✔
390
                const char *f;
4,539✔
391

392
                switch (p->type) {
4,539✔
393

394
                case SOCKET_FIFO:
157✔
395
                        f = p->path;
157✔
396
                        break;
157✔
397

398
                case SOCKET_SOCKET:
4,382✔
399
                        f = socket_address_get_path(&p->address);
4,382✔
400
                        break;
4,382✔
401

402
                default:
403
                        f = NULL;
404
                }
405

406
                if (f) {
4,539✔
407
                        if (found)
4,457✔
408
                                return NULL;
409

410
                        found = f;
411
                }
412
        }
413

414
        return found;
415
}
416

417
static int socket_verify(Socket *s) {
6,695✔
418
        assert(s);
6,695✔
419
        assert(UNIT(s)->load_state == UNIT_LOADED);
6,695✔
420

421
        if (!s->ports)
6,695✔
422
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit has no Listen setting (ListenStream=, ListenDatagram=, ListenFIFO=, ...). Refusing.");
×
423

424
        if (s->max_connections <= 0)
6,695✔
425
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "MaxConnection= setting too small. Refusing.");
×
426

427
        if (s->accept && have_non_accept_socket(s))
6,695✔
428
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
×
429

430
        if (s->accept && UNIT_ISSET(s->service))
6,695✔
431
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Explicit service configuration for accepting socket units not supported. Refusing.");
×
432

433
        if (s->accept && s->defer_trigger != SOCKET_DEFER_NO)
6,695✔
434
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Socket unit is configured to be accepting with DeferTrigger= enabled. Refusing.");
×
435

436
        if (!strv_isempty(s->symlinks) && !socket_find_symlink_target(s))
7,010✔
437
                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.");
×
438

439
        return 0;
440
}
441

442
static void peer_address_hash_func(const SocketPeer *s, struct siphash *state) {
221✔
443
        assert(s);
221✔
444

445
        if (s->peer.sa.sa_family == AF_INET)
221✔
446
                siphash24_compress_typesafe(s->peer.in.sin_addr, state);
×
447
        else if (s->peer.sa.sa_family == AF_INET6)
221✔
448
                siphash24_compress_typesafe(s->peer.in6.sin6_addr, state);
×
449
        else if (s->peer.sa.sa_family == AF_VSOCK)
221✔
450
                siphash24_compress_typesafe(s->peer.vm.svm_cid, state);
×
451
        else if (s->peer.sa.sa_family == AF_UNIX)
221✔
452
                siphash24_compress_typesafe(s->peer_cred.uid, state);
221✔
453
        else
454
                assert_not_reached();
×
455
}
221✔
456

457
static int peer_address_compare_func(const SocketPeer *x, const SocketPeer *y) {
89✔
458
        int r;
89✔
459

460
        r = CMP(x->peer.sa.sa_family, y->peer.sa.sa_family);
89✔
461
        if (r != 0)
89✔
462
                return r;
×
463

464
        switch (x->peer.sa.sa_family) {
89✔
465
        case AF_INET:
×
466
                return memcmp(&x->peer.in.sin_addr, &y->peer.in.sin_addr, sizeof(x->peer.in.sin_addr));
×
467
        case AF_INET6:
×
468
                return memcmp(&x->peer.in6.sin6_addr, &y->peer.in6.sin6_addr, sizeof(x->peer.in6.sin6_addr));
×
469
        case AF_VSOCK:
×
470
                return CMP(x->peer.vm.svm_cid, y->peer.vm.svm_cid);
×
471
        case AF_UNIX:
89✔
472
                return CMP(x->peer_cred.uid, y->peer_cred.uid);
89✔
473
        }
474
        assert_not_reached();
×
475
}
476

477
DEFINE_PRIVATE_HASH_OPS(peer_address_hash_ops, SocketPeer, peer_address_hash_func, peer_address_compare_func);
478

479
static int socket_load(Unit *u) {
6,701✔
480
        Socket *s = ASSERT_PTR(SOCKET(u));
6,701✔
481
        int r;
6,701✔
482

483
        assert(u->load_state == UNIT_STUB);
6,701✔
484

485
        r = unit_load_fragment_and_dropin(u, true);
6,701✔
486
        if (r < 0)
6,701✔
487
                return r;
488

489
        if (u->load_state != UNIT_LOADED)
6,695✔
490
                return 0;
491

492
        /* This is a new unit? Then let's add in some extras */
493
        r = socket_add_extras(s);
6,695✔
494
        if (r < 0)
6,695✔
495
                return r;
496

497
        return socket_verify(s);
6,695✔
498
}
499

500
static SocketPeer* socket_peer_dup(const SocketPeer *q) {
71✔
501
        SocketPeer *p;
71✔
502

503
        assert(q);
71✔
504

505
        p = new(SocketPeer, 1);
71✔
506
        if (!p)
71✔
507
                return NULL;
508

509
        *p = (SocketPeer) {
71✔
510
                .n_ref = 1,
511
                .peer = q->peer,
71✔
512
                .peer_salen = q->peer_salen,
71✔
513
                .peer_cred = q->peer_cred,
71✔
514
        };
515

516
        return p;
71✔
517
}
518

519
static SocketPeer* socket_peer_free(SocketPeer *p) {
71✔
520
        assert(p);
71✔
521

522
        if (p->socket)
71✔
523
                set_remove(p->socket->peers_by_address, p);
71✔
524

525
        return mfree(p);
71✔
526
}
527

528
DEFINE_TRIVIAL_REF_UNREF_FUNC(SocketPeer, socket_peer, socket_peer_free);
110✔
529

530
int socket_acquire_peer(Socket *s, int fd, SocketPeer **ret) {
89✔
531
        _cleanup_(socket_peer_unrefp) SocketPeer *remote = NULL;
89✔
532
        SocketPeer key = {
89✔
533
                .peer_salen = sizeof(union sockaddr_union),
534
                .peer_cred = UCRED_INVALID,
535
        }, *i;
536
        int r;
89✔
537

538
        assert(s);
89✔
539
        assert(fd >= 0);
89✔
540
        assert(ret);
89✔
541

542
        if (getpeername(fd, &key.peer.sa, &key.peer_salen) < 0)
89✔
543
                return log_unit_error_errno(UNIT(s), errno, "getpeername() failed: %m");
×
544

545
        switch (key.peer.sa.sa_family) {
89✔
546
        case AF_INET:
547
        case AF_INET6:
548
        case AF_VSOCK:
549
                break;
550

551
        case AF_UNIX:
89✔
552
                r = getpeercred(fd, &key.peer_cred);
89✔
553
                if (r < 0)
89✔
554
                        return log_unit_error_errno(UNIT(s), r, "Failed to get peer credentials of socket: %m");
×
555
                break;
556

557
        default:
×
558
                *ret = NULL;
×
559
                return 0;
×
560
        }
561

562
        i = set_get(s->peers_by_address, &key);
89✔
563
        if (i) {
89✔
564
                *ret = socket_peer_ref(i);
18✔
565
                return 1;
18✔
566
        }
567

568
        remote = socket_peer_dup(&key);
71✔
569
        if (!remote)
71✔
570
                return log_oom();
×
571

572
        r = set_ensure_put(&s->peers_by_address, &peer_address_hash_ops, remote);
71✔
573
        if (r < 0)
71✔
574
                return log_unit_error_errno(UNIT(s), r, "Failed to insert peer info into hash table: %m");
×
575

576
        remote->socket = s;
71✔
577

578
        *ret = TAKE_PTR(remote);
71✔
579
        return 1;
71✔
580
}
581

582
static const char* listen_lookup(int family, int type) {
42✔
583

584
        if (family == AF_NETLINK)
42✔
585
                return "ListenNetlink";
586

587
        if (type == SOCK_STREAM)
39✔
588
                return "ListenStream";
589
        else if (type == SOCK_DGRAM)
5✔
590
                return "ListenDatagram";
591
        else if (type == SOCK_SEQPACKET)
2✔
592
                return "ListenSequentialPacket";
593

594
        assert_not_reached();
×
595
}
596

597
static void socket_dump(Unit *u, FILE *f, const char *prefix) {
41✔
598
        Socket *s = ASSERT_PTR(SOCKET(u));
41✔
599
        const char *prefix2, *str;
41✔
600

601
        assert(f);
41✔
602

603
        prefix = strempty(prefix);
41✔
604
        prefix2 = strjoina(prefix, "\t");
205✔
605

606
        fprintf(f,
82✔
607
                "%sSocket State: %s\n"
608
                "%sResult: %s\n"
609
                "%sClean Result: %s\n"
610
                "%sBindIPv6Only: %s\n"
611
                "%sBacklog: %u\n"
612
                "%sSocketMode: %04o\n"
613
                "%sDirectoryMode: %04o\n"
614
                "%sKeepAlive: %s\n"
615
                "%sNoDelay: %s\n"
616
                "%sFreeBind: %s\n"
617
                "%sTransparent: %s\n"
618
                "%sBroadcast: %s\n"
619
                "%sPassCredentials: %s\n"
620
                "%sPassPIDFD: %s\n"
621
                "%sPassSecurity: %s\n"
622
                "%sPassPacketInfo: %s\n"
623
                "%sAcceptFileDescriptors: %s\n"
624
                "%sTCPCongestion: %s\n"
625
                "%sRemoveOnStop: %s\n"
626
                "%sWritable: %s\n"
627
                "%sFileDescriptorName: %s\n"
628
                "%sPassFileDescriptorsToExec: %s\n"
629
                "%sSELinuxContextFromNet: %s\n",
630
                prefix, socket_state_to_string(s->state),
631
                prefix, socket_result_to_string(s->result),
632
                prefix, socket_result_to_string(s->clean_result),
633
                prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
634
                prefix, s->backlog,
635
                prefix, s->socket_mode,
636
                prefix, s->directory_mode,
637
                prefix, yes_no(s->keep_alive),
41✔
638
                prefix, yes_no(s->no_delay),
41✔
639
                prefix, yes_no(s->free_bind),
41✔
640
                prefix, yes_no(s->transparent),
41✔
641
                prefix, yes_no(s->broadcast),
41✔
642
                prefix, yes_no(s->pass_cred),
41✔
643
                prefix, yes_no(s->pass_pidfd),
41✔
644
                prefix, yes_no(s->pass_sec),
41✔
645
                prefix, yes_no(s->pass_pktinfo),
41✔
646
                prefix, yes_no(s->pass_rights),
41✔
647
                prefix, strna(s->tcp_congestion),
41✔
648
                prefix, yes_no(s->remove_on_stop),
41✔
649
                prefix, yes_no(s->writable),
41✔
650
                prefix, socket_fdname(s),
651
                prefix, yes_no(s->pass_fds_to_exec),
41✔
652
                prefix, yes_no(s->selinux_context_from_net));
41✔
653

654
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF)
41✔
655
                fprintf(f,
2✔
656
                        "%sTimestamping: %s\n",
657
                        prefix, socket_timestamping_to_string(s->timestamping));
658

659
        if (pidref_is_set(&s->control_pid))
660
                fprintf(f,
×
661
                        "%sControl PID: "PID_FMT"\n",
662
                        prefix, s->control_pid.pid);
663

664
        if (s->bind_to_device)
41✔
665
                fprintf(f,
×
666
                        "%sBindToDevice: %s\n",
667
                        prefix, s->bind_to_device);
668

669
        if (s->accept)
41✔
670
                fprintf(f,
12✔
671
                        "%sAccepted: %u\n"
672
                        "%sNConnections: %u\n"
673
                        "%sMaxConnections: %u\n"
674
                        "%sMaxConnectionsPerSource: %u\n",
675
                        prefix, s->n_accepted,
676
                        prefix, s->n_connections,
677
                        prefix, s->max_connections,
678
                        prefix, s->max_connections_per_source);
679
        else
680
                fprintf(f,
58✔
681
                        "%sFlushPending: %s\n"
682
                        "%sDeferTrigger: %s\n"
683
                        "%sDeferTriggerMaxSec: %s\n",
684
                        prefix, yes_no(s->flush_pending),
29✔
685
                        prefix, socket_defer_trigger_to_string(s->defer_trigger),
686
                        prefix, FORMAT_TIMESPAN(s->defer_trigger_max_usec, USEC_PER_SEC));
29✔
687

688
        if (s->priority >= 0)
41✔
689
                fprintf(f,
×
690
                        "%sPriority: %i\n",
691
                        prefix, s->priority);
692

693
        if (s->receive_buffer > 0)
41✔
694
                fprintf(f,
6✔
695
                        "%sReceiveBuffer: %zu\n",
696
                        prefix, s->receive_buffer);
697

698
        if (s->send_buffer > 0)
41✔
699
                fprintf(f,
1✔
700
                        "%sSendBuffer: %zu\n",
701
                        prefix, s->send_buffer);
702

703
        if (s->ip_tos >= 0)
41✔
704
                fprintf(f,
×
705
                        "%sIPTOS: %i\n",
706
                        prefix, s->ip_tos);
707

708
        if (s->ip_ttl >= 0)
41✔
709
                fprintf(f,
×
710
                        "%sIPTTL: %i\n",
711
                        prefix, s->ip_ttl);
712

713
        if (s->pipe_size > 0)
41✔
714
                fprintf(f,
×
715
                        "%sPipeSize: %zu\n",
716
                        prefix, s->pipe_size);
717

718
        if (s->mark >= 0)
41✔
719
                fprintf(f,
×
720
                        "%sMark: %i\n",
721
                        prefix, s->mark);
722

723
        if (s->mq_maxmsg > 0)
41✔
724
                fprintf(f,
×
725
                        "%sMessageQueueMaxMessages: %li\n",
726
                        prefix, s->mq_maxmsg);
727

728
        if (s->mq_msgsize > 0)
41✔
729
                fprintf(f,
×
730
                        "%sMessageQueueMessageSize: %li\n",
731
                        prefix, s->mq_msgsize);
732

733
        if (s->reuse_port)
41✔
734
                fprintf(f,
×
735
                        "%sReusePort: %s\n",
736
                         prefix, yes_no(s->reuse_port));
737

738
        if (s->smack)
41✔
739
                fprintf(f,
×
740
                        "%sSmackLabel: %s\n",
741
                        prefix, s->smack);
742

743
        if (s->smack_ip_in)
41✔
744
                fprintf(f,
×
745
                        "%sSmackLabelIPIn: %s\n",
746
                        prefix, s->smack_ip_in);
747

748
        if (s->smack_ip_out)
41✔
749
                fprintf(f,
×
750
                        "%sSmackLabelIPOut: %s\n",
751
                        prefix, s->smack_ip_out);
752

753
        if (!isempty(s->user) || !isempty(s->group))
41✔
754
                fprintf(f,
×
755
                        "%sSocketUser: %s\n"
756
                        "%sSocketGroup: %s\n",
757
                        prefix, strna(s->user),
×
758
                        prefix, strna(s->group));
×
759

760
        if (timestamp_is_set(s->keep_alive_time))
41✔
761
                fprintf(f,
×
762
                        "%sKeepAliveTimeSec: %s\n",
763
                        prefix, FORMAT_TIMESPAN(s->keep_alive_time, USEC_PER_SEC));
×
764

765
        if (s->keep_alive_interval > 0)
41✔
766
                fprintf(f,
×
767
                        "%sKeepAliveIntervalSec: %s\n",
768
                        prefix, FORMAT_TIMESPAN(s->keep_alive_interval, USEC_PER_SEC));
×
769

770
        if (s->keep_alive_cnt > 0)
41✔
771
                fprintf(f,
×
772
                        "%sKeepAliveProbes: %u\n",
773
                        prefix, s->keep_alive_cnt);
774

775
        if (s->defer_accept > 0)
41✔
776
                fprintf(f,
×
777
                        "%sDeferAcceptSec: %s\n",
778
                        prefix, FORMAT_TIMESPAN(s->defer_accept, USEC_PER_SEC));
×
779

780
        LIST_FOREACH(port, p, s->ports) {
85✔
781

782
                switch (p->type) {
44✔
783
                case SOCKET_SOCKET: {
42✔
784
                        _cleanup_free_ char *k = NULL;
42✔
785
                        int r;
42✔
786

787
                        r = socket_address_print(&p->address, &k);
42✔
788
                        if (r < 0) {
42✔
789
                                errno = -r;
×
790
                                fprintf(f, "%s%s: %m\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type));
×
791
                        } else
792
                                fprintf(f, "%s%s: %s\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type), k);
42✔
793
                        break;
42✔
794
                }
795
                case SOCKET_SPECIAL:
×
796
                        fprintf(f, "%sListenSpecial: %s\n", prefix, p->path);
×
797
                        break;
798
                case SOCKET_USB_FUNCTION:
×
799
                        fprintf(f, "%sListenUSBFunction: %s\n", prefix, p->path);
×
800
                        break;
801
                case SOCKET_MQUEUE:
×
802
                        fprintf(f, "%sListenMessageQueue: %s\n", prefix, p->path);
×
803
                        break;
804
                default:
2✔
805
                        fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
2✔
806
                }
807
        }
808

809
        fprintf(f,
41✔
810
                "%sTriggerLimitIntervalSec: %s\n"
811
                "%sTriggerLimitBurst: %u\n"
812
                "%sPollLimitIntervalSec: %s\n"
813
                "%sPollLimitBurst: %u\n",
814
                prefix, FORMAT_TIMESPAN(s->trigger_limit.interval, USEC_PER_SEC),
41✔
815
                prefix, s->trigger_limit.burst,
816
                prefix, FORMAT_TIMESPAN(s->poll_limit.interval, USEC_PER_SEC),
41✔
817
                prefix, s->poll_limit.burst);
818

819
        str = ip_protocol_to_name(s->socket_protocol);
41✔
820
        if (str)
41✔
821
                fprintf(f, "%sSocketProtocol: %s\n", prefix, str);
41✔
822

823
        if (!strv_isempty(s->symlinks)) {
41✔
824
                fprintf(f, "%sSymlinks:", prefix);
3✔
825
                STRV_FOREACH(q, s->symlinks)
7✔
826
                        fprintf(f, " %s", *q);
4✔
827

828
                fprintf(f, "\n");
3✔
829
        }
830

831
        fprintf(f,
41✔
832
                "%sTimeoutSec: %s\n",
833
                prefix, FORMAT_TIMESPAN(s->timeout_usec, USEC_PER_SEC));
41✔
834

835
        exec_context_dump(&s->exec_context, f, prefix);
41✔
836
        kill_context_dump(&s->kill_context, f, prefix);
41✔
837

838
        for (SocketExecCommand c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
246✔
839
                if (!s->exec_command[c])
205✔
840
                        continue;
205✔
841

842
                fprintf(f, "%s%s %s:\n",
×
843
                        prefix, glyph(GLYPH_ARROW_RIGHT), socket_exec_command_to_string(c));
844

845
                exec_command_dump_list(s->exec_command[c], f, prefix2);
×
846
        }
847

848
        cgroup_context_dump(UNIT(s), f, prefix);
41✔
849
}
41✔
850

851
static int instance_from_socket(
92✔
852
                int fd,
853
                unsigned nr,
854
                char **ret) {
855

856
        union sockaddr_union local, remote;
92✔
857
        socklen_t l;
92✔
858
        int r;
92✔
859

860
        assert(fd >= 0);
92✔
861
        assert(ret);
92✔
862

863
        l = sizeof(local);
92✔
864
        if (getsockname(fd, &local.sa, &l) < 0)
92✔
865
                return -errno;
92✔
866

867
        l = sizeof(remote);
92✔
868
        if (getpeername(fd, &remote.sa, &l) < 0)
92✔
869
                return -errno;
×
870

871
        uint64_t cookie;
92✔
872
        r = socket_get_cookie(fd, &cookie);
92✔
873
        if (r < 0)
92✔
874
                return r;
875

876
        char *s;
92✔
877

878
        switch (local.sa.sa_family) {
92✔
879

880
        case AF_INET: {
×
881
                uint32_t
×
882
                        a = be32toh(local.in.sin_addr.s_addr),
×
883
                        b = be32toh(remote.in.sin_addr.s_addr);
×
884

885
                if (asprintf(&s,
×
886
                             "%u-%" PRIu64 "-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
887
                             nr,
888
                             cookie,
889
                             a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
890
                             be16toh(local.in.sin_port),
×
891
                             b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
892
                             be16toh(remote.in.sin_port)) < 0)
×
893
                        return -ENOMEM;
894

895
                break;
896
        }
897

898
        case AF_INET6: {
×
899
                static const unsigned char ipv4_prefix[] = {
×
900
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
901
                };
902

903
                if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
×
904
                    memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
×
905
                        const uint8_t
×
906
                                *a = local.in6.sin6_addr.s6_addr+12,
×
907
                                *b = remote.in6.sin6_addr.s6_addr+12;
×
908

909
                        if (asprintf(&s,
×
910
                                     "%u-%" PRIu64 "-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
911
                                     nr,
912
                                     cookie,
913
                                     a[0], a[1], a[2], a[3],
×
914
                                     be16toh(local.in6.sin6_port),
×
915
                                     b[0], b[1], b[2], b[3],
×
916
                                     be16toh(remote.in6.sin6_port)) < 0)
×
917
                                return -ENOMEM;
918
                } else {
919
                        if (asprintf(&s,
×
920
                                     "%u-%" PRIu64 "-%s:%u-%s:%u",
921
                                     nr,
922
                                     cookie,
923
                                     IN6_ADDR_TO_STRING(&local.in6.sin6_addr),
×
924
                                     be16toh(local.in6.sin6_port),
×
925
                                     IN6_ADDR_TO_STRING(&remote.in6.sin6_addr),
×
926
                                     be16toh(remote.in6.sin6_port)) < 0)
×
927
                                return -ENOMEM;
×
928
                }
929

930
                break;
931
        }
932

933
        case AF_UNIX: {
92✔
934
                struct ucred ucred;
92✔
935

936
                r = getpeercred(fd, &ucred);
92✔
937
                if (r >= 0) {
92✔
938
                        _cleanup_close_ int pidfd = getpeerpidfd(fd);
184✔
939
                        uint64_t pidfd_id;
92✔
940

941
                        if (pidfd >= 0 && pidfd_get_inode_id(pidfd, &pidfd_id) >= 0)
92✔
942
                                r = asprintf(&s, "%u-%" PRIu64 "-" PID_FMT "_%" PRIu64 "-" UID_FMT,
90✔
943
                                             nr, cookie, ucred.pid, pidfd_id, ucred.uid);
944
                        else
945
                                r = asprintf(&s, "%u-%" PRIu64 "-" PID_FMT "-" UID_FMT,
2✔
946
                                             nr, cookie, ucred.pid, ucred.uid);
947
                        if (r < 0)
92✔
948
                                return -ENOMEM;
×
949
                } else if (r == -ENODATA) {
×
950
                        /* This handles the case where somebody is connecting from another pid/uid namespace
951
                         * (e.g. from outside of our container). */
952
                        if (asprintf(&s,
×
953
                                     "%u-%" PRIu64 "-unknown",
954
                                     nr,
955
                                     cookie) < 0)
956
                                return -ENOMEM;
957
                } else
958
                        return r;
959

960
                break;
92✔
961
        }
962

963
        case AF_VSOCK:
×
964
                if (asprintf(&s,
×
965
                             "%u-%" PRIu64 "-%u:%u-%u:%u",
966
                             nr,
967
                             cookie,
968
                             local.vm.svm_cid, local.vm.svm_port,
969
                             remote.vm.svm_cid, remote.vm.svm_port) < 0)
970
                        return -ENOMEM;
971

972
                break;
973

974
        default:
×
975
                assert_not_reached();
×
976
        }
977

978
        *ret = s;
92✔
979
        return 0;
92✔
980
}
981

982
static void socket_close_fds(Socket *s) {
2,800✔
983
        assert(s);
2,800✔
984

985
        LIST_FOREACH(port, p, s->ports) {
5,826✔
986
                bool was_open = p->fd >= 0;
3,026✔
987

988
                p->event_source = sd_event_source_disable_unref(p->event_source);
3,026✔
989
                p->fd = safe_close(p->fd);
3,026✔
990
                socket_port_close_auxiliary_fds(p);
3,026✔
991

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

998
                if (!was_open || !s->remove_on_stop)
3,026✔
999
                        continue;
2,749✔
1000

1001
                switch (p->type) {
277✔
1002

1003
                case SOCKET_FIFO:
22✔
1004
                        (void) unlink(p->path);
22✔
1005
                        break;
22✔
1006

1007
                case SOCKET_MQUEUE:
×
1008
                        (void) mq_unlink(p->path);
×
1009
                        break;
×
1010

1011
                case SOCKET_SOCKET:
255✔
1012
                        (void) socket_address_unlink(&p->address);
255✔
1013
                        break;
255✔
1014

1015
                default:
1016
                        ;
1017
                }
1018
        }
1019

1020
        if (s->remove_on_stop)
2,800✔
1021
                STRV_FOREACH(i, s->symlinks)
268✔
1022
                        (void) unlink(*i);
2✔
1023

1024
        /* Note that we don't return NULL here, since s has not been freed. */
1025
}
2,800✔
1026

1027
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(Socket*, socket_close_fds, NULL);
×
1028

1029
#define log_socket_option_errno(s, e, option)                                          \
1030
        ({                                                                             \
1031
                int _e_ = (e);                                                         \
1032
                log_unit_full_errno(                                                   \
1033
                                UNIT(s),                                               \
1034
                                ERRNO_IS_NOT_SUPPORTED(_e_) ? LOG_DEBUG : LOG_WARNING, \
1035
                                _e_,                                                   \
1036
                                "Failed to set %s socket option, ignoring: %m",        \
1037
                                option);                                               \
1038
        })
1039

1040
static void socket_apply_socket_options(Socket *s, SocketPort *p, int fd) {
3,635✔
1041
        int r;
3,635✔
1042

1043
        assert(s);
3,635✔
1044
        assert(p);
3,635✔
1045
        assert(fd >= 0);
3,635✔
1046

1047
        if (s->keep_alive) {
3,635✔
1048
                r = setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, true);
×
1049
                if (r < 0)
×
1050
                        log_socket_option_errno(s, r, "SO_KEEPALIVE");
×
1051
        }
1052

1053
        if (timestamp_is_set(s->keep_alive_time)) {
3,635✔
1054
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPIDLE, s->keep_alive_time / USEC_PER_SEC);
×
1055
                if (r < 0)
×
1056
                        log_socket_option_errno(s, r, "TCP_KEEPIDLE");
×
1057
        }
1058

1059
        if (s->keep_alive_interval > 0) {
3,635✔
1060
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPINTVL, s->keep_alive_interval / USEC_PER_SEC);
×
1061
                if (r < 0)
×
1062
                        log_socket_option_errno(s, r, "TCP_KEEPINTVL");
×
1063
        }
1064

1065
        if (s->keep_alive_cnt > 0) {
3,635✔
1066
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPCNT, s->keep_alive_cnt);
×
1067
                if (r < 0)
×
1068
                        log_socket_option_errno(s, r, "TCP_KEEPCNT");
×
1069
        }
1070

1071
        if (s->defer_accept > 0) {
3,635✔
1072
                r = setsockopt_int(fd, SOL_TCP, TCP_DEFER_ACCEPT, s->defer_accept / USEC_PER_SEC);
×
1073
                if (r < 0)
×
1074
                        log_socket_option_errno(s, r, "TCP_DEFER_ACCEPT");
×
1075
        }
1076

1077
        if (s->no_delay) {
3,635✔
1078
                if (s->socket_protocol == IPPROTO_SCTP) {
×
1079
                        r = setsockopt_int(fd, SOL_SCTP, SCTP_NODELAY, true);
×
1080
                        if (r < 0)
×
1081
                                log_socket_option_errno(s, r, "SCTP_NODELAY");
×
1082
                } else {
1083
                        r = setsockopt_int(fd, SOL_TCP, TCP_NODELAY, true);
×
1084
                        if (r < 0)
×
1085
                                log_socket_option_errno(s, r, "TCP_NODELAY");
×
1086
                }
1087
        }
1088

1089
        if (s->broadcast) {
3,635✔
1090
                r = setsockopt_int(fd, SOL_SOCKET, SO_BROADCAST, true);
×
1091
                if (r < 0)
×
1092
                        log_socket_option_errno(s, r, "SO_BROADCAST");
×
1093
        }
1094

1095
        if (s->pass_cred) {
3,635✔
1096
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true);
162✔
1097
                if (r < 0)
162✔
1098
                        log_socket_option_errno(s, r, "SO_PASSCRED");
×
1099
        }
1100

1101
        if (s->pass_pidfd) {
3,635✔
1102
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSPIDFD, true);
×
1103
                if (r < 0)
×
1104
                        log_socket_option_errno(s, r, "SO_PASSPIDFD");
×
1105
        }
1106

1107
        if (s->pass_sec) {
3,635✔
1108
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSSEC, true);
108✔
1109
                if (r < 0)
108✔
1110
                        log_socket_option_errno(s, r, "SO_PASSSEC");
×
1111
        }
1112

1113
        if (s->pass_pktinfo) {
3,635✔
1114
                r = socket_set_recvpktinfo(fd, socket_address_family(&p->address), true);
39✔
1115
                if (r < 0)
39✔
1116
                        log_socket_option_errno(s, r, "packet info");
×
1117
        }
1118

1119
        if (!s->pass_rights) {
3,635✔
1120
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSRIGHTS, false);
×
1121
                if (r < 0)
×
1122
                        log_socket_option_errno(s, r, "SO_PASSRIGHTS");
×
1123
        }
1124

1125
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF) {
3,635✔
1126
                r = setsockopt_int(fd, SOL_SOCKET,
216✔
1127
                                   s->timestamping == SOCKET_TIMESTAMPING_NS ? SO_TIMESTAMPNS : SO_TIMESTAMP,
1128
                                   true);
1129
                if (r < 0)
108✔
1130
                        log_socket_option_errno(s, r, "timestamping");
×
1131
        }
1132

1133
        if (s->priority >= 0) {
3,635✔
1134
                r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
187✔
1135
                if (r < 0)
187✔
1136
                        log_socket_option_errno(s, r, "SO_PRIORITY");
×
1137
        }
1138

1139
        if (s->receive_buffer > 0) {
3,635✔
1140
                r = fd_set_rcvbuf(fd, s->receive_buffer, false);
181✔
1141
                if (r < 0)
181✔
1142
                        log_socket_option_errno(s, r, "SO_RCVBUF/SO_RCVBUFFORCE");
×
1143
        }
1144

1145
        if (s->send_buffer > 0) {
3,635✔
1146
                r = fd_set_sndbuf(fd, s->send_buffer, false);
36✔
1147
                if (r < 0)
36✔
1148
                        log_socket_option_errno(s, r, "SO_SNDBUF/SO_SNDBUFFORCE");
×
1149
        }
1150

1151
        if (s->mark >= 0) {
3,635✔
1152
                r = setsockopt_int(fd, SOL_SOCKET, SO_MARK, s->mark);
×
1153
                if (r < 0)
×
1154
                        log_socket_option_errno(s, r, "SO_MARK");
×
1155
        }
1156

1157
        if (s->ip_tos >= 0) {
3,635✔
1158
                r = setsockopt_int(fd, IPPROTO_IP, IP_TOS, s->ip_tos);
×
1159
                if (r < 0)
×
1160
                        log_socket_option_errno(s, r, "IP_TOS");
×
1161
        }
1162

1163
        if (s->ip_ttl >= 0) {
3,635✔
1164
                r = socket_set_ttl(fd, socket_address_family(&p->address), s->ip_ttl);
×
1165
                if (r < 0)
×
1166
                        log_socket_option_errno(s, r, "IP_TTL/IPV6_UNICAST_HOPS");
×
1167
        }
1168

1169
        if (s->tcp_congestion)
3,635✔
1170
                if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
×
1171
                        log_socket_option_errno(s, errno, "TCP_CONGESTION");
×
1172

1173
        if (s->smack_ip_in) {
3,635✔
1174
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPIN, s->smack_ip_in);
×
1175
                if (r < 0)
×
1176
                        log_unit_warning_errno(UNIT(s), r, "Failed to apply SMACK label for IP input, ignoring: %m");
×
1177
        }
1178

1179
        if (s->smack_ip_out) {
3,635✔
1180
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPOUT, s->smack_ip_out);
×
1181
                if (r < 0)
×
1182
                        log_unit_warning_errno(UNIT(s), r, "Failed to apply SMACK label for IP output, ignoring: %m");
×
1183
        }
1184
}
3,635✔
1185

1186
static void socket_apply_fifo_options(Socket *s, int fd) {
79✔
1187
        int r;
79✔
1188

1189
        assert(s);
79✔
1190
        assert(fd >= 0);
79✔
1191

1192
        if (s->pipe_size > 0)
79✔
1193
                if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
×
1194
                        log_unit_warning_errno(UNIT(s), errno, "Setting pipe size failed, ignoring: %m");
×
1195

1196
        if (s->smack) {
79✔
1197
                r = mac_smack_apply_fd(fd, SMACK_ATTR_ACCESS, s->smack);
×
1198
                if (r < 0)
×
1199
                        log_unit_error_errno(UNIT(s), r, "SMACK relabelling failed, ignoring: %m");
×
1200
        }
1201
}
79✔
1202

1203
static int fifo_address_create(
79✔
1204
                const char *path,
1205
                mode_t directory_mode,
1206
                mode_t socket_mode) {
1207

1208
        _cleanup_close_ int fd = -EBADF;
79✔
1209
        mode_t old_mask;
79✔
1210
        struct stat st;
79✔
1211
        int r;
79✔
1212

1213
        assert(path);
79✔
1214

1215
        (void) mkdir_parents_label(path, directory_mode);
79✔
1216

1217
        r = mac_selinux_create_file_prepare(path, S_IFIFO);
79✔
1218
        if (r < 0)
79✔
1219
                return r;
1220

1221
        /* Enforce the right access mode for the fifo */
1222
        old_mask = umask(~socket_mode);
79✔
1223

1224
        /* Include the original umask in our mask */
1225
        (void) umask(~socket_mode | old_mask);
79✔
1226

1227
        r = mkfifo(path, socket_mode);
79✔
1228
        (void) umask(old_mask);
79✔
1229

1230
        if (r < 0 && errno != EEXIST) {
79✔
1231
                r = -errno;
×
1232
                goto fail;
×
1233
        }
1234

1235
        fd = open(path, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK | O_NOFOLLOW);
79✔
1236
        if (fd < 0) {
79✔
1237
                r = -errno;
×
1238
                goto fail;
×
1239
        }
1240

1241
        mac_selinux_create_file_clear();
79✔
1242

1243
        if (fstat(fd, &st) < 0) {
79✔
1244
                r = -errno;
×
1245
                goto fail;
×
1246
        }
1247

1248
        if (!S_ISFIFO(st.st_mode) ||
79✔
1249
            (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
158✔
1250
            st.st_uid != getuid() ||
158✔
1251
            st.st_gid != getgid()) {
79✔
1252
                r = -EEXIST;
×
1253
                goto fail;
×
1254
        }
1255

1256
        return TAKE_FD(fd);
1257

1258
fail:
×
1259
        mac_selinux_create_file_clear();
×
1260
        return r;
1261
}
1262

1263
static int special_address_create(const char *path, bool writable) {
6✔
1264
        _cleanup_close_ int fd = -EBADF;
6✔
1265
        struct stat st;
6✔
1266

1267
        assert(path);
6✔
1268

1269
        fd = open(path, (writable ? O_RDWR : O_RDONLY)|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
6✔
1270
        if (fd < 0)
6✔
1271
                return -errno;
×
1272

1273
        if (fstat(fd, &st) < 0)
6✔
1274
                return -errno;
×
1275

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

1280
        return TAKE_FD(fd);
1281
}
1282

1283
static int usbffs_address_create_at(int dfd, const char *name) {
×
1284
        _cleanup_close_ int fd = -EBADF;
×
1285
        struct stat st;
×
1286

1287
        assert(dfd >= 0);
×
1288
        assert(name);
×
1289

1290
        fd = openat(dfd, name, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
×
1291
        if (fd < 0)
×
1292
                return -errno;
×
1293

1294
        if (fstat(fd, &st) < 0)
×
1295
                return -errno;
×
1296

1297
        /* Check whether this is a regular file (ffs endpoint) */
1298
        if (!S_ISREG(st.st_mode))
×
1299
                return -EEXIST;
×
1300

1301
        return TAKE_FD(fd);
1302
}
1303

1304
static int mq_address_create(
×
1305
                const char *path,
1306
                mode_t mq_mode,
1307
                long maxmsg,
1308
                long msgsize) {
1309

1310
        _cleanup_close_ int fd = -EBADF;
×
1311
        struct stat st;
×
1312
        mode_t old_mask;
×
1313
        struct mq_attr _attr, *attr = NULL;
×
1314

1315
        assert(path);
×
1316

1317
        if (maxmsg > 0 && msgsize > 0) {
×
1318
                _attr = (struct mq_attr) {
×
1319
                        .mq_flags = O_NONBLOCK,
1320
                        .mq_maxmsg = maxmsg,
1321
                        .mq_msgsize = msgsize,
1322
                };
1323
                attr = &_attr;
×
1324
        }
1325

1326
        /* Enforce the right access mode for the mq */
1327
        old_mask = umask(~mq_mode);
×
1328

1329
        /* Include the original umask in our mask */
1330
        (void) umask(~mq_mode | old_mask);
×
1331
        fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
×
1332
        (void) umask(old_mask);
×
1333

1334
        if (fd < 0)
×
1335
                return -errno;
×
1336

1337
        if (fstat(fd, &st) < 0)
×
1338
                return -errno;
×
1339

1340
        if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
×
1341
            st.st_uid != getuid() ||
×
1342
            st.st_gid != getgid())
×
1343
                return -EEXIST;
×
1344

1345
        return TAKE_FD(fd);
1346
}
1347

1348
static int socket_symlink(Socket *s) {
3,622✔
1349
        const char *p;
3,622✔
1350
        int r;
3,622✔
1351

1352
        assert(s);
3,622✔
1353

1354
        p = socket_find_symlink_target(s);
3,622✔
1355
        if (!p)
3,622✔
1356
                return 0;
1357

1358
        STRV_FOREACH(i, s->symlinks) {
3,060✔
1359
                (void) mkdir_parents_label(*i, s->directory_mode);
122✔
1360

1361
                r = symlink_idempotent(p, *i, false);
122✔
1362
                if (r == -EEXIST && s->remove_on_stop) {
122✔
1363
                        /* If there's already something where we want to create the symlink, and the destructive
1364
                         * RemoveOnStop= mode is set, then we might as well try to remove what already exists and try
1365
                         * again. */
1366

1367
                        if (unlink(*i) >= 0)
×
1368
                                r = symlink_idempotent(p, *i, false);
×
1369
                }
1370
                if (r < 0)
122✔
1371
                        log_unit_warning_errno(UNIT(s), r, "Failed to create symlink %s %s %s, ignoring: %m",
×
1372
                                               p, glyph(GLYPH_ARROW_RIGHT), *i);
1373
        }
1374

1375
        return 0;
1376
}
1377

1378
static int usbffs_write_descs(int fd, Service *s) {
×
1379
        int r;
×
1380

1381
        assert(fd >= 0);
×
1382
        assert(s);
×
1383

1384
        if (!s->usb_function_descriptors || !s->usb_function_strings)
×
1385
                return -EINVAL;
1386

1387
        r = copy_file_fd(s->usb_function_descriptors, fd, 0);
×
1388
        if (r < 0)
×
1389
                return r;
1390

1391
        return copy_file_fd(s->usb_function_strings, fd, 0);
×
1392
}
1393

1394
static int usbffs_dispatch_eps(SocketPort *p, int dfd) {
×
1395
        _cleanup_free_ DirectoryEntries *des = NULL;
×
1396
        int r;
×
1397

1398
        assert(p);
×
1399
        assert(dfd >= 0);
×
1400

1401
        r = readdir_all(dfd, RECURSE_DIR_SORT|RECURSE_DIR_IGNORE_DOT, &des);
×
1402
        if (r < 0)
×
1403
                return r;
1404

1405
        p->auxiliary_fds = new(int, des->n_entries);
×
1406
        if (!p->auxiliary_fds)
×
1407
                return -ENOMEM;
1408

1409
        FOREACH_ARRAY(i, des->entries, des->n_entries) {
×
1410
                const struct dirent *de = *i;
×
1411

1412
                if (streq(de->d_name, "ep0"))
×
1413
                        continue;
×
1414

1415
                r = usbffs_address_create_at(dfd, de->d_name);
×
1416
                if (r < 0)
×
1417
                        goto fail;
×
1418

1419
                p->auxiliary_fds[p->n_auxiliary_fds++] = r;
×
1420
        }
1421

1422
        assert(p->n_auxiliary_fds < des->n_entries);
×
1423

1424
        return 0;
1425

1426
fail:
×
1427
        socket_port_close_auxiliary_fds(p);
×
1428
        return r;
1429
}
1430

1431
int socket_load_service_unit(Socket *s, int cfd, Unit **ret) {
3,430✔
1432
        int r;
3,430✔
1433

1434
        /* Figure out what the unit that will be used to handle the connections on the socket looks like.
1435
         *
1436
         * If cfd < 0, then we don't have a connection yet. In case of Accept=yes sockets, use a fake
1437
         * instance name.
1438
         */
1439

1440
        assert(s);
3,430✔
1441
        assert(ret);
3,430✔
1442

1443
        if (UNIT_ISSET(s->service)) {
3,430✔
1444
                *ret = UNIT_DEREF(s->service);
2,742✔
1445
                return 0;
3,430✔
1446
        }
1447

1448
        if (!s->accept)
688✔
1449
                return -ENODATA;
1450

1451
        /* Build the instance name and load the unit */
1452
        _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
688✔
1453

1454
        r = unit_name_to_prefix(UNIT(s)->id, &prefix);
688✔
1455
        if (r < 0)
688✔
1456
                return r;
1457

1458
        if (cfd >= 0) {
688✔
1459
                r = instance_from_socket(cfd, s->n_accepted, &instance);
92✔
1460
                if (ERRNO_IS_NEG_DISCONNECT(r))
92✔
1461
                        /* ENOTCONN is legitimate if TCP RST was received. Other socket families might return
1462
                         * different errors. This connection is over, but the socket unit lives on. */
1463
                        return log_unit_debug_errno(UNIT(s), r,
×
1464
                                                    "Got error %s on incoming socket, assuming aborted connection attempt, ignoring.",
1465
                                                    ERRNO_NAME(r));
1466
                if (r < 0)
92✔
1467
                        return r;
1468
        }
1469

1470
        /* For accepting sockets, we don't know how the instance will be called until we get a connection and
1471
         * can figure out what the peer name is. So let's use "internal" as the instance to make it clear
1472
         * that this is not an actual peer name. We use "unknown" when we cannot figure out the peer. */
1473
        r = unit_name_build(prefix, instance ?: "internal", ".service", &name);
1,284✔
1474
        if (r < 0)
688✔
1475
                return r;
1476

1477
        return manager_load_unit(UNIT(s)->manager, name, NULL, NULL, ret);
688✔
1478
}
1479

1480
static int socket_determine_selinux_label(Socket *s, char **ret) {
3,281✔
1481
        Unit *service;
3,281✔
1482
        int r;
3,281✔
1483

1484
        assert(s);
3,281✔
1485
        assert(ret);
3,281✔
1486

1487
        r = socket_load_service_unit(s, /* cfd= */ -EBADF, &service);
3,281✔
1488
        if (r == -ENODATA) {
3,281✔
1489
                *ret = NULL;
×
1490
                return 0;
×
1491
        }
1492
        if (r < 0)
3,281✔
1493
                return r;
1494

1495
        r = service_determine_exec_selinux_label(SERVICE(service), ret);
6,562✔
1496
        if (r == -ENODATA) {
3,281✔
1497
                *ret = NULL;
3,281✔
1498
                return 0;
3,281✔
1499
        }
1500
        return r;
1501
}
1502

1503
static int socket_address_listen_do(
3,558✔
1504
                Socket *s,
1505
                const SocketAddress *address,
1506
                const char *selinux_label) {
1507

1508
        assert(s);
3,558✔
1509
        assert(address);
3,558✔
1510

1511
        return socket_address_listen(
7,116✔
1512
                        address,
1513
                        SOCK_CLOEXEC|SOCK_NONBLOCK,
1514
                        s->backlog,
3,558✔
1515
                        s->bind_ipv6_only,
1516
                        s->bind_to_device,
3,558✔
1517
                        s->reuse_port,
3,558✔
1518
                        s->free_bind,
3,558✔
1519
                        s->transparent,
3,558✔
1520
                        s->directory_mode,
1521
                        s->socket_mode,
1522
                        selinux_label,
1523
                        s->smack);
3,558✔
1524
}
1525

1526
#define log_address_error_errno(u, address, error, fmt)          \
1527
        ({                                                       \
1528
                _cleanup_free_ char *_t = NULL;                  \
1529
                                                                 \
1530
                (void) socket_address_print(address, &_t);       \
1531
                log_unit_error_errno(u, error, fmt, strna(_t));  \
1532
        })
1533

1534
static bool fork_needed(const SocketAddress *address, Socket *s) {
3,543✔
1535
        assert(address);
3,543✔
1536
        assert(s);
3,543✔
1537

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

1540
        /* If there are any NFTSet= directives with cgroup source, we need the cgroup */
1541
        Unit *u = UNIT(s);
3,543✔
1542
        CGroupContext *c = unit_get_cgroup_context(u);
3,543✔
1543
        if (c)
3,543✔
1544
                FOREACH_ARRAY(nft_set, c->nft_set_context.sets, c->nft_set_context.n_sets)
3,543✔
1545
                        if (nft_set->source == NFT_SET_SOURCE_CGROUP)
×
1546
                                return true;
1547

1548
        if (IN_SET(address->sockaddr.sa.sa_family, AF_INET, AF_INET6) &&
3,543✔
1549
            bpf_program_supported() > 0) /* If BPF firewalling isn't supported anyway — there's no point in this forking complexity */
×
1550
                return true;
1551

1552
        return exec_needs_network_namespace(&s->exec_context);
3,543✔
1553
}
1554

1555
static int socket_address_listen_in_cgroup(
3,543✔
1556
                Socket *s,
1557
                const SocketAddress *address,
1558
                const char *label) {
1559

1560
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1561
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
3,543✔
1562
        int fd, r;
3,543✔
1563

1564
        assert(s);
3,543✔
1565
        assert(address);
3,543✔
1566

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

1572
        if (!fork_needed(address, s)) {
3,543✔
1573
                /* Shortcut things... */
1574
                fd = socket_address_listen_do(s, address, label);
3,543✔
1575
                if (fd < 0)
3,543✔
1576
                        return log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1577

1578
                return fd;
1579
        }
1580

1581
        r = unit_setup_exec_runtime(UNIT(s));
×
1582
        if (r < 0)
×
1583
                return log_unit_error_errno(UNIT(s), r, "Failed to acquire runtime: %m");
×
1584

1585
        if (s->exec_runtime && s->exec_runtime->shared) {
×
1586
                if (s->exec_context.user_namespace_path &&
×
1587
                    s->exec_runtime->shared->userns_storage_socket[0] >= 0) {
×
1588
                        r = open_shareable_ns_path(s->exec_runtime->shared->userns_storage_socket, s->exec_context.user_namespace_path, CLONE_NEWUSER);
×
1589
                        if (r < 0)
×
1590
                                return log_unit_error_errno(UNIT(s), r, "Failed to open user namespace path %s: %m", s->exec_context.user_namespace_path);
×
1591
                }
1592

1593
                if (s->exec_context.network_namespace_path &&
×
1594
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1595
                        r = open_shareable_ns_path(s->exec_runtime->shared->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
×
1596
                        if (r < 0)
×
1597
                                return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
×
1598
                }
1599

1600
                if (s->exec_context.ipc_namespace_path &&
×
1601
                    s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
×
1602
                        r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
×
1603
                        if (r < 0)
×
1604
                                return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
×
1605
                }
1606
        }
1607

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

1611
        r = unit_fork_helper_process(UNIT(s), "(sd-listen)", /* into_cgroup= */ true, &pid);
×
1612
        if (r < 0)
15✔
1613
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off listener stub process: %m");
×
1614
        if (r == 0) {
15✔
1615
                /* Child */
1616

1617
                pair[0] = safe_close(pair[0]);
15✔
1618

1619
                if (exec_needs_network_namespace(&s->exec_context) &&
15✔
1620
                    s->exec_runtime &&
×
1621
                    s->exec_runtime->shared &&
×
1622
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1623

1624
                        if (namespace_type_supported(NAMESPACE_NET)) {
×
1625
                                r = setup_shareable_ns(s->exec_runtime->shared->netns_storage_socket, CLONE_NEWNET);
×
1626
                                if (r < 0) {
×
1627
                                        log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
×
1628
                                        _exit(EXIT_NETWORK);
×
1629
                                }
1630
                        } else if (s->exec_context.network_namespace_path) {
×
1631
                                log_unit_error(UNIT(s), "Network namespace path configured but network namespaces not supported.");
×
1632
                                _exit(EXIT_NETWORK);
×
1633
                        } else
1634
                                log_unit_warning(UNIT(s), "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
×
1635
                }
1636

1637
                fd = socket_address_listen_do(s, address, label);
15✔
1638
                if (fd < 0) {
15✔
1639
                        log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1640
                        _exit(EXIT_FAILURE);
×
1641
                }
1642

1643
                r = send_one_fd(pair[1], fd, 0);
15✔
1644
                if (r < 0) {
15✔
1645
                        log_address_error_errno(UNIT(s), address, r, "Failed to send listening socket (%s) to parent: %m");
×
1646
                        _exit(EXIT_FAILURE);
×
1647
                }
1648

1649
                _exit(EXIT_SUCCESS);
15✔
1650
        }
1651

1652
        pair[1] = safe_close(pair[1]);
×
1653
        fd = receive_one_fd(pair[0], 0);
×
1654

1655
        /* We synchronously wait for the helper, as it shouldn't be slow */
1656
        r = wait_for_terminate_and_check("(sd-listen)", pid.pid, WAIT_LOG_ABNORMAL);
×
1657
        if (r < 0) {
×
1658
                safe_close(fd);
×
1659
                return r;
1660
        }
1661

1662
        if (fd < 0)
×
1663
                return log_address_error_errno(UNIT(s), address, fd, "Failed to receive listening socket (%s): %m");
×
1664

1665
        return fd;
1666
}
1667

1668
static int socket_open_fds(Socket *orig_s) {
3,327✔
1669
        _cleanup_(socket_close_fdsp) Socket *s = orig_s;
3,327✔
1670
        _cleanup_freecon_ char *label = NULL;
3,327✔
1671
        bool know_label = false;
3,327✔
1672
        int r;
3,327✔
1673

1674
        assert(s);
3,327✔
1675

1676
        LIST_FOREACH(port, p, s->ports) {
3,327✔
1677

1678
                if (p->fd >= 0)
3,628✔
1679
                        continue;
×
1680

1681
                switch (p->type) {
3,628✔
1682

1683
                case SOCKET_SOCKET:
3,543✔
1684

1685
                        if (!know_label) {
3,543✔
1686
                                /* Figure out the label, if we don't it know yet. We do it once for the first
1687
                                 * socket where we need this and remember it for the rest. */
1688

1689
                                r = socket_determine_selinux_label(s, &label);
3,281✔
1690
                                if (r < 0)
3,281✔
1691
                                        return log_unit_error_errno(UNIT(s), r, "Failed to determine SELinux label: %m");
×
1692

1693
                                know_label = true;
1694
                        }
1695

1696
                        /* Apply the socket protocol */
1697
                        switch (p->address.type) {
3,543✔
1698

1699
                        case SOCK_STREAM:
3,339✔
1700
                                if (IN_SET(s->socket_protocol, IPPROTO_SCTP, IPPROTO_MPTCP))
3,339✔
1701
                                        p->address.protocol = s->socket_protocol;
×
1702
                                break;
1703

1704
                        case SOCK_SEQPACKET:
59✔
1705
                                if (s->socket_protocol == IPPROTO_SCTP)
59✔
1706
                                        p->address.protocol = s->socket_protocol;
×
1707
                                break;
1708

1709
                        case SOCK_DGRAM:
72✔
1710
                                if (s->socket_protocol == IPPROTO_UDPLITE)
72✔
1711
                                        p->address.protocol = s->socket_protocol;
×
1712
                                break;
1713
                        }
1714

1715
                        p->fd = socket_address_listen_in_cgroup(s, &p->address, label);
3,543✔
1716
                        if (p->fd < 0)
3,543✔
1717
                                return p->fd;
1718

1719
                        socket_apply_socket_options(s, p, p->fd);
3,543✔
1720
                        socket_symlink(s);
3,543✔
1721
                        break;
1722

1723
                case SOCKET_SPECIAL:
6✔
1724

1725
                        p->fd = special_address_create(p->path, s->writable);
6✔
1726
                        if (p->fd < 0)
6✔
1727
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open special file '%s': %m", p->path);
×
1728
                        break;
1729

1730
                case SOCKET_FIFO:
79✔
1731

1732
                        p->fd = fifo_address_create(
158✔
1733
                                        p->path,
79✔
1734
                                        s->directory_mode,
1735
                                        s->socket_mode);
1736
                        if (p->fd < 0)
79✔
1737
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open FIFO '%s': %m", p->path);
×
1738

1739
                        socket_apply_fifo_options(s, p->fd);
79✔
1740
                        socket_symlink(s);
79✔
1741
                        break;
1742

1743
                case SOCKET_MQUEUE:
×
1744

1745
                        p->fd = mq_address_create(
×
1746
                                        p->path,
×
1747
                                        s->socket_mode,
1748
                                        s->mq_maxmsg,
1749
                                        s->mq_msgsize);
1750
                        if (p->fd < 0)
×
1751
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open message queue '%s': %m", p->path);
×
1752
                        break;
1753

1754
                case SOCKET_USB_FUNCTION: {
×
1755
                        _cleanup_close_ int dfd = -EBADF;
6,955✔
1756

1757
                        dfd = open(p->path, O_DIRECTORY|O_CLOEXEC);
×
1758
                        if (dfd < 0)
×
1759
                                return log_unit_error_errno(UNIT(s), errno,
×
1760
                                                            "Failed to open USB FunctionFS dir '%s': %m", p->path);
1761

1762
                        p->fd = usbffs_address_create_at(dfd, "ep0");
×
1763
                        if (p->fd < 0)
×
1764
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open USB FunctionFS ep0: %m");
×
1765

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

1770
                        r = usbffs_dispatch_eps(p, dfd);
×
1771
                        if (r < 0)
×
1772
                                return log_unit_error_errno(UNIT(s), r, "Failed to dispatch USB FunctionFS eps: %m");
×
1773

1774
                        break;
×
1775
                }
1776

1777
                default:
×
1778
                        assert_not_reached();
×
1779
                }
1780
        }
1781

1782
        TAKE_PTR(s);
1783
        return 0;
1784
}
1785

1786
static void socket_unwatch_fds(Socket *s) {
8,751✔
1787
        int r;
8,751✔
1788

1789
        assert(s);
8,751✔
1790

1791
        LIST_FOREACH(port, p, s->ports) {
18,222✔
1792
                if (p->fd < 0)
9,471✔
1793
                        continue;
3,628✔
1794

1795
                r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
5,843✔
1796
                if (r < 0)
5,843✔
1797
                        log_unit_debug_errno(UNIT(s), r, "Failed to disable event source: %m");
×
1798
        }
1799
}
8,751✔
1800

1801
static int socket_watch_fds(Socket *s) {
4,924✔
1802
        int r;
4,924✔
1803

1804
        assert(s);
4,924✔
1805

1806
        LIST_FOREACH(port, p, s->ports) {
10,251✔
1807
                if (p->fd < 0)
5,327✔
1808
                        continue;
×
1809

1810
                if (p->event_source) {
5,327✔
1811
                        r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
823✔
1812
                        if (r < 0)
823✔
1813
                                goto fail;
×
1814
                } else {
1815
                        r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
4,504✔
1816
                        if (r < 0)
4,504✔
1817
                                goto fail;
×
1818

1819
                        (void) sd_event_source_set_description(p->event_source, "socket-port-io");
4,504✔
1820
                }
1821

1822
                r = sd_event_source_set_ratelimit(p->event_source, s->poll_limit.interval, s->poll_limit.burst);
5,327✔
1823
                if (r < 0)
5,327✔
1824
                        log_unit_debug_errno(UNIT(s), r, "Failed to set poll limit on I/O event source, ignoring: %m");
×
1825
        }
1826

1827
        return 0;
1828

1829
fail:
×
1830
        log_unit_warning_errno(UNIT(s), r, "Failed to watch listening fds: %m");
×
1831
        socket_unwatch_fds(s);
×
1832
        return r;
×
1833
}
1834

1835
enum {
1836
        SOCKET_OPEN_NONE,
1837
        SOCKET_OPEN_SOME,
1838
        SOCKET_OPEN_ALL,
1839
};
1840

1841
static int socket_check_open(Socket *s) {
1,338✔
1842
        bool have_open = false, have_closed = false;
1,338✔
1843

1844
        assert(s);
1,338✔
1845

1846
        LIST_FOREACH(port, p, s->ports) {
2,817✔
1847
                if (p->fd < 0)
1,479✔
1848
                        have_closed = true;
1849
                else
1850
                        have_open = true;
1,479✔
1851

1852
                if (have_open && have_closed)
1,479✔
1853
                        return SOCKET_OPEN_SOME;
1854
        }
1855

1856
        if (have_open)
1,338✔
1857
                return SOCKET_OPEN_ALL;
1,338✔
1858

1859
        return SOCKET_OPEN_NONE;
1860
}
1861

1862
static void socket_set_state(Socket *s, SocketState state) {
13,675✔
1863
        SocketState old_state;
13,675✔
1864

1865
        assert(s);
13,675✔
1866

1867
        if (s->state != state)
13,675✔
1868
                bus_unit_send_pending_change_signal(UNIT(s), false);
12,060✔
1869

1870
        old_state = s->state;
13,675✔
1871
        s->state = state;
13,675✔
1872

1873
        if (!SOCKET_STATE_WITH_PROCESS(state) && state != SOCKET_DEFERRED)
13,675✔
1874
                s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
13,473✔
1875

1876
        if (!SOCKET_STATE_WITH_PROCESS(state)) {
13,675✔
1877
                socket_unwatch_control_pid(s);
13,473✔
1878
                s->control_command = NULL;
13,473✔
1879
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
13,473✔
1880
        }
1881

1882
        if (state != SOCKET_LISTENING)
13,675✔
1883
                socket_unwatch_fds(s);
8,751✔
1884

1885
        if (!IN_SET(state,
8,751✔
1886
                    SOCKET_START_OPEN,
1887
                    SOCKET_START_CHOWN,
1888
                    SOCKET_START_POST,
1889
                    SOCKET_LISTENING,
1890
                    SOCKET_DEFERRED,
1891
                    SOCKET_RUNNING,
1892
                    SOCKET_STOP_PRE,
1893
                    SOCKET_STOP_PRE_SIGTERM,
1894
                    SOCKET_STOP_PRE_SIGKILL))
1895
                socket_close_fds(s);
2,800✔
1896

1897
        if (state != SOCKET_DEFERRED)
13,675✔
1898
                unit_remove_from_stop_notify_queue(UNIT(s));
13,675✔
1899

1900
        if (state != old_state)
13,675✔
1901
                log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state));
12,060✔
1902

1903
        unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], /* reload_success = */ true);
13,675✔
1904
}
13,675✔
1905

1906
static int socket_coldplug(Unit *u) {
3,324✔
1907
        Socket *s = ASSERT_PTR(SOCKET(u));
3,324✔
1908
        int r;
3,324✔
1909

1910
        assert(s->state == SOCKET_DEAD);
3,324✔
1911

1912
        if (s->deserialized_state == s->state)
3,324✔
1913
                return 0;
1914

1915
        /* Patch "deferred" back to "listening" and let socket_enter_running() figure out what to do.
1916
         * This saves us the trouble of handling flipping of DeferTrigger= vs Accept= during reload. */
1917
        if (s->deserialized_state == SOCKET_DEFERRED)
1,338✔
1918
                s->deserialized_state = SOCKET_LISTENING;
×
1919

1920
        if (pidref_is_set(&s->control_pid) &&
1,338✔
1921
            pidref_is_unwaited(&s->control_pid) > 0 &&
×
1922
            SOCKET_STATE_WITH_PROCESS(s->deserialized_state)) {
×
1923

1924
                r = unit_watch_pidref(UNIT(s), &s->control_pid, /* exclusive= */ false);
×
1925
                if (r < 0)
×
1926
                        return r;
1927

1928
                r = socket_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec));
×
1929
                if (r < 0)
×
1930
                        return r;
1931
        }
1932

1933
        if (IN_SET(s->deserialized_state,
1,338✔
1934
                   SOCKET_START_OPEN,
1935
                   SOCKET_START_CHOWN,
1936
                   SOCKET_START_POST,
1937
                   SOCKET_LISTENING,
1938
                   SOCKET_RUNNING)) {
1939

1940
                /* Originally, we used to simply reopen all sockets here that we didn't have file descriptors
1941
                 * for. However, this is problematic, as we won't traverse through the SOCKET_START_CHOWN
1942
                 * state for them, and thus the UID/GID wouldn't be right. Hence, instead simply check if we
1943
                 * have all fds open, and if there's a mismatch, warn loudly.
1944
                 *
1945
                 * Note that SOCKET_START_OPEN requires no special treatment, as it's only intermediate
1946
                 * between SOCKET_START_PRE and SOCKET_START_CHOWN and shall otherwise not be observed.
1947
                 * It's listed only for consistency. */
1948

1949
                r = socket_check_open(s);
1,338✔
1950
                if (r == SOCKET_OPEN_NONE)
1,338✔
1951
                        log_unit_warning(UNIT(s),
×
1952
                                         "Unit configuration changed while unit was running, "
1953
                                         "and no socket file descriptors are open. "
1954
                                         "Unit not functional until restarted.");
1955
                else if (r == SOCKET_OPEN_SOME)
1,338✔
1956
                        log_unit_warning(UNIT(s),
×
1957
                                         "Unit configuration changed while unit was running, "
1958
                                         "and some socket file descriptors have not been opened yet. "
1959
                                         "Unit not fully functional until restarted.");
1960
        }
1961

1962
        if (s->deserialized_state == SOCKET_LISTENING) {
1,338✔
1963
                r = socket_watch_fds(s);
764✔
1964
                if (r < 0)
764✔
1965
                        return r;
1966
        }
1967

1968
        if (!IN_SET(s->deserialized_state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_CLEANING))
1,338✔
1969
                (void) unit_setup_exec_runtime(u);
1,338✔
1970

1971
        socket_set_state(s, s->deserialized_state);
1,338✔
1972
        return 0;
1,338✔
1973
}
1974

1975
static int socket_spawn(Socket *s, ExecCommand *c, PidRef *ret_pid) {
202✔
1976
        _cleanup_(exec_params_shallow_clear) ExecParameters exec_params = EXEC_PARAMETERS_INIT(
202✔
1977
                        EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN);
1978
        _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
202✔
1979
        int r;
202✔
1980

1981
        assert(s);
202✔
1982
        assert(c);
202✔
1983
        assert(ret_pid);
202✔
1984

1985
        r = unit_prepare_exec(UNIT(s));
202✔
1986
        if (r < 0)
202✔
1987
                return r;
1988

1989
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
202✔
1990
        if (r < 0)
202✔
1991
                return r;
1992

1993
        r = unit_set_exec_params(UNIT(s), &exec_params);
202✔
1994
        if (r < 0)
202✔
1995
                return r;
1996

1997
        /* Note that ExecStartPre= command doesn't inherit any FDs. It runs before we open listen FDs. */
1998
        if (s->pass_fds_to_exec) {
202✔
1999
                _cleanup_strv_free_ char **fd_names = NULL;
×
2000
                _cleanup_free_ int *fds = NULL;
×
2001
                int n_fds;
×
2002

2003
                n_fds = socket_collect_fds(s, &fds);
×
2004
                if (n_fds < 0)
×
2005
                        return n_fds;
2006

2007
                r = strv_extend_n(&fd_names, socket_fdname(s), n_fds);
×
2008
                if (r < 0)
×
2009
                        return r;
2010

2011
                exec_params.fds = TAKE_PTR(fds);
×
2012
                exec_params.fd_names = TAKE_PTR(fd_names);
×
2013
                exec_params.n_socket_fds = n_fds;
×
2014
        }
2015

2016
        r = exec_spawn(UNIT(s),
202✔
2017
                       c,
2018
                       &s->exec_context,
202✔
2019
                       &exec_params,
2020
                       s->exec_runtime,
2021
                       &s->cgroup_context,
202✔
2022
                       &pidref);
2023
        if (r < 0)
202✔
2024
                return r;
2025

2026
        r = unit_watch_pidref(UNIT(s), &pidref, /* exclusive= */ true);
202✔
2027
        if (r < 0)
202✔
2028
                return r;
2029

2030
        *ret_pid = TAKE_PIDREF(pidref);
202✔
2031
        return 0;
202✔
2032
}
2033

2034
static int socket_chown(Socket *s, PidRef *ret_pid) {
×
2035
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
2036
        int r;
×
2037

2038
        assert(s);
×
2039

2040
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
2041
        if (r < 0)
×
2042
                return r;
2043

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

2047
        r = unit_fork_helper_process(UNIT(s), "(sd-chown)", /* into_cgroup= */ true, &pid);
×
2048
        if (r < 0)
3✔
2049
                return r;
2050
        if (r == 0) {
3✔
2051
                uid_t uid = UID_INVALID;
3✔
2052
                gid_t gid = GID_INVALID;
3✔
2053

2054
                /* Child */
2055

2056
                if (!isempty(s->user)) {
3✔
2057
                        const char *user = s->user;
1✔
2058

2059
                        r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0);
1✔
2060
                        if (r < 0) {
1✔
2061
                                log_unit_error_errno(UNIT(s), r,
×
2062
                                                     "Failed to resolve user '%s': %s",
2063
                                                     user, STRERROR_USER(r));
2064
                                _exit(EXIT_USER);
×
2065
                        }
2066
                }
2067

2068
                if (!isempty(s->group)) {
3✔
2069
                        const char *group = s->group;
3✔
2070

2071
                        r = get_group_creds(&group, &gid, 0);
3✔
2072
                        if (r < 0) {
3✔
2073
                                log_unit_error_errno(UNIT(s), r,
×
2074
                                                     "Failed to resolve group '%s': %s",
2075
                                                     group, STRERROR_GROUP(r));
2076
                                _exit(EXIT_GROUP);
×
2077
                        }
2078
                }
2079

2080
                LIST_FOREACH(port, p, s->ports) {
6✔
2081
                        const char *path = NULL;
3✔
2082

2083
                        if (p->type == SOCKET_SOCKET)
3✔
2084
                                path = socket_address_get_path(&p->address);
2✔
2085
                        else if (p->type == SOCKET_FIFO)
1✔
2086
                                path = p->path;
×
2087
                        else if (p->type == SOCKET_MQUEUE) {
1✔
2088
                                /* Use fchown on the fd since /dev/mqueue might not be mounted. */
2089
                                if (fchown(p->fd, uid, gid) < 0) {
1✔
2090
                                        log_unit_error_errno(UNIT(s), errno, "Failed to fchown(): %m");
×
2091
                                        _exit(EXIT_CHOWN);
×
2092
                                }
2093
                                continue;
1✔
2094
                        }
2095

2096
                        if (!path)
2✔
2097
                                continue;
×
2098

2099
                        if (chown(path, uid, gid) < 0) {
2✔
2100
                                log_unit_error_errno(UNIT(s), errno, "Failed to chown(): %m");
×
2101
                                _exit(EXIT_CHOWN);
×
2102
                        }
2103
                }
2104

2105
                _exit(EXIT_SUCCESS);
3✔
2106
        }
2107

2108
        r = unit_watch_pidref(UNIT(s), &pid, /* exclusive= */ true);
×
2109
        if (r < 0)
×
2110
                return r;
2111

2112
        *ret_pid = TAKE_PIDREF(pid);
×
2113
        return 0;
×
2114
}
2115

2116
static void socket_enter_dead(Socket *s, SocketResult f) {
2,800✔
2117
        assert(s);
2,800✔
2118

2119
        if (s->result == SOCKET_SUCCESS)
2,800✔
2120
                s->result = f;
2,800✔
2121

2122
        if (s->result == SOCKET_SUCCESS)
2,800✔
2123
                unit_log_success(UNIT(s));
2,800✔
2124
        else
2125
                unit_log_failure(UNIT(s), socket_result_to_string(s->result));
×
2126

2127
        unit_warn_leftover_processes(UNIT(s), /* start = */ false);
2,800✔
2128

2129
        socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
5,600✔
2130

2131
        s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
2,800✔
2132

2133
        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
2,800✔
2134

2135
        unit_unref_uid_gid(UNIT(s), true);
2,800✔
2136
}
2,800✔
2137

2138
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
2139

2140
static void socket_enter_stop_post(Socket *s, SocketResult f) {
2,800✔
2141
        int r;
2,800✔
2142

2143
        assert(s);
2,800✔
2144

2145
        if (s->result == SOCKET_SUCCESS)
2,800✔
2146
                s->result = f;
2,800✔
2147

2148
        socket_unwatch_control_pid(s);
2,800✔
2149
        s->control_command_id = SOCKET_EXEC_STOP_POST;
2,800✔
2150
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST];
2,800✔
2151

2152
        if (s->control_command) {
2,800✔
2153
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2154
                if (r < 0) {
×
2155
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-post' task: %m");
×
2156
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2157
                        return;
×
2158
                }
2159

2160
                socket_set_state(s, SOCKET_STOP_POST);
×
2161
        } else
2162
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
2,800✔
2163
}
2164

2165
static int state_to_kill_operation(Socket *s, SocketState state) {
5,600✔
2166
        assert(s);
5,600✔
2167

2168
        if (state == SOCKET_STOP_PRE_SIGTERM)
5,600✔
2169
                return unit_has_job_type(UNIT(s), JOB_RESTART) ? KILL_RESTART : KILL_TERMINATE;
×
2170

2171
        if (state == SOCKET_FINAL_SIGTERM)
5,600✔
2172
                return KILL_TERMINATE;
2,800✔
2173

2174
        return KILL_KILL;
2175
}
2176

2177
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
5,600✔
2178
        int r;
5,600✔
2179

2180
        assert(s);
5,600✔
2181

2182
        if (s->result == SOCKET_SUCCESS)
5,600✔
2183
                s->result = f;
5,600✔
2184

2185
        r = unit_kill_context(UNIT(s), state_to_kill_operation(s, state));
5,600✔
2186
        if (r < 0) {
5,600✔
2187
                log_unit_warning_errno(UNIT(s), r, "Failed to kill processes: %m");
×
2188
                goto fail;
×
2189
        }
2190
        if (r > 0) {
5,600✔
2191
                r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
2192
                if (r < 0) {
×
2193
                        log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2194
                        goto fail;
×
2195
                }
2196

2197
                socket_set_state(s, state);
×
2198
        } else if (state == SOCKET_STOP_PRE_SIGTERM)
5,600✔
2199
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
×
2200
        else if (state == SOCKET_STOP_PRE_SIGKILL)
5,600✔
2201
                socket_enter_stop_post(s, SOCKET_SUCCESS);
×
2202
        else if (state == SOCKET_FINAL_SIGTERM)
5,600✔
2203
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
2,800✔
2204
        else
2205
                socket_enter_dead(s, SOCKET_SUCCESS);
2,800✔
2206

2207
        return;
2208

2209
fail:
×
2210
        if (IN_SET(state, SOCKET_STOP_PRE_SIGTERM, SOCKET_STOP_PRE_SIGKILL))
×
2211
                socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2212
        else
2213
                socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2214
}
2215

2216
static void socket_enter_stop_pre(Socket *s, SocketResult f) {
2,800✔
2217
        int r;
2,800✔
2218

2219
        assert(s);
2,800✔
2220

2221
        if (s->result == SOCKET_SUCCESS)
2,800✔
2222
                s->result = f;
2,800✔
2223

2224
        socket_unwatch_control_pid(s);
2,800✔
2225
        s->control_command_id = SOCKET_EXEC_STOP_PRE;
2,800✔
2226
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE];
2,800✔
2227

2228
        if (s->control_command) {
2,800✔
2229
                r = socket_spawn(s, s->control_command, &s->control_pid);
6✔
2230
                if (r < 0) {
6✔
2231
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-pre' task: %m");
×
2232
                        socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2233
                        return;
×
2234
                }
2235

2236
                socket_set_state(s, SOCKET_STOP_PRE);
6✔
2237
        } else
2238
                socket_enter_stop_post(s, SOCKET_SUCCESS);
2,794✔
2239
}
2240

2241
static void flush_ports(Socket *s) {
1✔
2242
        assert(s);
1✔
2243

2244
        /* Flush all incoming traffic, regardless if actual bytes or new connections, so that this socket isn't busy
2245
         * anymore */
2246

2247
        LIST_FOREACH(port, p, s->ports) {
2✔
2248
                if (p->fd < 0)
1✔
2249
                        continue;
×
2250

2251
                if (p->type == SOCKET_MQUEUE)
1✔
2252
                        (void) flush_mqueue(p->fd);
×
2253
                else {
2254
                        (void) flush_accept(p->fd);
1✔
2255
                        (void) flush_fd(p->fd);
1✔
2256
                }
2257
        }
2258
}
1✔
2259

2260
static void socket_enter_listening(Socket *s) {
4,160✔
2261
        int r;
4,160✔
2262

2263
        assert(s);
4,160✔
2264

2265
        if (!s->accept && s->flush_pending) {
4,160✔
2266
                log_unit_debug(UNIT(s), "Flushing socket before listening.");
×
2267
                flush_ports(s);
×
2268
        }
2269

2270
        r = socket_watch_fds(s);
4,160✔
2271
        if (r < 0) {
4,160✔
2272
                log_unit_warning_errno(UNIT(s), r, "Failed to watch sockets: %m");
×
2273
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2274
                return;
×
2275
        }
2276

2277
        socket_set_state(s, SOCKET_LISTENING);
4,160✔
2278
}
2279

2280
static void socket_enter_start_post(Socket *s) {
3,327✔
2281
        int r;
3,327✔
2282

2283
        assert(s);
3,327✔
2284

2285
        socket_unwatch_control_pid(s);
3,327✔
2286
        s->control_command_id = SOCKET_EXEC_START_POST;
3,327✔
2287
        s->control_command = s->exec_command[SOCKET_EXEC_START_POST];
3,327✔
2288

2289
        if (s->control_command) {
3,327✔
2290
                r = socket_spawn(s, s->control_command, &s->control_pid);
196✔
2291
                if (r < 0) {
196✔
2292
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-post' task: %m");
×
2293
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2294
                        return;
×
2295
                }
2296

2297
                socket_set_state(s, SOCKET_START_POST);
196✔
2298
        } else
2299
                socket_enter_listening(s);
3,131✔
2300
}
2301

2302
static void socket_enter_start_chown(Socket *s) {
3,327✔
2303
        int r;
3,327✔
2304

2305
        assert(s);
3,327✔
2306
        assert(s->state == SOCKET_START_OPEN);
3,327✔
2307

2308
        if (!isempty(s->user) || !isempty(s->group)) {
3,327✔
2309

2310
                socket_unwatch_control_pid(s);
×
2311
                s->control_command_id = SOCKET_EXEC_START_CHOWN;
×
2312
                s->control_command = NULL;
×
2313

2314
                r = socket_chown(s, &s->control_pid);
×
2315
                if (r < 0) {
×
2316
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-chown' task: %m");
×
2317
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2318
                        return;
×
2319
                }
2320

2321
                socket_set_state(s, SOCKET_START_CHOWN);
×
2322
        } else
2323
                socket_enter_start_post(s);
3,327✔
2324
}
2325

2326
static void socket_enter_start_open(Socket *s) {
3,327✔
2327
        int r;
3,327✔
2328

2329
        assert(s);
3,327✔
2330
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_START_PRE));
3,327✔
2331

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

2337
        socket_set_state(s, SOCKET_START_OPEN);
3,327✔
2338

2339
        r = socket_open_fds(s);
3,327✔
2340
        if (r < 0) {
3,327✔
2341
                log_unit_error_errno(UNIT(s), r, "Failed to listen on sockets: %m");
×
2342
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2343
                return;
×
2344
        }
2345

2346
        socket_enter_start_chown(s);
3,327✔
2347
}
2348

2349
static void socket_enter_start_pre(Socket *s) {
3,327✔
2350
        int r;
3,327✔
2351

2352
        assert(s);
3,327✔
2353

2354
        socket_unwatch_control_pid(s);
3,327✔
2355

2356
        unit_warn_leftover_processes(UNIT(s), /* start = */ true);
3,327✔
2357

2358
        s->control_command_id = SOCKET_EXEC_START_PRE;
3,327✔
2359
        s->control_command = s->exec_command[SOCKET_EXEC_START_PRE];
3,327✔
2360

2361
        if (s->control_command) {
3,327✔
2362
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2363
                if (r < 0) {
×
2364
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-pre' task: %m");
×
2365
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2366
                        return;
×
2367
                }
2368

2369
                socket_set_state(s, SOCKET_START_PRE);
×
2370
        } else
2371
                socket_enter_start_open(s);
3,327✔
2372
}
2373

UNCOV
2374
static bool socket_may_defer(Socket *s) {
×
UNCOV
2375
        assert(s);
×
2376

UNCOV
2377
        switch (s->defer_trigger) {
×
2378

2379
        case SOCKET_DEFER_NO:
2380
                return false;
2381

2382
        case SOCKET_DEFER_YES:
UNCOV
2383
                return !hashmap_isempty(UNIT(s)->manager->jobs);
×
2384

2385
        case SOCKET_DEFER_PATIENT:
×
2386
                assert(s->defer_trigger_max_usec > 0);
×
2387
                return true;
2388

2389
        default:
×
2390
                assert_not_reached();
×
2391
        }
2392
}
2393

UNCOV
2394
static bool socket_stop_notify(Unit *u) {
×
UNCOV
2395
        Socket *s = ASSERT_PTR(SOCKET(u));
×
UNCOV
2396
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
×
UNCOV
2397
        int r;
×
2398

UNCOV
2399
        assert(s->state == SOCKET_DEFERRED);
×
2400

UNCOV
2401
        r = manager_add_job(u->manager, JOB_START, UNIT_DEREF(s->service), JOB_LENIENT, &error, /* ret = */ NULL);
×
UNCOV
2402
        if (r >= 0) { /* Yay! */
×
2403
                socket_set_state(s, SOCKET_RUNNING);
×
2404
                return true; /* changed */
2405
        }
UNCOV
2406
        if (sd_bus_error_has_name(&error, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE)) {
×
UNCOV
2407
                if (s->defer_trigger == SOCKET_DEFER_PATIENT || !hashmap_isempty(u->manager->jobs))
×
2408
                        /* Wait for some more */
2409
                        return false;
2410

2411
                log_unit_warning_errno(u, r, "Service conflicts with active units even after all jobs have completed, giving up.");
×
2412
        } else
2413
                log_unit_warning_errno(u, r, "Failed to queue service startup job: %s", bus_error_message(&error, r));
×
2414

2415
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2416
        return true; /* changed */
2417
}
2418

UNCOV
2419
static void socket_enter_deferred(Socket *s) {
×
UNCOV
2420
        int r;
×
2421

UNCOV
2422
        assert(s);
×
UNCOV
2423
        assert(socket_may_defer(s));
×
2424

2425
        /* So here's the thing: if there're currently units conflicting with the service we shall be
2426
         * triggering, and the previous transaction is still running (job pool is not empty), let's
2427
         * defer the activation a bit, and recheck upon any unit stop. IOW, the trigger in question
2428
         * becomes bound to the conflicting dependency, and not the socket IO because we never process them.
2429
         * Put a safety net around all this though, i.e. give up if the service still can't be started
2430
         * even after all existing jobs have completed, or DeferTriggerMaxSec= is reached. */
2431

UNCOV
2432
        r = socket_arm_timer(s, /* relative = */ true, s->defer_trigger_max_usec);
×
UNCOV
2433
        if (r < 0) {
×
2434
                log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2435
                return socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2436
        }
2437

UNCOV
2438
        unit_add_to_stop_notify_queue(UNIT(s));
×
2439

2440
        /* Disable IO event sources */
UNCOV
2441
        socket_set_state(s, SOCKET_DEFERRED);
×
2442
}
2443

2444
static void socket_enter_running(Socket *s, int cfd_in) {
298✔
2445
        /* Note that this call takes possession of the connection fd passed. It either has to assign it
2446
         * somewhere or close it. */
2447
        _cleanup_close_ int cfd = cfd_in;
298✔
2448
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
298✔
2449
        int r;
298✔
2450

2451
        assert(s);
298✔
2452

2453
        /* We don't take connections anymore if we are supposed to shut down anyway */
2454
        if (unit_stop_pending(UNIT(s))) {
298✔
2455

2456
                log_unit_debug(UNIT(s), "Suppressing connection request since unit stop is scheduled.");
1✔
2457

2458
                if (cfd >= 0)
1✔
2459
                        goto refuse;
×
2460

2461
                flush_ports(s);
1✔
2462
                return;
2463
        }
2464

2465
        if (s->state == SOCKET_DEFERRED) {
297✔
2466
                assert(cfd < 0);
×
2467
                return;
2468
        }
2469

2470
        if (!ratelimit_below(&s->trigger_limit)) {
297✔
2471
                log_unit_warning(UNIT(s), "Trigger limit hit, refusing further activation.");
×
2472
                socket_enter_stop_pre(s, SOCKET_FAILURE_TRIGGER_LIMIT_HIT);
×
2473
                goto refuse;
×
2474
        }
2475

2476
        if (cfd < 0) { /* Accept=no case */
297✔
2477
                bool pending = false;
205✔
2478
                Unit *other;
205✔
2479

2480
                /* If there's already a start pending don't bother to do anything */
2481
                UNIT_FOREACH_DEPENDENCY(other, UNIT(s), UNIT_ATOM_TRIGGERS)
711✔
2482
                        if (unit_active_or_pending(other)) {
205✔
2483
                                pending = true;
2484
                                break;
2485
                        }
2486

2487
                if (!pending) {
205✔
2488
                        if (!UNIT_ISSET(s->service)) {
96✔
2489
                                log_unit_warning(UNIT(s),
×
2490
                                                 "Service to activate vanished, refusing activation.");
2491
                                goto fail;
×
2492
                        }
2493

2494
                        if (s->defer_trigger != SOCKET_DEFER_NO) {
96✔
UNCOV
2495
                                r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_LENIENT, &error, /* ret = */ NULL);
×
UNCOV
2496
                                if (r < 0 && sd_bus_error_has_name(&error, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE) && socket_may_defer(s))
×
2497
                                        /* We only check BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE here, not
2498
                                         * BUS_ERROR_TRANSACTION_JOBS_CONFLICTING or BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC,
2499
                                         * since those are errors in a single transaction, which are most likely
2500
                                         * caused by dependency issues in the unit configuration.
2501
                                         * Deferring activation probably won't help. */
UNCOV
2502
                                        return socket_enter_deferred(s);
×
2503
                        } else
2504
                                r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, /* ret = */ NULL);
96✔
2505
                        if (r < 0)
96✔
2506
                                goto queue_error;
×
2507
                }
2508

2509
                socket_set_state(s, SOCKET_RUNNING);
205✔
2510
        } else { /* Accept=yes case */
2511
                _cleanup_(socket_peer_unrefp) SocketPeer *p = NULL;
92✔
2512
                Unit *service;
92✔
2513

2514
                if (s->n_connections >= s->max_connections) {
92✔
2515
                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), dropping connection.",
×
2516
                                         s->n_connections);
2517
                        goto refuse;
×
2518
                }
2519

2520
                if (s->max_connections_per_source > 0) {
92✔
2521
                        r = socket_acquire_peer(s, cfd, &p);
89✔
2522
                        if (ERRNO_IS_NEG_DISCONNECT(r))
89✔
2523
                                return;
2524
                        if (r < 0)
89✔
2525
                                /* We didn't have enough resources to acquire peer information, let's fail. */
2526
                                goto fail;
×
2527
                        if (r > 0 && p->n_ref > s->max_connections_per_source) {
89✔
2528
                                _cleanup_free_ char *t = NULL;
×
2529

2530
                                if (p->peer.sa.sa_family == AF_UNIX)
×
2531
                                        (void) asprintf(&t, "UID " UID_FMT, p->peer_cred.uid);
×
2532
                                else
2533
                                        (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, /* translate_ipv6= */ true, /* include_port= */ false, &t);
×
2534

2535
                                log_unit_warning(UNIT(s),
×
2536
                                                 "Too many incoming connections (%u) from source %s, dropping connection.",
2537
                                                 p->n_ref, strnull(t));
2538
                                goto refuse;
×
2539
                        }
2540
                }
2541

2542
                r = socket_load_service_unit(s, cfd, &service);
92✔
2543
                if (ERRNO_IS_NEG_DISCONNECT(r))
92✔
2544
                        return;
2545
                if (r < 0 || UNIT_IS_LOAD_ERROR(service->load_state)) {
92✔
2546
                        log_unit_warning_errno(UNIT(s), r < 0 ? r : service->load_error,
×
2547
                                               "Failed to load connection service unit: %m");
2548
                        goto fail;
×
2549
                }
2550
                if (service->load_state == UNIT_MASKED) {
92✔
2551
                        log_unit_warning(UNIT(s), "Connection service unit is masked, refusing.");
×
2552
                        goto fail;
×
2553
                }
2554

2555
                s->n_accepted++;
92✔
2556

2557
                r = service_set_socket_fd(SERVICE(service), cfd, s, p, s->selinux_context_from_net);
184✔
2558
                if (ERRNO_IS_NEG_DISCONNECT(r))
92✔
2559
                        return;
2560
                if (r < 0) {
92✔
2561
                        log_unit_warning_errno(UNIT(s), r, "Failed to set socket on service: %m");
×
2562
                        goto fail;
×
2563
                }
2564

2565
                /* We passed ownership of the fd and socket peer to the service now. */
2566
                TAKE_FD(cfd);
92✔
2567
                TAKE_PTR(p);
92✔
2568

2569
                s->n_connections++;
92✔
2570

2571
                r = manager_add_job(UNIT(s)->manager, JOB_START, service, JOB_REPLACE, &error, /* ret = */ NULL);
92✔
2572
                if (r < 0) {
92✔
2573
                        /* We failed to activate the new service, but it still exists. Let's make sure the
2574
                         * service closes and forgets the connection fd again, immediately. */
2575
                        service_release_socket_fd(SERVICE(service));
×
2576
                        goto queue_error;
×
2577
                }
2578

2579
                /* Notify clients about changed counters */
2580
                unit_add_to_dbus_queue(UNIT(s));
92✔
2581
        }
2582

2583
        return;
2584

2585
refuse:
×
2586
        s->n_refused++;
×
2587
        return;
×
2588

2589
queue_error:
×
2590
        log_unit_warning_errno(UNIT(s), r, "Failed to queue service startup job%s: %s",
×
2591
                               cfd >= 0 && !ERRNO_IS_RESOURCE(r) ? " (Maybe the service is missing or is a template unit?)" : "",
2592
                               bus_error_message(&error, r));
2593

2594
fail:
×
2595
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2596
}
2597

2598
static void socket_run_next(Socket *s) {
×
2599
        int r;
×
2600

2601
        assert(s);
×
2602
        assert(s->control_command);
×
2603
        assert(s->control_command->command_next);
×
2604

2605
        socket_unwatch_control_pid(s);
×
2606

2607
        s->control_command = s->control_command->command_next;
×
2608

2609
        r = socket_spawn(s, s->control_command, &s->control_pid);
×
2610
        if (r < 0) {
×
2611
                log_unit_warning_errno(UNIT(s), r, "Failed to spawn next task: %m");
×
2612

2613
                if (s->state == SOCKET_START_POST)
×
2614
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2615
                else if (s->state == SOCKET_STOP_POST)
×
2616
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2617
                else
2618
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2619
        }
2620
}
×
2621

2622
static int socket_start(Unit *u) {
3,327✔
2623
        Socket *s = ASSERT_PTR(SOCKET(u));
3,327✔
2624
        int r;
3,327✔
2625

2626
        /* Cannot run this without the service being around */
2627
        if (UNIT_ISSET(s->service)) {
3,327✔
2628
                Service *service = ASSERT_PTR(SERVICE(UNIT_DEREF(s->service)));
2,752✔
2629

2630
                if (UNIT(service)->load_state != UNIT_LOADED)
2,752✔
2631
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
×
2632
                                                    "Socket service %s not loaded, refusing.", UNIT(service)->id);
2633

2634
                /* If the service is already active we cannot start the socket */
2635
                if (SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ false))
2,752✔
2636
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY),
×
2637
                                                    "Socket service %s already active, refusing.", UNIT(service)->id);
2638
        }
2639

2640
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
3,327✔
2641

2642
        r = unit_acquire_invocation_id(u);
3,327✔
2643
        if (r < 0)
3,327✔
2644
                return r;
2645

2646
        s->result = SOCKET_SUCCESS;
3,327✔
2647
        exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
3,327✔
2648

2649
        if (s->cgroup_runtime)
3,327✔
2650
                s->cgroup_runtime->reset_accounting = true;
×
2651

2652
        socket_enter_start_pre(s);
3,327✔
2653
        return 1;
3,327✔
2654
}
2655

2656
static int socket_stop(Unit *u) {
2,800✔
2657
        Socket *s = ASSERT_PTR(SOCKET(u));
2,800✔
2658

2659
        /* Already on it */
2660
        if (IN_SET(s->state,
2,800✔
2661
                   SOCKET_STOP_PRE,
2662
                   SOCKET_STOP_PRE_SIGTERM,
2663
                   SOCKET_STOP_PRE_SIGKILL,
2664
                   SOCKET_STOP_POST,
2665
                   SOCKET_FINAL_SIGTERM,
2666
                   SOCKET_FINAL_SIGKILL))
2667
                return 0;
2668

2669
        /* If there's already something running we go directly into
2670
         * kill mode. */
2671
        if (IN_SET(s->state,
2,800✔
2672
                   SOCKET_START_PRE,
2673
                   SOCKET_START_OPEN,
2674
                   SOCKET_START_CHOWN,
2675
                   SOCKET_START_POST)) {
2676
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
×
2677
                return -EAGAIN;
×
2678
        }
2679

2680
        /* If we are currently cleaning, then abort it, brutally. */
2681
        if (s->state == SOCKET_CLEANING) {
2,800✔
2682
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
×
2683
                return 0;
×
2684
        }
2685

2686
        assert(IN_SET(s->state, SOCKET_LISTENING, SOCKET_DEFERRED, SOCKET_RUNNING));
2,800✔
2687

2688
        socket_enter_stop_pre(s, SOCKET_SUCCESS);
2,800✔
2689
        return 1;
2,800✔
2690
}
2691

2692
static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
2,658✔
2693
        Socket *s = ASSERT_PTR(SOCKET(u));
2,658✔
2694
        int r;
2,658✔
2695

2696
        assert(f);
2,658✔
2697
        assert(fds);
2,658✔
2698

2699
        (void) serialize_item(f, "state", socket_state_to_string(s->state));
2,658✔
2700
        (void) serialize_item(f, "result", socket_result_to_string(s->result));
2,658✔
2701
        (void) serialize_item_format(f, "n-accepted", "%u", s->n_accepted);
2,658✔
2702
        (void) serialize_item_format(f, "n-refused", "%u", s->n_refused);
2,658✔
2703
        (void) serialize_pidref(f, fds, "control-pid", &s->control_pid);
2,658✔
2704

2705
        if (s->control_command_id >= 0)
2,658✔
2706
                (void) serialize_item(f, "control-command", socket_exec_command_to_string(s->control_command_id));
×
2707

2708
        LIST_FOREACH(port, p, s->ports) {
5,520✔
2709
                int copy;
2,862✔
2710

2711
                if (p->fd < 0)
2,862✔
2712
                        continue;
998✔
2713

2714
                copy = fdset_put_dup(fds, p->fd);
1,864✔
2715
                if (copy < 0)
1,864✔
2716
                        return log_unit_warning_errno(u, copy, "Failed to serialize socket fd: %m");
×
2717

2718
                if (p->type == SOCKET_SOCKET) {
1,864✔
2719
                        _cleanup_free_ char *t = NULL;
1,734✔
2720

2721
                        r = socket_address_print(&p->address, &t);
1,734✔
2722
                        if (r < 0)
1,734✔
2723
                                return log_unit_error_errno(u, r, "Failed to format socket address: %m");
×
2724

2725
                        if (socket_address_family(&p->address) == AF_NETLINK)
1,734✔
2726
                                (void) serialize_item_format(f, "netlink", "%i %s", copy, t);
114✔
2727
                        else
2728
                                (void) serialize_item_format(f, "socket", "%i %i %s", copy, p->address.type, t);
1,620✔
2729
                } else if (p->type == SOCKET_SPECIAL)
130✔
2730
                        (void) serialize_item_format(f, "special", "%i %s", copy, p->path);
18✔
2731
                else if (p->type == SOCKET_MQUEUE)
112✔
2732
                        (void) serialize_item_format(f, "mqueue", "%i %s", copy, p->path);
×
2733
                else if (p->type == SOCKET_USB_FUNCTION)
112✔
2734
                        (void) serialize_item_format(f, "ffs", "%i %s", copy, p->path);
×
2735
                else {
2736
                        assert(p->type == SOCKET_FIFO);
112✔
2737
                        (void) serialize_item_format(f, "fifo", "%i %s", copy, p->path);
112✔
2738
                }
2739
        }
2740

2741
        (void) serialize_ratelimit(f, "trigger-ratelimit", &s->trigger_limit);
2,658✔
2742

2743
        return 0;
2,658✔
2744
}
2745

2746
static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
11,379✔
2747
        Socket *s = ASSERT_PTR(SOCKET(u));
11,379✔
2748
        int r;
11,379✔
2749

2750
        assert(key);
11,379✔
2751
        assert(value);
11,379✔
2752

2753
        if (streq(key, "state")) {
11,379✔
2754
                SocketState state;
1,980✔
2755

2756
                state = socket_state_from_string(value);
1,980✔
2757
                if (state < 0)
1,980✔
2758
                        log_unit_debug(u, "Failed to parse state value: %s", value);
×
2759
                else
2760
                        s->deserialized_state = state;
1,980✔
2761
        } else if (streq(key, "result")) {
9,399✔
2762
                SocketResult f;
1,980✔
2763

2764
                f = socket_result_from_string(value);
1,980✔
2765
                if (f < 0)
1,980✔
2766
                        log_unit_debug(u, "Failed to parse result value: %s", value);
×
2767
                else if (f != SOCKET_SUCCESS)
1,980✔
2768
                        s->result = f;
×
2769

2770
        } else if (streq(key, "n-accepted")) {
7,419✔
2771
                unsigned k;
1,980✔
2772

2773
                if (safe_atou(value, &k) < 0)
1,980✔
2774
                        log_unit_debug(u, "Failed to parse n-accepted value: %s", value);
×
2775
                else
2776
                        s->n_accepted += k;
1,980✔
2777
        } else if (streq(key, "n-refused")) {
5,439✔
2778
                unsigned k;
1,980✔
2779

2780
                if (safe_atou(value, &k) < 0)
1,980✔
2781
                        log_unit_debug(u, "Failed to parse n-refused value: %s", value);
×
2782
                else
2783
                        s->n_refused += k;
1,980✔
2784
        } else if (streq(key, "control-pid")) {
3,459✔
2785

2786
                if (!pidref_is_set(&s->control_pid))
11,379✔
2787
                        (void) deserialize_pidref(fds, value, &s->control_pid);
×
2788

2789
        } else if (streq(key, "control-command")) {
3,459✔
2790
                SocketExecCommand id;
×
2791

2792
                id = socket_exec_command_from_string(value);
×
2793
                if (id < 0)
×
2794
                        log_unit_debug(u, "Failed to parse exec-command value: %s", value);
×
2795
                else {
2796
                        s->control_command_id = id;
×
2797
                        s->control_command = s->exec_command[id];
×
2798
                }
2799
        } else if (streq(key, "fifo")) {
3,459✔
2800
                _cleanup_free_ char *fdv = NULL;
90✔
2801
                bool found = false;
90✔
2802
                int fd;
90✔
2803

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

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

2816
                LIST_FOREACH(port, p, s->ports)
135✔
2817
                        if (p->fd < 0 &&
135✔
2818
                            p->type == SOCKET_FIFO &&
90✔
2819
                            path_equal_or_inode_same(p->path, value, 0)) {
90✔
2820
                                p->fd = fdset_remove(fds, fd);
90✔
2821
                                found = true;
90✔
2822
                                break;
90✔
2823
                        }
2824
                if (!found)
90✔
2825
                        log_unit_debug(u, "No matching fifo socket found: %s", value);
×
2826

2827
        } else if (streq(key, "special")) {
3,369✔
2828
                _cleanup_free_ char *fdv = NULL;
15✔
2829
                bool found = false;
15✔
2830
                int fd;
15✔
2831

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

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

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

2855
        } else if (streq(key, "mqueue")) {
3,354✔
2856
                _cleanup_free_ char *fdv = NULL;
×
2857
                bool found = false;
×
2858
                int fd;
×
2859

2860
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2861
                if (r <= 0) {
×
2862
                        log_unit_debug(u, "Failed to parse mqueue value: %s", value);
×
2863
                        return 0;
×
2864
                }
2865

2866
                fd = parse_fd(fdv);
×
2867
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2868
                        log_unit_debug(u, "Invalid mqueue value: %s", fdv);
×
2869
                        return 0;
×
2870
                }
2871

2872
                LIST_FOREACH(port, p, s->ports)
×
2873
                        if (p->fd < 0 &&
×
2874
                            p->type == SOCKET_MQUEUE &&
×
2875
                            streq(p->path, value)) {
×
2876
                                p->fd = fdset_remove(fds, fd);
×
2877
                                found = true;
×
2878
                                break;
×
2879
                        }
2880
                if (!found)
×
2881
                        log_unit_debug(u, "No matching mqueue socket found: %s", value);
×
2882

2883
        } else if (streq(key, "socket")) {
3,354✔
2884
                _cleanup_free_ char *fdv = NULL, *typev = NULL;
1,293✔
2885
                bool found = false;
1,293✔
2886
                int fd, type;
1,293✔
2887

2888
                r = extract_first_word(&value, &fdv, NULL, 0);
1,293✔
2889
                if (r <= 0) {
1,293✔
2890
                        log_unit_debug(u, "Failed to parse socket fd from value: %s", value);
×
2891
                        return 0;
×
2892
                }
2893

2894
                fd = parse_fd(fdv);
1,293✔
2895
                if (fd < 0 || !fdset_contains(fds, fd)) {
1,293✔
2896
                        log_unit_debug(u, "Invalid socket fd: %s", fdv);
×
2897
                        return 0;
×
2898
                }
2899

2900
                r = extract_first_word(&value, &typev, NULL, 0);
1,293✔
2901
                if (r <= 0) {
1,293✔
2902
                        log_unit_debug(u, "Failed to parse socket type from value: %s", value);
×
2903
                        return 0;
×
2904
                }
2905

2906
                if (safe_atoi(typev, &type) < 0 || type < 0) {
1,293✔
2907
                        log_unit_debug(u, "Invalid socket type: %s", typev);
×
2908
                        return 0;
×
2909
                }
2910

2911
                LIST_FOREACH(port, p, s->ports)
1,389✔
2912
                        if (p->fd < 0 &&
2,682✔
2913
                            socket_address_is(&p->address, value, type)) {
1,293✔
2914
                                p->fd = fdset_remove(fds, fd);
1,293✔
2915
                                found = true;
1,293✔
2916
                                break;
1,293✔
2917
                        }
2918
                if (!found)
1,293✔
2919
                        log_unit_debug(u, "No matching %s socket found: %s",
×
2920
                                       socket_address_type_to_string(type), value);
2921

2922
        } else if (streq(key, "netlink")) {
2,061✔
2923
                _cleanup_free_ char *fdv = NULL;
81✔
2924
                bool found = false;
81✔
2925
                int fd;
81✔
2926

2927
                r = extract_first_word(&value, &fdv, NULL, 0);
81✔
2928
                if (r <= 0) {
81✔
2929
                        log_unit_debug(u, "Failed to parse socket value: %s", value);
×
2930
                        return 0;
×
2931
                }
2932

2933
                fd = parse_fd(fdv);
81✔
2934
                if (fd < 0 || !fdset_contains(fds, fd)) {
81✔
2935
                        log_unit_debug(u, "Invalid socket value: %s", fdv);
×
2936
                        return 0;
×
2937
                }
2938

2939
                LIST_FOREACH(port, p, s->ports)
81✔
2940
                        if (p->fd < 0 &&
162✔
2941
                            socket_address_is_netlink(&p->address, value)) {
81✔
2942
                                p->fd = fdset_remove(fds, fd);
81✔
2943
                                found = true;
81✔
2944
                                break;
81✔
2945
                        }
2946
                if (!found)
81✔
2947
                        log_unit_debug(u, "No matching netlink socket found: %s", value);
×
2948

2949
        } else if (streq(key, "ffs")) {
1,980✔
2950
                _cleanup_free_ char *fdv = NULL;
×
2951
                bool found = false;
×
2952
                int fd;
×
2953

2954
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2955
                if (r <= 0) {
×
2956
                        log_unit_debug(u, "Failed to parse ffs value: %s", value);
×
2957
                        return 0;
×
2958
                }
2959

2960
                fd = parse_fd(fdv);
×
2961
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2962
                        log_unit_debug(u, "Invalid ffs value: %s", fdv);
×
2963
                        return 0;
×
2964
                }
2965

2966
                LIST_FOREACH(port, p, s->ports)
×
2967
                        if (p->fd < 0 &&
×
2968
                            p->type == SOCKET_USB_FUNCTION &&
×
2969
                            path_equal_or_inode_same(p->path, value, 0)) {
×
2970
                                p->fd = fdset_remove(fds, fd);
×
2971
                                found = true;
×
2972
                                break;
×
2973
                        }
2974
                if (!found)
×
2975
                        log_unit_debug(u, "No matching ffs socket found: %s", value);
×
2976

2977
        } else if (streq(key, "trigger-ratelimit"))
1,980✔
2978
                deserialize_ratelimit(&s->trigger_limit, key, value);
1,980✔
2979
        else
2980
                log_unit_debug(UNIT(s), "Unknown serialization key: %s", key);
×
2981

2982
        return 0;
2983
}
2984

2985
static void socket_distribute_fds(Unit *u, FDSet *fds) {
793✔
2986
        Socket *s = ASSERT_PTR(SOCKET(u));
793✔
2987

2988
        LIST_FOREACH(port, p, s->ports) {
1,644✔
2989
                int fd;
851✔
2990

2991
                if (p->type != SOCKET_SOCKET)
851✔
2992
                        continue;
43✔
2993

2994
                if (p->fd >= 0)
808✔
2995
                        continue;
496✔
2996

2997
                FDSET_FOREACH(fd, fds) {
828✔
2998
                        if (socket_address_matches_fd(&p->address, fd)) {
516✔
2999
                                p->fd = fdset_remove(fds, fd);
×
3000
                                s->deserialized_state = SOCKET_LISTENING;
×
3001
                                break;
×
3002
                        }
3003
                }
3004
        }
3005
}
793✔
3006

3007
static UnitActiveState socket_active_state(Unit *u) {
508,529✔
3008
        Socket *s = ASSERT_PTR(SOCKET(u));
508,529✔
3009

3010
        return state_translation_table[s->state];
508,529✔
3011
}
3012

3013
static const char *socket_sub_state_to_string(Unit *u) {
4,897✔
3014
        Socket *s = ASSERT_PTR(SOCKET(u));
4,897✔
3015

3016
        return socket_state_to_string(s->state);
4,897✔
3017
}
3018

3019
int socket_port_to_address(const SocketPort *p, char **ret) {
88✔
3020
        _cleanup_free_ char *address = NULL;
88✔
3021
        int r;
88✔
3022

3023
        assert(p);
88✔
3024
        assert(ret);
88✔
3025

3026
        switch (p->type) {
88✔
3027
                case SOCKET_SOCKET: {
84✔
3028
                        r = socket_address_print(&p->address, &address);
84✔
3029
                        if (r < 0)
84✔
3030
                                return r;
3031

3032
                        break;
3033
                }
3034

3035
                case SOCKET_SPECIAL:
4✔
3036
                case SOCKET_MQUEUE:
3037
                case SOCKET_FIFO:
3038
                case SOCKET_USB_FUNCTION:
3039
                        address = strdup(p->path);
4✔
3040
                        if (!address)
4✔
3041
                                return -ENOMEM;
3042
                        break;
3043

3044
                default:
×
3045
                        assert_not_reached();
×
3046
        }
3047

3048
        *ret = TAKE_PTR(address);
88✔
3049

3050
        return 0;
88✔
3051
}
3052

3053
const char* socket_port_type_to_string(SocketPort *p) {
88✔
3054
        assert(p);
88✔
3055

3056
        switch (p->type) {
88✔
3057

3058
        case SOCKET_SOCKET:
84✔
3059

3060
                switch (p->address.type) {
84✔
3061

3062
                case SOCK_STREAM:
3063
                        return "Stream";
3064

3065
                case SOCK_DGRAM:
6✔
3066
                        return "Datagram";
6✔
3067

3068
                case SOCK_SEQPACKET:
4✔
3069
                        return "SequentialPacket";
4✔
3070

3071
                case SOCK_RAW:
6✔
3072
                        if (socket_address_family(&p->address) == AF_NETLINK)
6✔
3073
                                return "Netlink";
3074

3075
                        _fallthrough_;
×
3076
                default:
3077
                        return NULL;
×
3078
                }
3079

3080
        case SOCKET_SPECIAL:
3081
                return "Special";
3082

3083
        case SOCKET_MQUEUE:
×
3084
                return "MessageQueue";
×
3085

3086
        case SOCKET_FIFO:
4✔
3087
                return "FIFO";
4✔
3088

3089
        case SOCKET_USB_FUNCTION:
×
3090
                return "USBFunction";
×
3091

3092
        default:
×
3093
                return NULL;
×
3094
        }
3095
}
3096

3097
SocketType socket_port_type_from_string(const char *s) {
2✔
3098
        assert(s);
2✔
3099

3100
        if (STR_IN_SET(s, "Stream", "Datagram", "SequentialPacket", "Netlink"))
2✔
3101
                return SOCKET_SOCKET;
2✔
3102
        else if (streq(s, "Special"))
2✔
3103
                return SOCKET_SPECIAL;
3104
        else if (streq(s, "MessageQueue"))
2✔
3105
                return SOCKET_MQUEUE;
3106
        else if (streq(s, "FIFO"))
2✔
3107
                return SOCKET_FIFO;
3108
        else if (streq(s, "USBFunction"))
×
3109
                return SOCKET_USB_FUNCTION;
3110
        else
3111
                return _SOCKET_TYPE_INVALID;
×
3112
}
3113

3114
static bool socket_may_gc(Unit *u) {
15,159✔
3115
        Socket *s = ASSERT_PTR(SOCKET(u));
15,159✔
3116

3117
        return s->n_connections == 0;
15,159✔
3118
}
3119

3120
static int socket_accept_do(Socket *s, int fd) {
94✔
3121
        int cfd;
94✔
3122

3123
        assert(s);
94✔
3124
        assert(fd >= 0);
94✔
3125

3126
        cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
94✔
3127
        if (cfd < 0)
94✔
3128
                /* Convert transient network errors into clean and well-defined EAGAIN */
3129
                return ERRNO_IS_ACCEPT_AGAIN(errno) ? -EAGAIN : -errno;
×
3130

3131
        return cfd;
3132
}
3133

3134
static int socket_accept_in_cgroup(Socket *s, SocketPort *p, int fd) {
92✔
3135
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
3136
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
92✔
3137
        int cfd, r;
92✔
3138

3139
        assert(s);
92✔
3140
        assert(p);
92✔
3141
        assert(fd >= 0);
92✔
3142

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

3146
        if (!IN_SET(p->address.sockaddr.sa.sa_family, AF_INET, AF_INET6))
92✔
3147
                goto shortcut;
92✔
3148

3149
        if (bpf_program_supported() <= 0)
×
3150
                goto shortcut;
×
3151

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

3155
        r = unit_fork_helper_process(UNIT(s), "(sd-accept)", /* into_cgroup= */ true, &pid);
×
3156
        if (r < 0)
2✔
3157
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off accept stub process: %m");
×
3158
        if (r == 0) {
2✔
3159
                /* Child */
3160

3161
                pair[0] = safe_close(pair[0]);
2✔
3162

3163
                cfd = socket_accept_do(s, fd);
2✔
3164
                if (cfd == -EAGAIN) /* spurious accept() */
2✔
3165
                        _exit(EXIT_SUCCESS);
×
3166
                if (cfd < 0) {
2✔
3167
                        log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3168
                        _exit(EXIT_FAILURE);
×
3169
                }
3170

3171
                r = send_one_fd(pair[1], cfd, 0);
2✔
3172
                if (r < 0) {
2✔
3173
                        log_unit_error_errno(UNIT(s), r, "Failed to send connection socket to parent: %m");
×
3174
                        _exit(EXIT_FAILURE);
×
3175
                }
3176

3177
                _exit(EXIT_SUCCESS);
2✔
3178
        }
3179

3180
        pair[1] = safe_close(pair[1]);
×
3181
        cfd = receive_one_fd(pair[0], 0);
×
3182

3183
        /* We synchronously wait for the helper, as it shouldn't be slow */
3184
        r = wait_for_terminate_and_check("(sd-accept)", pid.pid, WAIT_LOG_ABNORMAL);
×
3185
        if (r < 0) {
×
3186
                safe_close(cfd);
×
3187
                return r;
3188
        }
3189

3190
        /* If we received no fd, we got EIO here. If this happens with a process exit code of EXIT_SUCCESS
3191
         * this is a spurious accept(), let's convert that back to EAGAIN here. */
3192
        if (cfd == -EIO)
×
3193
                return -EAGAIN;
3194
        if (cfd < 0)
×
3195
                return log_unit_error_errno(UNIT(s), cfd, "Failed to receive connection socket: %m");
×
3196

3197
        return cfd;
3198

3199
shortcut:
92✔
3200
        cfd = socket_accept_do(s, fd);
92✔
3201
        if (cfd == -EAGAIN) /* spurious accept(), skip it silently */
92✔
3202
                return -EAGAIN;
3203
        if (cfd < 0)
92✔
3204
                return log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3205

3206
        return cfd;
3207
}
3208

3209
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
298✔
3210
        SocketPort *p = ASSERT_PTR(userdata);
298✔
3211
        int cfd = -EBADF;
298✔
3212

3213
        assert(fd >= 0);
298✔
3214

3215
        if (p->socket->state != SOCKET_LISTENING)
298✔
3216
                return 0;
3217

3218
        log_unit_debug(UNIT(p->socket), "Incoming traffic");
298✔
3219

3220
        if (revents != EPOLLIN) {
298✔
3221
                if (revents & EPOLLHUP)
×
3222
                        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.");
×
3223
                else
3224
                        log_unit_error(UNIT(p->socket), "Got unexpected poll event (0x%x) on socket.", revents);
×
3225
                goto fail;
×
3226
        }
3227

3228
        if (p->socket->accept &&
298✔
3229
            p->type == SOCKET_SOCKET &&
184✔
3230
            socket_address_can_accept(&p->address)) {
92✔
3231

3232
                cfd = socket_accept_in_cgroup(p->socket, p, fd);
92✔
3233
                if (cfd == -EAGAIN) /* Spurious accept() */
92✔
3234
                        return 0;
3235
                if (cfd < 0)
92✔
3236
                        goto fail;
×
3237

3238
                socket_apply_socket_options(p->socket, p, cfd);
92✔
3239
        }
3240

3241
        socket_enter_running(p->socket, cfd);
298✔
3242
        return 0;
298✔
3243

3244
fail:
×
3245
        socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
×
3246
        return 0;
×
3247
}
3248

3249
static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
202✔
3250
        Socket *s = ASSERT_PTR(SOCKET(u));
202✔
3251
        SocketResult f;
202✔
3252

3253
        assert(pid >= 0);
202✔
3254

3255
        if (pid != s->control_pid.pid)
202✔
3256
                return;
3257

3258
        pidref_done(&s->control_pid);
202✔
3259

3260
        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
202✔
3261
                f = SOCKET_SUCCESS;
3262
        else if (code == CLD_EXITED)
×
3263
                f = SOCKET_FAILURE_EXIT_CODE;
3264
        else if (code == CLD_KILLED)
×
3265
                f = SOCKET_FAILURE_SIGNAL;
3266
        else if (code == CLD_DUMPED)
×
3267
                f = SOCKET_FAILURE_CORE_DUMP;
3268
        else
3269
                assert_not_reached();
×
3270

3271
        if (s->control_command) {
202✔
3272
                exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
202✔
3273

3274
                if (s->control_command->flags & EXEC_COMMAND_IGNORE_FAILURE)
202✔
3275
                        f = SOCKET_SUCCESS;
202✔
3276
        }
3277

3278
        unit_log_process_exit(
202✔
3279
                        u,
3280
                        "Control process",
3281
                        socket_exec_command_to_string(s->control_command_id),
3282
                        f == SOCKET_SUCCESS,
3283
                        code, status);
3284

3285
        if (s->result == SOCKET_SUCCESS)
202✔
3286
                s->result = f;
202✔
3287

3288
        if (s->control_command &&
202✔
3289
            s->control_command->command_next &&
202✔
3290
            f == SOCKET_SUCCESS) {
3291

3292
                log_unit_debug(u, "Running next command for state %s", socket_state_to_string(s->state));
×
3293
                socket_run_next(s);
×
3294
        } else {
3295
                s->control_command = NULL;
202✔
3296
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
202✔
3297

3298
                /* No further commands for this step, so let's figure
3299
                 * out what to do next */
3300

3301
                log_unit_debug(u, "Got final SIGCHLD for state %s", socket_state_to_string(s->state));
202✔
3302

3303
                switch (s->state) {
202✔
3304

3305
                case SOCKET_START_PRE:
×
3306
                        if (f == SOCKET_SUCCESS)
×
3307
                                socket_enter_start_open(s);
×
3308
                        else
3309
                                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
×
3310
                        break;
3311

3312
                case SOCKET_START_CHOWN:
×
3313
                        if (f == SOCKET_SUCCESS)
×
3314
                                socket_enter_start_post(s);
×
3315
                        else
3316
                                socket_enter_stop_pre(s, f);
×
3317
                        break;
3318

3319
                case SOCKET_START_POST:
196✔
3320
                        if (f == SOCKET_SUCCESS)
196✔
3321
                                socket_enter_listening(s);
196✔
3322
                        else
3323
                                socket_enter_stop_pre(s, f);
×
3324
                        break;
3325

3326
                case SOCKET_STOP_PRE:
6✔
3327
                case SOCKET_STOP_PRE_SIGTERM:
3328
                case SOCKET_STOP_PRE_SIGKILL:
3329
                        socket_enter_stop_post(s, f);
6✔
3330
                        break;
6✔
3331

3332
                case SOCKET_STOP_POST:
×
3333
                case SOCKET_FINAL_SIGTERM:
3334
                case SOCKET_FINAL_SIGKILL:
3335
                        socket_enter_dead(s, f);
×
3336
                        break;
×
3337

3338
                case SOCKET_CLEANING:
×
3339

3340
                        if (s->clean_result == SOCKET_SUCCESS)
×
3341
                                s->clean_result = f;
×
3342

3343
                        socket_enter_dead(s, SOCKET_SUCCESS);
×
3344
                        break;
×
3345

3346
                default:
×
3347
                        assert_not_reached();
×
3348
                }
3349
        }
3350

3351
        /* Notify clients about changed exit status */
3352
        unit_add_to_dbus_queue(u);
202✔
3353
}
3354

3355
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
×
3356
        Socket *s = ASSERT_PTR(SOCKET(userdata));
×
3357

3358
        assert(s->timer_event_source == source);
×
3359

3360
        switch (s->state) {
×
3361

3362
        case SOCKET_START_PRE:
3363
                log_unit_warning(UNIT(s), "Starting timed out. Terminating.");
×
3364
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3365
                break;
×
3366

3367
        case SOCKET_START_CHOWN:
3368
        case SOCKET_START_POST:
3369
                log_unit_warning(UNIT(s), "Starting timed out. Stopping.");
×
3370
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3371
                break;
×
3372

3373
        case SOCKET_DEFERRED:
3374
                log_unit_warning(UNIT(s), "DeferTriggerMaxSec= elapsed. Stopping.");
×
3375
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3376
                break;
×
3377

3378
        case SOCKET_STOP_PRE:
3379
                log_unit_warning(UNIT(s), "Stopping timed out. Terminating.");
×
3380
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3381
                break;
×
3382

3383
        case SOCKET_STOP_PRE_SIGTERM:
×
3384
                if (s->kill_context.send_sigkill) {
×
3385
                        log_unit_warning(UNIT(s), "Stopping timed out. Killing.");
×
3386
                        socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3387
                } else {
3388
                        log_unit_warning(UNIT(s), "Stopping timed out. Skipping SIGKILL. Ignoring.");
×
3389
                        socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3390
                }
3391
                break;
3392

3393
        case SOCKET_STOP_PRE_SIGKILL:
3394
                log_unit_warning(UNIT(s), "Processes still around after SIGKILL. Ignoring.");
×
3395
                socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3396
                break;
×
3397

3398
        case SOCKET_STOP_POST:
3399
                log_unit_warning(UNIT(s), "Stopping timed out (2). Terminating.");
×
3400
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3401
                break;
×
3402

3403
        case SOCKET_FINAL_SIGTERM:
×
3404
                if (s->kill_context.send_sigkill) {
×
3405
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Killing.");
×
3406
                        socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3407
                } else {
3408
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
×
3409
                        socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3410
                }
3411
                break;
3412

3413
        case SOCKET_FINAL_SIGKILL:
3414
                log_unit_warning(UNIT(s), "Still around after SIGKILL (2). Entering failed mode.");
×
3415
                socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3416
                break;
×
3417

3418
        case SOCKET_CLEANING:
3419
                log_unit_warning(UNIT(s), "Cleaning timed out. killing.");
×
3420

3421
                if (s->clean_result == SOCKET_SUCCESS)
×
3422
                        s->clean_result = SOCKET_FAILURE_TIMEOUT;
×
3423

3424
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, 0);
×
3425
                break;
×
3426

3427
        default:
×
3428
                assert_not_reached();
×
3429
        }
3430

3431
        return 0;
×
3432
}
3433

3434
int socket_collect_fds(Socket *s, int **ret) {
670✔
3435
        size_t n = 0, k = 0;
670✔
3436

3437
        assert(s);
670✔
3438
        assert(ret);
670✔
3439

3440
        /* Called from the service code for requesting our fds */
3441

3442
        LIST_FOREACH(port, p, s->ports) {
1,382✔
3443
                if (p->fd >= 0)
712✔
3444
                        n++;
693✔
3445
                n += p->n_auxiliary_fds;
712✔
3446
        }
3447

3448
        if (n == 0) {
670✔
3449
                *ret = NULL;
19✔
3450
                return 0;
19✔
3451
        }
3452

3453
        int *fds = new(int, n);
651✔
3454
        if (!fds)
651✔
3455
                return -ENOMEM;
3456

3457
        LIST_FOREACH(port, p, s->ports) {
1,344✔
3458
                if (p->fd >= 0)
693✔
3459
                        fds[k++] = p->fd;
693✔
3460
                FOREACH_ARRAY(i, p->auxiliary_fds, p->n_auxiliary_fds)
693✔
3461
                        fds[k++] = *i;
×
3462
        }
3463

3464
        assert(k == n);
651✔
3465

3466
        *ret = fds;
651✔
3467
        return (int) n;
651✔
3468
}
3469

3470
static void socket_reset_failed(Unit *u) {
41✔
3471
        Socket *s = SOCKET(u);
41✔
3472

3473
        assert(s);
×
3474

3475
        if (s->state == SOCKET_FAILED)
41✔
3476
                socket_set_state(s, SOCKET_DEAD);
×
3477

3478
        s->result = SOCKET_SUCCESS;
41✔
3479
        s->clean_result = SOCKET_SUCCESS;
41✔
3480
}
41✔
3481

3482
void socket_connection_unref(Socket *s) {
92✔
3483
        assert(s);
92✔
3484

3485
        /* The service is dead. Yay!
3486
         *
3487
         * This is strictly for one-instance-per-connection
3488
         * services. */
3489

3490
        assert(s->n_connections > 0);
92✔
3491
        s->n_connections--;
92✔
3492

3493
        log_unit_debug(UNIT(s), "One connection closed, %u left.", s->n_connections);
92✔
3494
}
92✔
3495

3496
static void socket_trigger_notify(Unit *u, Unit *other) {
4,291✔
3497
        Socket *s = ASSERT_PTR(SOCKET(u));
4,291✔
3498

3499
        assert(other);
4,291✔
3500

3501
        /* Filter out invocations with bogus state */
3502
        assert(UNIT_IS_LOAD_COMPLETE(other->load_state));
4,291✔
3503

3504
        Service *service = ASSERT_PTR(SERVICE(other));
4,291✔
3505

3506
        /* Don't propagate state changes from the service if we are already down */
3507
        if (!IN_SET(s->state, SOCKET_RUNNING, SOCKET_LISTENING, SOCKET_DEFERRED))
4,291✔
3508
                return;
3509

3510
        /* We don't care for the service state if we are in Accept=yes mode */
3511
        if (s->accept)
3,804✔
3512
                return;
3513

3514
        /* Propagate start limit hit state */
3515
        if (other->start_limit_hit) {
3,520✔
3516
                socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT);
×
3517
                return;
×
3518
        }
3519

3520
        /* Don't propagate anything if there's still a job queued */
3521
        if (other->job)
3,520✔
3522
                return;
3523

3524
        if (!SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ true))
2,636✔
3525
                socket_enter_listening(s);
833✔
3526

3527
        if (SERVICE(other)->state == SERVICE_RUNNING)
2,636✔
3528
                socket_set_state(s, SOCKET_RUNNING);
1,643✔
3529
}
3530

3531
static void socket_handoff_timestamp(
404✔
3532
                Unit *u,
3533
                const struct ucred *ucred,
3534
                const dual_timestamp *ts) {
3535

3536
        Socket *s = ASSERT_PTR(SOCKET(u));
404✔
3537

3538
        assert(ucred);
404✔
3539
        assert(ts);
404✔
3540

3541
        if (s->control_pid.pid == ucred->pid && s->control_command) {
404✔
3542
                exec_status_handoff(&s->control_command->exec_status, ucred, ts);
404✔
3543
                unit_add_to_dbus_queue(u);
404✔
3544
        }
3545
}
404✔
3546

3547
static int socket_get_timeout(Unit *u, usec_t *timeout) {
×
3548
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3549
        usec_t t;
×
3550
        int r;
×
3551

3552
        if (!s->timer_event_source)
×
3553
                return 0;
×
3554

3555
        r = sd_event_source_get_time(s->timer_event_source, &t);
×
3556
        if (r < 0)
×
3557
                return r;
3558
        if (t == USEC_INFINITY)
×
3559
                return 0;
3560

3561
        *timeout = t;
×
3562
        return 1;
×
3563
}
3564

3565
const char* socket_fdname(Socket *s) {
866✔
3566
        assert(s);
866✔
3567

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

3571
        if (s->fdname)
866✔
3572
                return s->fdname;
3573

3574
        if (s->accept)
497✔
3575
                return "connection";
3576

3577
        return UNIT(s)->id;
483✔
3578
}
3579

3580
static PidRef* socket_control_pid(Unit *u) {
5,986✔
3581
        return &ASSERT_PTR(SOCKET(u))->control_pid;
11,972✔
3582
}
3583

3584
static int socket_clean(Unit *u, ExecCleanMask mask) {
×
3585
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3586
        _cleanup_strv_free_ char **l = NULL;
×
3587
        int r;
×
3588

3589
        assert(mask != 0);
×
3590

3591
        if (s->state != SOCKET_DEAD)
×
3592
                return -EBUSY;
3593

3594
        r = exec_context_get_clean_directories(&s->exec_context, u->manager->prefix, mask, &l);
×
3595
        if (r < 0)
×
3596
                return r;
3597

3598
        if (strv_isempty(l))
×
3599
                return -EUNATCH;
3600

3601
        socket_unwatch_control_pid(s);
×
3602
        s->clean_result = SOCKET_SUCCESS;
×
3603
        s->control_command = NULL;
×
3604
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
×
3605

3606
        r = socket_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec);
×
3607
        if (r < 0) {
×
3608
                log_unit_warning_errno(u, r, "Failed to install timer: %m");
×
3609
                goto fail;
×
3610
        }
3611

3612
        r = unit_fork_and_watch_rm_rf(u, l, &s->control_pid);
×
3613
        if (r < 0) {
×
3614
                log_unit_warning_errno(u, r, "Failed to spawn cleaning task: %m");
×
3615
                goto fail;
×
3616
        }
3617

3618
        socket_set_state(s, SOCKET_CLEANING);
×
3619
        return 0;
3620

3621
fail:
×
3622
        s->clean_result = SOCKET_FAILURE_RESOURCES;
×
3623
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
×
3624
        return r;
×
3625
}
3626

3627
static int socket_can_clean(Unit *u, ExecCleanMask *ret) {
94✔
3628
        Socket *s = ASSERT_PTR(SOCKET(u));
94✔
3629

3630
        return exec_context_get_clean_mask(&s->exec_context, ret);
94✔
3631
}
3632

3633
static int socket_test_startable(Unit *u) {
3,327✔
3634
        Socket *s = ASSERT_PTR(SOCKET(u));
3,327✔
3635
        int r;
3,327✔
3636

3637
        /* It is already being started. */
3638
        if (IN_SET(s->state,
3,327✔
3639
                   SOCKET_START_PRE,
3640
                   SOCKET_START_OPEN,
3641
                   SOCKET_START_CHOWN,
3642
                   SOCKET_START_POST))
3643
                return false;
3644

3645
        r = unit_test_start_limit(u);
3,327✔
3646
        if (r < 0) {
3,327✔
3647
                socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT);
×
3648
                return r;
×
3649
        }
3650

3651
        return true;
3652
}
3653

3654
static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
3655
        [SOCKET_EXEC_START_PRE]   = "ExecStartPre",
3656
        [SOCKET_EXEC_START_CHOWN] = "ExecStartChown",
3657
        [SOCKET_EXEC_START_POST]  = "ExecStartPost",
3658
        [SOCKET_EXEC_STOP_PRE]    = "ExecStopPre",
3659
        [SOCKET_EXEC_STOP_POST]   = "ExecStopPost",
3660
};
3661

3662
DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
262✔
3663

3664
static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
3665
        [SOCKET_SUCCESS]                         = "success",
3666
        [SOCKET_FAILURE_RESOURCES]               = "resources",
3667
        [SOCKET_FAILURE_TIMEOUT]                 = "timeout",
3668
        [SOCKET_FAILURE_EXIT_CODE]               = "exit-code",
3669
        [SOCKET_FAILURE_SIGNAL]                  = "signal",
3670
        [SOCKET_FAILURE_CORE_DUMP]               = "core-dump",
3671
        [SOCKET_FAILURE_START_LIMIT_HIT]         = "start-limit-hit",
3672
        [SOCKET_FAILURE_TRIGGER_LIMIT_HIT]       = "trigger-limit-hit",
3673
        [SOCKET_FAILURE_SERVICE_START_LIMIT_HIT] = "service-start-limit-hit",
3674
};
3675

3676
DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
9,103✔
3677

3678
static const char* const socket_timestamping_table[_SOCKET_TIMESTAMPING_MAX] = {
3679
        [SOCKET_TIMESTAMPING_OFF] = "off",
3680
        [SOCKET_TIMESTAMPING_US]  = "us",
3681
        [SOCKET_TIMESTAMPING_NS]  = "ns",
3682
};
3683

3684
DEFINE_STRING_TABLE_LOOKUP(socket_timestamping, SocketTimestamping);
311✔
3685

3686
SocketTimestamping socket_timestamping_from_string_harder(const char *s) {
227✔
3687
        SocketTimestamping t;
227✔
3688
        int r;
227✔
3689

3690
        if (!s)
227✔
3691
                return _SOCKET_TIMESTAMPING_INVALID;
3692

3693
        t = socket_timestamping_from_string(s);
227✔
3694
        if (t >= 0)
227✔
3695
                return t;
3696

3697
        /* Let's alternatively support the various other aliases parse_time() accepts for ns and µs here,
3698
         * too. */
3699
        if (streq(s, "nsec"))
×
3700
                return SOCKET_TIMESTAMPING_NS;
3701
        if (STR_IN_SET(s, "usec", "µs", "μs")) /* Accept both small greek letter mu + micro sign unicode codepoints */
×
3702
                return SOCKET_TIMESTAMPING_US;
×
3703

3704
        r = parse_boolean(s);
×
3705
        if (r < 0)
×
3706
                return _SOCKET_TIMESTAMPING_INVALID;
3707

3708
        return r ? SOCKET_TIMESTAMPING_NS : SOCKET_TIMESTAMPING_OFF; /* If boolean yes, default to ns accuracy */
×
3709
}
3710

3711
static const char* const socket_defer_trigger_table[_SOCKET_DEFER_MAX] = {
3712
        [SOCKET_DEFER_NO]      = "no",
3713
        [SOCKET_DEFER_YES]     = "yes",
3714
        [SOCKET_DEFER_PATIENT] = "patient",
3715
};
3716

3717
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(socket_defer_trigger, SocketDeferTrigger, SOCKET_DEFER_YES);
788✔
3718

3719
const UnitVTable socket_vtable = {
3720
        .object_size = sizeof(Socket),
3721
        .exec_context_offset = offsetof(Socket, exec_context),
3722
        .cgroup_context_offset = offsetof(Socket, cgroup_context),
3723
        .kill_context_offset = offsetof(Socket, kill_context),
3724
        .exec_runtime_offset = offsetof(Socket, exec_runtime),
3725
        .cgroup_runtime_offset = offsetof(Socket, cgroup_runtime),
3726

3727
        .sections =
3728
                "Unit\0"
3729
                "Socket\0"
3730
                "Install\0",
3731
        .private_section = "Socket",
3732

3733
        .can_transient = true,
3734
        .can_trigger = true,
3735
        .can_fail = true,
3736

3737
        .init = socket_init,
3738
        .done = socket_done,
3739
        .load = socket_load,
3740

3741
        .coldplug = socket_coldplug,
3742

3743
        .dump = socket_dump,
3744

3745
        .start = socket_start,
3746
        .stop = socket_stop,
3747

3748
        .clean = socket_clean,
3749
        .can_clean = socket_can_clean,
3750

3751
        .get_timeout = socket_get_timeout,
3752

3753
        .serialize = socket_serialize,
3754
        .deserialize_item = socket_deserialize_item,
3755
        .distribute_fds = socket_distribute_fds,
3756

3757
        .active_state = socket_active_state,
3758
        .sub_state_to_string = socket_sub_state_to_string,
3759

3760
        .will_restart = unit_will_restart_default,
3761

3762
        .may_gc = socket_may_gc,
3763

3764
        .sigchld_event = socket_sigchld_event,
3765

3766
        .trigger_notify = socket_trigger_notify,
3767

3768
        .stop_notify = socket_stop_notify,
3769

3770
        .reset_failed = socket_reset_failed,
3771

3772
        .notify_handoff_timestamp = socket_handoff_timestamp,
3773

3774
        .control_pid = socket_control_pid,
3775

3776
        .bus_set_property = bus_socket_set_property,
3777
        .bus_commit_properties = bus_socket_commit_properties,
3778

3779
        .status_message_formats = {
3780
                .finished_start_job = {
3781
                        [JOB_DONE]       = "Listening on %s.",
3782
                        [JOB_FAILED]     = "Failed to listen on %s.",
3783
                        [JOB_TIMEOUT]    = "Timed out starting %s.",
3784
                },
3785
                .finished_stop_job = {
3786
                        [JOB_DONE]       = "Closed %s.",
3787
                        [JOB_FAILED]     = "Failed stopping %s.",
3788
                        [JOB_TIMEOUT]    = "Timed out stopping %s.",
3789
                },
3790
        },
3791

3792
        .test_startable = socket_test_startable,
3793
};
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