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

systemd / systemd / 25615496818

09 May 2026 05:08PM UTC coverage: 72.511% (-0.1%) from 72.64%
25615496818

push

github

bluca
hwdb/keyboard: fix KP_Enter on Clevo PA70ES

The ITE keyboard controller firmware (version 0xAB83) is shared
between the Clevo PA70ES and the X+ piccolo series.

The piccolo's hwdb rule matches by input device ID
(evdev:input:b0011v0001p0001eAB83*) and remaps scan code 0x9c
(KP_Enter) to Enter, since the piccolo has no numpad and its
main Enter key sends the wrong scan code.

The Clevo PA70ES has a real numpad. The piccolo rule matches it
because both laptops use the same ITE controller firmware, which
breaks KP_Enter on the PA70ES.

Add a DMI-specific override that restores KEY_KPENTER for 0x9c
on the PA70ES.

The piccolo rule should ideally be narrowed to use DMI matching
instead of input device ID to avoid catching other laptops with
the same ITE controller firmware.

326196 of 449859 relevant lines covered (72.51%)

1210161.93 hits per line

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

65.37
/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) {
19,472✔
88
        return IN_SET(state,
19,472✔
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) {
6,076✔
102
        assert(s);
6,076✔
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))))
6,076✔
110
                return false;
111

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

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

118
        return true;
119
}
120

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

124
        assert(u->load_state == UNIT_STUB);
11,966✔
125

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

131
        s->max_connections = 64;
11,966✔
132

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

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

142
        s->control_pid = PIDREF_NULL;
11,966✔
143
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
11,966✔
144

145
        s->trigger_limit = RATELIMIT_OFF;
11,966✔
146

147
        s->poll_limit = RATELIMIT_OFF;
11,966✔
148

149
        s->defer_trigger_max_usec = USEC_INFINITY;
11,966✔
150
}
11,966✔
151

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

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

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

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

169
        sd_event_source_unref(p->event_source);
12,347✔
170

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

175
        return mfree(p);
12,347✔
176
}
177

178
void socket_free_ports(Socket *s) {
11,966✔
179
        assert(s);
11,966✔
180

181
        LIST_CLEAR(port, s->ports, socket_port_free);
24,312✔
182
}
11,966✔
183

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

188
        socket_free_ports(s);
11,966✔
189

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

193
        s->peers_by_address = set_free(s->peers_by_address);
11,966✔
194

195
        s->exec_runtime = exec_runtime_free(s->exec_runtime);
11,966✔
196

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

200
        socket_unwatch_control_pid(s);
11,966✔
201

202
        unit_ref_unset(&s->service);
11,966✔
203

204
        s->tcp_congestion = mfree(s->tcp_congestion);
11,966✔
205
        s->bind_to_device = mfree(s->bind_to_device);
11,966✔
206

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

211
        strv_free(s->symlinks);
11,966✔
212

213
        s->user = mfree(s->user);
11,966✔
214
        s->group = mfree(s->group);
11,966✔
215

216
        s->fdname = mfree(s->fdname);
11,966✔
217

218
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
11,966✔
219
}
11,966✔
220

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

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

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

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

233
        LIST_FOREACH(port, p, s->ports) {
14,932✔
234

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

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

242
        return false;
243
}
244

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

248
        assert(s);
11,960✔
249

250
        LIST_FOREACH(port, p, s->ports) {
24,306✔
251
                const char *path = NULL;
12,346✔
252

253
                if (p->type == SOCKET_SOCKET)
12,346✔
254
                        path = socket_address_get_path(&p->address);
11,933✔
255
                else if (IN_SET(p->type, SOCKET_FIFO, SOCKET_SPECIAL, SOCKET_USB_FUNCTION))
413✔
256
                        path = p->path;
407✔
257

258
                if (!path)
12,346✔
259
                        continue;
651✔
260

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

266
        return 0;
267
}
268

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

272
        assert(s);
11,960✔
273

274
        if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
11,960✔
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) {
11,960✔
282
        int r;
11,960✔
283

284
        assert(s);
11,960✔
285

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

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

293
        if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
5,235✔
294
                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
2,284✔
295
                if (r < 0)
2,284✔
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);
5,235✔
300
}
301

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

305
        FOREACH_ARRAY(i, s->exec_command, _SOCKET_EXEC_COMMAND_MAX)
71,013✔
306
                if (*i)
59,302✔
307
                        return true;
308

309
        return false;
310
}
311

312
static int socket_add_extras(Socket *s) {
11,960✔
313
        Unit *u = UNIT(ASSERT_PTR(s));
11,960✔
314
        int r;
11,960✔
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)
11,960✔
329
                s->trigger_limit.interval = 2 * USEC_PER_SEC;
11,926✔
330
        if (s->trigger_limit.burst == UINT_MAX)
11,960✔
331
                s->trigger_limit.burst = s->accept ? 200 : 20;
20,187✔
332

333
        if (s->poll_limit.interval == USEC_INFINITY)
11,960✔
334
                s->poll_limit.interval = 2 * USEC_PER_SEC;
11,651✔
335
        if (s->poll_limit.burst == UINT_MAX)
11,960✔
336
                s->poll_limit.burst = s->accept ? 150 : 15;
19,878✔
337

338
        if (have_non_accept_socket(s)) {
11,960✔
339

340
                if (!UNIT_ISSET(s->service)) {
8,227✔
341
                        Unit *x;
4,694✔
342

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

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

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

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

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

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

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

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

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

381
        return 0;
382
}
383

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

387
        assert(s);
9,096✔
388

389
        LIST_FOREACH(port, p, s->ports) {
18,192✔
390
                const char *f;
9,238✔
391

392
                switch (p->type) {
9,238✔
393

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

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

402
                default:
403
                        f = NULL;
404
                }
405

406
                if (f) {
9,238✔
407
                        if (found)
9,161✔
408
                                return NULL;
409

410
                        found = f;
411
                }
412
        }
413

414
        return found;
415
}
416

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

421
        if (!s->ports)
11,960✔
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)
11,960✔
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))
11,960✔
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))
11,960✔
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)
11,960✔
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))
17,083✔
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) {
397✔
443
        assert(s);
397✔
444

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

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

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

464
        switch (x->peer.sa.sa_family) {
143✔
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:
143✔
472
                return CMP(x->peer_cred.uid, y->peer_cred.uid);
143✔
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) {
11,967✔
480
        Socket *s = ASSERT_PTR(SOCKET(u));
11,967✔
481
        int r;
11,967✔
482

483
        assert(u->load_state == UNIT_STUB);
11,967✔
484

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

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

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

497
        return socket_verify(s);
11,960✔
498
}
499

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

503
        assert(q);
135✔
504

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

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

516
        return p;
135✔
517
}
518

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

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

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

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

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

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

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

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

551
        case AF_UNIX:
143✔
552
                r = getpeercred(fd, &key.peer_cred);
143✔
553
                if (r < 0)
143✔
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);
143✔
563
        if (i) {
143✔
564
                *ret = socket_peer_ref(i);
8✔
565
                return 1;
8✔
566
        }
567

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

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

576
        remote->socket = s;
135✔
577

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

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

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

587
        if (type == SOCK_STREAM)
43✔
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) {
46✔
598
        Socket *s = ASSERT_PTR(SOCKET(u));
46✔
599
        const char *prefix2, *str;
46✔
600

601
        assert(f);
46✔
602

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

606
        fprintf(f,
635✔
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),
638
                prefix, yes_no(s->no_delay),
639
                prefix, yes_no(s->free_bind),
640
                prefix, yes_no(s->transparent),
641
                prefix, yes_no(s->broadcast),
642
                prefix, yes_no(s->pass_cred),
643
                prefix, yes_no(s->pass_pidfd),
644
                prefix, yes_no(s->pass_sec),
645
                prefix, yes_no(s->pass_pktinfo),
646
                prefix, yes_no(s->pass_rights),
647
                prefix, strna(s->tcp_congestion),
46✔
648
                prefix, yes_no(s->remove_on_stop),
649
                prefix, yes_no(s->writable),
650
                prefix, socket_fdname(s),
651
                prefix, yes_no(s->pass_fds_to_exec),
652
                prefix, yes_no(s->selinux_context_from_net));
653

654
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF)
46✔
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)
46✔
665
                fprintf(f,
×
666
                        "%sBindToDevice: %s\n",
667
                        prefix, s->bind_to_device);
668

669
        if (s->accept)
46✔
670
                fprintf(f,
16✔
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,
60✔
681
                        "%sFlushPending: %s\n"
682
                        "%sDeferTrigger: %s\n"
683
                        "%sDeferTriggerMaxSec: %s\n",
684
                        prefix, yes_no(s->flush_pending),
685
                        prefix, socket_defer_trigger_to_string(s->defer_trigger),
686
                        prefix, FORMAT_TIMESPAN(s->defer_trigger_max_usec, USEC_PER_SEC));
30✔
687

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

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

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

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

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

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

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

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

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

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

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

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

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

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

760
        if (timestamp_is_set(s->keep_alive_time))
46✔
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)
46✔
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)
46✔
771
                fprintf(f,
×
772
                        "%sKeepAliveProbes: %u\n",
773
                        prefix, s->keep_alive_cnt);
774

775
        if (s->defer_accept > 0)
46✔
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) {
94✔
781

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

787
                        r = socket_address_print(&p->address, &k);
46✔
788
                        if (r < 0) {
46✔
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);
46✔
793
                        break;
46✔
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,
46✔
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),
46✔
815
                prefix, s->trigger_limit.burst,
816
                prefix, FORMAT_TIMESPAN(s->poll_limit.interval, USEC_PER_SEC),
46✔
817
                prefix, s->poll_limit.burst);
818

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

823
        if (!strv_isempty(s->symlinks)) {
46✔
824
                fprintf(f, "%sSymlinks:", prefix);
22✔
825
                STRV_FOREACH(q, s->symlinks)
51✔
826
                        fprintf(f, " %s", *q);
29✔
827

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

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

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

838
        for (SocketExecCommand c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
276✔
839
                if (!s->exec_command[c])
230✔
840
                        continue;
230✔
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);
46✔
849
}
46✔
850

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

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

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

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

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

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

876
        char *s;
151✔
877

878
        switch (local.sa.sa_family) {
151✔
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
                s = asprintf_safe(
×
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));
×
893
                break;
894
        }
895

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

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

907
                        s = asprintf_safe(
×
908
                                        "%u-%" PRIu64 "-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
909
                                        nr,
910
                                        cookie,
911
                                        a[0], a[1], a[2], a[3],
×
912
                                        be16toh(local.in6.sin6_port),
×
913
                                        b[0], b[1], b[2], b[3],
×
914
                                        be16toh(remote.in6.sin6_port));
×
915
                } else
916
                        s = asprintf_safe(
×
917
                                        "%u-%" PRIu64 "-%s:%u-%s:%u",
918
                                        nr,
919
                                        cookie,
920
                                        IN6_ADDR_TO_STRING(&local.in6.sin6_addr),
×
921
                                        be16toh(local.in6.sin6_port),
×
922
                                        IN6_ADDR_TO_STRING(&remote.in6.sin6_addr),
×
923
                                        be16toh(remote.in6.sin6_port));
×
924
                break;
925
        }
926

927
        case AF_UNIX: {
151✔
928
                struct ucred ucred;
151✔
929

930
                r = getpeercred(fd, &ucred);
151✔
931
                if (r >= 0) {
151✔
932
                        _cleanup_close_ int pidfd = getpeerpidfd(fd);
302✔
933
                        uint64_t pidfd_id;
151✔
934

935
                        if (pidfd >= 0 && pidfd_get_inode_id(pidfd, &pidfd_id) >= 0)
151✔
936
                                s = asprintf_safe(
151✔
937
                                                "%u-%" PRIu64 "-" PID_FMT "_%" PRIu64 "-" UID_FMT,
938
                                                nr, cookie, ucred.pid, pidfd_id, ucred.uid);
939
                        else
940
                                s = asprintf_safe(
×
941
                                                "%u-%" PRIu64 "-" PID_FMT "-" UID_FMT,
942
                                                nr, cookie, ucred.pid, ucred.uid);
943
                } else if (r == -ENODATA)
×
944
                        /* This handles the case where somebody is connecting from another pid/uid namespace
945
                         * (e.g. from outside of our container). */
946
                        s = asprintf_safe("%u-%" PRIu64 "-unknown", nr, cookie);
×
947
                else
948
                        return r;
×
949
                break;
151✔
950
        }
951

952
        case AF_VSOCK:
×
953
                s = asprintf_safe(
×
954
                                "%u-%" PRIu64 "-%u:%u-%u:%u",
955
                                nr,
956
                                cookie,
957
                                local.vm.svm_cid, local.vm.svm_port,
958
                                remote.vm.svm_cid, remote.vm.svm_port);
959
                break;
960

961
        default:
×
962
                assert_not_reached();
×
963
        }
964

965
        if (!s)
151✔
966
                return -ENOMEM;
967

968
        *ret = s;
151✔
969
        return 0;
151✔
970
}
971

972
static void socket_close_fds(Socket *s) {
3,339✔
973
        assert(s);
3,339✔
974

975
        LIST_FOREACH(port, p, s->ports) {
6,689✔
976
                bool was_open = p->fd >= 0;
3,350✔
977

978
                p->event_source = sd_event_source_disable_unref(p->event_source);
3,350✔
979
                p->fd = safe_close(p->fd);
3,350✔
980
                socket_port_close_auxiliary_fds(p);
3,350✔
981

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

988
                if (!was_open || !s->remove_on_stop)
3,350✔
989
                        continue;
3,054✔
990

991
                switch (p->type) {
296✔
992

993
                case SOCKET_FIFO:
22✔
994
                        (void) unlink(p->path);
22✔
995
                        break;
22✔
996

997
                case SOCKET_MQUEUE:
1✔
998
                        (void) mq_unlink(p->path);
1✔
999
                        break;
1✔
1000

1001
                case SOCKET_SOCKET:
273✔
1002
                        (void) socket_address_unlink(&p->address);
273✔
1003
                        break;
273✔
1004

1005
                default:
3,350✔
1006
                        ;
3,350✔
1007
                }
1008
        }
1009

1010
        if (s->remove_on_stop)
3,339✔
1011
                STRV_FOREACH(i, s->symlinks)
300✔
1012
                        (void) unlink(*i);
15✔
1013

1014
        /* Note that we don't return NULL here, since s has not been freed. */
1015
}
3,339✔
1016

1017
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(Socket*, socket_close_fds, NULL);
×
1018

1019
#define log_socket_option_errno(s, e, option)                                          \
1020
        ({                                                                             \
1021
                int _e_ = (e);                                                         \
1022
                log_unit_full_errno(                                                   \
1023
                                UNIT(s),                                               \
1024
                                ERRNO_IS_NOT_SUPPORTED(_e_) ||                         \
1025
                                ERRNO_IS_PRIVILEGE(_e_) ? LOG_DEBUG : LOG_WARNING,     \
1026
                                _e_,                                                   \
1027
                                "Failed to set %s socket option, ignoring: %m",        \
1028
                                option);                                               \
1029
        })
1030

1031
static void socket_apply_socket_options(Socket *s, SocketPort *p, int fd) {
4,049✔
1032
        int r;
4,049✔
1033

1034
        assert(s);
4,049✔
1035
        assert(p);
4,049✔
1036
        assert(fd >= 0);
4,049✔
1037

1038
        if (s->keep_alive) {
4,049✔
1039
                r = setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, true);
×
1040
                if (r < 0)
×
1041
                        log_socket_option_errno(s, r, "SO_KEEPALIVE");
×
1042
        }
1043

1044
        if (timestamp_is_set(s->keep_alive_time)) {
4,049✔
1045
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPIDLE, s->keep_alive_time / USEC_PER_SEC);
×
1046
                if (r < 0)
×
1047
                        log_socket_option_errno(s, r, "TCP_KEEPIDLE");
×
1048
        }
1049

1050
        if (s->keep_alive_interval > 0) {
4,049✔
1051
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPINTVL, s->keep_alive_interval / USEC_PER_SEC);
×
1052
                if (r < 0)
×
1053
                        log_socket_option_errno(s, r, "TCP_KEEPINTVL");
×
1054
        }
1055

1056
        if (s->keep_alive_cnt > 0) {
4,049✔
1057
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPCNT, s->keep_alive_cnt);
×
1058
                if (r < 0)
×
1059
                        log_socket_option_errno(s, r, "TCP_KEEPCNT");
×
1060
        }
1061

1062
        if (s->defer_accept > 0) {
4,049✔
1063
                r = setsockopt_int(fd, SOL_TCP, TCP_DEFER_ACCEPT, s->defer_accept / USEC_PER_SEC);
×
1064
                if (r < 0)
×
1065
                        log_socket_option_errno(s, r, "TCP_DEFER_ACCEPT");
×
1066
        }
1067

1068
        if (s->no_delay) {
4,049✔
1069
                if (s->socket_protocol == IPPROTO_SCTP) {
×
1070
                        r = setsockopt_int(fd, SOL_SCTP, SCTP_NODELAY, true);
×
1071
                        if (r < 0)
×
1072
                                log_socket_option_errno(s, r, "SCTP_NODELAY");
×
1073
                } else {
1074
                        r = setsockopt_int(fd, SOL_TCP, TCP_NODELAY, true);
×
1075
                        if (r < 0)
×
1076
                                log_socket_option_errno(s, r, "TCP_NODELAY");
×
1077
                }
1078
        }
1079

1080
        if (s->broadcast) {
4,049✔
1081
                r = setsockopt_int(fd, SOL_SOCKET, SO_BROADCAST, true);
×
1082
                if (r < 0)
×
1083
                        log_socket_option_errno(s, r, "SO_BROADCAST");
×
1084
        }
1085

1086
        if (s->pass_cred) {
4,049✔
1087
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true);
150✔
1088
                if (r < 0)
150✔
1089
                        log_socket_option_errno(s, r, "SO_PASSCRED");
×
1090
        }
1091

1092
        if (s->pass_pidfd) {
4,049✔
1093
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSPIDFD, true);
×
1094
                if (r < 0)
×
1095
                        log_socket_option_errno(s, r, "SO_PASSPIDFD");
×
1096
        }
1097

1098
        if (s->pass_sec) {
4,049✔
1099
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSSEC, true);
102✔
1100
                if (r < 0)
102✔
1101
                        log_socket_option_errno(s, r, "SO_PASSSEC");
×
1102
        }
1103

1104
        if (s->pass_pktinfo) {
4,049✔
1105
                r = socket_set_recvpktinfo(fd, socket_address_family(&p->address), true);
37✔
1106
                if (r < 0)
37✔
1107
                        log_socket_option_errno(s, r, "packet info");
×
1108
        }
1109

1110
        if (!s->pass_rights) {
4,049✔
1111
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSRIGHTS, false);
×
1112
                if (r < 0)
×
1113
                        log_socket_option_errno(s, r, "SO_PASSRIGHTS");
×
1114
        }
1115

1116
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF) {
4,049✔
1117
                r = setsockopt_int(fd, SOL_SOCKET,
204✔
1118
                                   s->timestamping == SOCKET_TIMESTAMPING_NS ? SO_TIMESTAMPNS : SO_TIMESTAMP,
1119
                                   true);
1120
                if (r < 0)
102✔
1121
                        log_socket_option_errno(s, r, "timestamping");
×
1122
        }
1123

1124
        if (s->priority >= 0) {
4,049✔
1125
                r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
193✔
1126
                if (r < 0)
193✔
1127
                        log_socket_option_errno(s, r, "SO_PRIORITY");
×
1128
        }
1129

1130
        if (s->receive_buffer > 0) {
4,049✔
1131
                r = fd_set_rcvbuf(fd, s->receive_buffer, false);
169✔
1132
                if (r < 0)
169✔
1133
                        log_socket_option_errno(s, r, "SO_RCVBUF/SO_RCVBUFFORCE");
×
1134
        }
1135

1136
        if (s->send_buffer > 0) {
4,049✔
1137
                r = fd_set_sndbuf(fd, s->send_buffer, false);
34✔
1138
                if (r < 0)
34✔
1139
                        log_socket_option_errno(s, r, "SO_SNDBUF/SO_SNDBUFFORCE");
×
1140
        }
1141

1142
        if (s->mark >= 0) {
4,049✔
1143
                r = setsockopt_int(fd, SOL_SOCKET, SO_MARK, s->mark);
×
1144
                if (r < 0)
×
1145
                        log_socket_option_errno(s, r, "SO_MARK");
×
1146
        }
1147

1148
        if (s->ip_tos >= 0) {
4,049✔
1149
                r = setsockopt_int(fd, IPPROTO_IP, IP_TOS, s->ip_tos);
×
1150
                if (r < 0)
×
1151
                        log_socket_option_errno(s, r, "IP_TOS");
×
1152
        }
1153

1154
        if (s->ip_ttl >= 0) {
4,049✔
1155
                r = socket_set_ttl(fd, socket_address_family(&p->address), s->ip_ttl);
×
1156
                if (r < 0)
×
1157
                        log_socket_option_errno(s, r, "IP_TTL/IPV6_UNICAST_HOPS");
×
1158
        }
1159

1160
        if (s->tcp_congestion)
4,049✔
1161
                if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
×
1162
                        log_socket_option_errno(s, errno, "TCP_CONGESTION");
×
1163

1164
        if (s->smack_ip_in) {
4,049✔
1165
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPIN, s->smack_ip_in);
×
1166
                if (r < 0)
×
1167
                        log_unit_warning_errno(UNIT(s), r, "Failed to apply SMACK label for IP input, ignoring: %m");
×
1168
        }
1169

1170
        if (s->smack_ip_out) {
4,049✔
1171
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPOUT, s->smack_ip_out);
×
1172
                if (r < 0)
×
1173
                        log_unit_warning_errno(UNIT(s), r, "Failed to apply SMACK label for IP output, ignoring: %m");
×
1174
        }
1175
}
4,049✔
1176

1177
static void socket_apply_fifo_options(Socket *s, int fd) {
75✔
1178
        int r;
75✔
1179

1180
        assert(s);
75✔
1181
        assert(fd >= 0);
75✔
1182

1183
        if (s->pipe_size > 0)
75✔
1184
                if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
×
1185
                        log_unit_warning_errno(UNIT(s), errno, "Setting pipe size failed, ignoring: %m");
×
1186

1187
        if (s->smack) {
75✔
1188
                r = mac_smack_apply_fd(fd, SMACK_ATTR_ACCESS, s->smack);
×
1189
                if (r < 0)
×
1190
                        log_unit_error_errno(UNIT(s), r, "SMACK relabelling failed, ignoring: %m");
×
1191
        }
1192
}
75✔
1193

1194
static int fifo_address_create(
75✔
1195
                const char *path,
1196
                mode_t directory_mode,
1197
                mode_t socket_mode) {
1198

1199
        _cleanup_close_ int fd = -EBADF;
75✔
1200
        mode_t old_mask;
75✔
1201
        struct stat st;
75✔
1202
        int r;
75✔
1203

1204
        assert(path);
75✔
1205

1206
        (void) mkdir_parents_label(path, directory_mode);
75✔
1207

1208
        r = mac_selinux_create_file_prepare(path, S_IFIFO);
75✔
1209
        if (r < 0)
75✔
1210
                return r;
1211

1212
        /* Enforce the right access mode for the fifo */
1213
        old_mask = umask(~socket_mode);
75✔
1214

1215
        /* Include the original umask in our mask */
1216
        (void) umask(~socket_mode | old_mask);
75✔
1217

1218
        r = mkfifo(path, socket_mode);
75✔
1219
        (void) umask(old_mask);
75✔
1220

1221
        if (r < 0 && errno != EEXIST) {
75✔
1222
                r = -errno;
×
1223
                goto fail;
×
1224
        }
1225

1226
        fd = open(path, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK | O_NOFOLLOW);
75✔
1227
        if (fd < 0) {
75✔
1228
                r = -errno;
×
1229
                goto fail;
×
1230
        }
1231

1232
        mac_selinux_create_file_clear();
75✔
1233

1234
        if (fstat(fd, &st) < 0) {
75✔
1235
                r = -errno;
×
1236
                goto fail;
×
1237
        }
1238

1239
        if (!S_ISFIFO(st.st_mode) ||
75✔
1240
            (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
150✔
1241
            st.st_uid != getuid() ||
150✔
1242
            st.st_gid != getgid()) {
75✔
1243
                r = -EEXIST;
×
1244
                goto fail;
×
1245
        }
1246

1247
        return TAKE_FD(fd);
1248

1249
fail:
×
1250
        mac_selinux_create_file_clear();
×
1251
        return r;
1252
}
1253

1254
static int special_address_create(const char *path, bool writable) {
7✔
1255
        _cleanup_close_ int fd = -EBADF;
7✔
1256
        struct stat st;
7✔
1257

1258
        assert(path);
7✔
1259

1260
        fd = open(path, (writable ? O_RDWR : O_RDONLY)|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
7✔
1261
        if (fd < 0)
7✔
1262
                return -errno;
×
1263

1264
        if (fstat(fd, &st) < 0)
7✔
1265
                return -errno;
×
1266

1267
        /* Check whether this is a /proc, /sys or /dev file or char device */
1268
        if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode))
7✔
1269
                return -EEXIST;
×
1270

1271
        return TAKE_FD(fd);
1272
}
1273

1274
static int usbffs_address_create_at(int dfd, const char *name) {
×
1275
        _cleanup_close_ int fd = -EBADF;
×
1276
        struct stat st;
×
1277

1278
        assert(dfd >= 0);
×
1279
        assert(name);
×
1280

1281
        fd = openat(dfd, name, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
×
1282
        if (fd < 0)
×
1283
                return -errno;
×
1284

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

1288
        /* Check whether this is a regular file (ffs endpoint) */
1289
        if (!S_ISREG(st.st_mode))
×
1290
                return -EEXIST;
×
1291

1292
        return TAKE_FD(fd);
1293
}
1294

1295
static int mq_address_create(
1✔
1296
                const char *path,
1297
                mode_t mq_mode,
1298
                long maxmsg,
1299
                long msgsize) {
1300

1301
        _cleanup_close_ int fd = -EBADF;
2✔
1302
        struct stat st;
1✔
1303
        mode_t old_mask;
1✔
1304
        struct mq_attr _attr, *attr = NULL;
1✔
1305

1306
        assert(path);
1✔
1307

1308
        if (maxmsg > 0 && msgsize > 0) {
1✔
1309
                _attr = (struct mq_attr) {
×
1310
                        .mq_flags = O_NONBLOCK,
1311
                        .mq_maxmsg = maxmsg,
1312
                        .mq_msgsize = msgsize,
1313
                };
1314
                attr = &_attr;
×
1315
        }
1316

1317
        /* Enforce the right access mode for the mq */
1318
        old_mask = umask(~mq_mode);
1✔
1319

1320
        /* Include the original umask in our mask */
1321
        (void) umask(~mq_mode | old_mask);
1✔
1322
        fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
1✔
1323
        (void) umask(old_mask);
1✔
1324

1325
        if (fd < 0)
1✔
1326
                return -errno;
×
1327

1328
        if (fstat(fd, &st) < 0)
1✔
1329
                return -errno;
×
1330

1331
        if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
2✔
1332
            st.st_uid != getuid() ||
2✔
1333
            st.st_gid != getgid())
1✔
1334
                return -EEXIST;
×
1335

1336
        return TAKE_FD(fd);
1337
}
1338

1339
static int socket_symlink(Socket *s) {
3,973✔
1340
        int r;
3,973✔
1341

1342
        assert(s);
3,973✔
1343

1344
        const char *target = socket_find_symlink_target(s);
3,973✔
1345
        if (!target)
3,973✔
1346
                return 0;
1347

1348
        STRV_FOREACH(linkpath, s->symlinks) {
5,847✔
1349
                (void) mkdir_parents_label(*linkpath, s->directory_mode);
2,093✔
1350

1351
                r = symlink_idempotent(target, *linkpath, false);
2,093✔
1352
                if (r == -EEXIST && s->remove_on_stop) {
2,093✔
1353
                        /* If there's already something where we want to create the symlink, and the
1354
                         * destructive RemoveOnStop= mode is set, then we might as well try to remove what
1355
                         * already exists and try again. */
1356

1357
                        if (unlink(*linkpath) >= 0)
×
1358
                                r = symlink_idempotent(target, *linkpath, false);
×
1359
                }
1360
                if (r < 0)
2,093✔
1361
                        log_unit_warning_errno(UNIT(s), r, "Failed to create symlink %s %s %s, ignoring: %m",
×
1362
                                               *linkpath, glyph(GLYPH_ARROW_RIGHT), target);
1363
        }
1364

1365
        return 0;
1366
}
1367

1368
static int usbffs_write_descs(int fd, Service *s) {
×
1369
        int r;
×
1370

1371
        assert(fd >= 0);
×
1372
        assert(s);
×
1373

1374
        if (!s->usb_function_descriptors || !s->usb_function_strings)
×
1375
                return -EINVAL;
1376

1377
        r = copy_file_fd(s->usb_function_descriptors, fd, 0);
×
1378
        if (r < 0)
×
1379
                return r;
1380

1381
        return copy_file_fd(s->usb_function_strings, fd, 0);
×
1382
}
1383

1384
static int usbffs_dispatch_eps(SocketPort *p, int dfd) {
×
1385
        _cleanup_free_ DirectoryEntries *des = NULL;
×
1386
        int r;
×
1387

1388
        assert(p);
×
1389
        assert(dfd >= 0);
×
1390

1391
        r = readdir_all(dfd, RECURSE_DIR_SORT|RECURSE_DIR_IGNORE_DOT, &des);
×
1392
        if (r < 0)
×
1393
                return r;
1394

1395
        p->auxiliary_fds = new(int, des->n_entries);
×
1396
        if (!p->auxiliary_fds)
×
1397
                return -ENOMEM;
1398

1399
        FOREACH_ARRAY(i, des->entries, des->n_entries) {
×
1400
                const struct dirent *de = *i;
×
1401

1402
                if (streq(de->d_name, "ep0"))
×
1403
                        continue;
×
1404

1405
                r = usbffs_address_create_at(dfd, de->d_name);
×
1406
                if (r < 0)
×
1407
                        goto fail;
×
1408

1409
                p->auxiliary_fds[p->n_auxiliary_fds++] = r;
×
1410
        }
1411

1412
        assert(p->n_auxiliary_fds < des->n_entries);
×
1413

1414
        return 0;
1415

1416
fail:
×
1417
        socket_port_close_auxiliary_fds(p);
×
1418
        return r;
1419
}
1420

1421
int socket_load_service_unit(Socket *s, int cfd, Unit **ret) {
4,084✔
1422
        int r;
4,084✔
1423

1424
        /* Figure out what the unit that will be used to handle the connections on the socket looks like.
1425
         *
1426
         * If cfd < 0, then we don't have a connection yet. In case of Accept=yes sockets, use a fake
1427
         * instance name.
1428
         */
1429

1430
        assert(s);
4,084✔
1431
        assert(ret);
4,084✔
1432

1433
        if (UNIT_ISSET(s->service)) {
4,084✔
1434
                *ret = UNIT_DEREF(s->service);
2,811✔
1435
                return 0;
4,084✔
1436
        }
1437

1438
        if (!s->accept)
1,273✔
1439
                return -ENODATA;
1440

1441
        /* Build the instance name and load the unit */
1442
        _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
1,273✔
1443

1444
        r = unit_name_to_prefix(UNIT(s)->id, &prefix);
1,273✔
1445
        if (r < 0)
1,273✔
1446
                return r;
1447

1448
        if (cfd >= 0) {
1,273✔
1449
                r = instance_from_socket(cfd, s->n_accepted, &instance);
151✔
1450
                if (ERRNO_IS_NEG_DISCONNECT(r))
151✔
1451
                        /* ENOTCONN is legitimate if TCP RST was received. Other socket families might return
1452
                         * different errors. This connection is over, but the socket unit lives on. */
1453
                        return log_unit_debug_errno(UNIT(s), r,
×
1454
                                                    "Got error %s on incoming socket, assuming aborted connection attempt, ignoring.",
1455
                                                    ERRNO_NAME(r));
1456
                if (r < 0)
151✔
1457
                        return r;
1458
        }
1459

1460
        /* For accepting sockets, we don't know how the instance will be called until we get a connection and
1461
         * can figure out what the peer name is. So let's use "internal" as the instance to make it clear
1462
         * that this is not an actual peer name. We use "unknown" when we cannot figure out the peer. */
1463
        r = unit_name_build(prefix, instance ?: "internal", ".service", &name);
2,395✔
1464
        if (r < 0)
1,273✔
1465
                return r;
1466

1467
        return manager_load_unit(UNIT(s)->manager, name, NULL, NULL, ret);
1,273✔
1468
}
1469

1470
static int socket_determine_selinux_label(Socket *s, char **ret) {
3,864✔
1471
        Unit *service;
3,864✔
1472
        int r;
3,864✔
1473

1474
        assert(s);
3,864✔
1475
        assert(ret);
3,864✔
1476

1477
        r = socket_load_service_unit(s, /* cfd= */ -EBADF, &service);
3,864✔
1478
        if (r == -ENODATA) {
3,864✔
1479
                *ret = NULL;
×
1480
                return 0;
×
1481
        }
1482
        if (r < 0)
3,864✔
1483
                return r;
1484

1485
        r = service_determine_exec_selinux_label(SERVICE(service), ret);
7,728✔
1486
        if (r == -ENODATA) {
3,864✔
1487
                *ret = NULL;
3,864✔
1488
                return 0;
3,864✔
1489
        }
1490
        return r;
1491
}
1492

1493
static int socket_address_listen_do(
3,912✔
1494
                Socket *s,
1495
                const SocketAddress *address,
1496
                const char *selinux_label) {
1497

1498
        assert(s);
3,912✔
1499
        assert(address);
3,912✔
1500

1501
        return socket_address_listen(
7,824✔
1502
                        address,
1503
                        SOCK_CLOEXEC|SOCK_NONBLOCK,
1504
                        s->backlog,
3,912✔
1505
                        s->bind_ipv6_only,
1506
                        s->bind_to_device,
3,912✔
1507
                        s->reuse_port,
1508
                        s->free_bind,
1509
                        s->transparent,
1510
                        s->directory_mode,
1511
                        s->socket_mode,
1512
                        selinux_label,
1513
                        s->smack);
3,912✔
1514
}
1515

1516
#define log_address_error_errno(u, address, error, fmt)          \
1517
        ({                                                       \
1518
                _cleanup_free_ char *_t = NULL;                  \
1519
                                                                 \
1520
                (void) socket_address_print(address, &_t);       \
1521
                log_unit_error_errno(u, error, fmt, strna(_t));  \
1522
        })
1523

1524
static bool fork_needed(const SocketAddress *address, Socket *s) {
3,898✔
1525
        assert(address);
3,898✔
1526
        assert(s);
3,898✔
1527

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

1530
        /* If there are any NFTSet= directives with cgroup source, we need the cgroup */
1531
        Unit *u = UNIT(s);
3,898✔
1532
        CGroupContext *c = unit_get_cgroup_context(u);
3,898✔
1533
        if (c)
3,898✔
1534
                FOREACH_ARRAY(nft_set, c->nft_set_context.sets, c->nft_set_context.n_sets)
3,898✔
1535
                        if (nft_set->source == NFT_SET_SOURCE_CGROUP)
1✔
1536
                                return true;
1537

1538
        if (IN_SET(address->sockaddr.sa.sa_family, AF_INET, AF_INET6) &&
3,898✔
1539
            bpf_program_supported() > 0) /* If BPF firewalling isn't supported anyway — there's no point in this forking complexity */
1✔
1540
                return true;
1541

1542
        return exec_needs_network_namespace(&s->exec_context);
3,896✔
1543
}
1544

1545
static int socket_address_listen_in_cgroup(
3,898✔
1546
                Socket *s,
1547
                const SocketAddress *address,
1548
                const char *label) {
1549

1550
        int r;
3,898✔
1551

1552
        assert(s);
3,898✔
1553
        assert(address);
3,898✔
1554

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

1560
        if (!fork_needed(address, s)) {
3,898✔
1561
                /* Shortcut things... */
1562
                r = socket_address_listen_do(s, address, label);
3,896✔
1563
                if (r < 0)
3,896✔
1564
                        return log_address_error_errno(UNIT(s), address, r, "Failed to create listening socket (%s): %m");
3,898✔
1565

1566
                return r;
1567
        }
1568

1569
        r = unit_setup_exec_runtime(UNIT(s));
2✔
1570
        if (r < 0)
2✔
1571
                return log_unit_error_errno(UNIT(s), r, "Failed to acquire runtime: %m");
×
1572

1573
        if (s->exec_runtime && s->exec_runtime->shared) {
2✔
1574
                if (s->exec_context.user_namespace_path &&
×
1575
                    s->exec_runtime->shared->userns_storage_socket[0] >= 0) {
×
1576
                        r = open_shareable_ns_path(s->exec_runtime->shared->userns_storage_socket, s->exec_context.user_namespace_path, CLONE_NEWUSER);
×
1577
                        if (r < 0)
×
1578
                                return log_unit_error_errno(UNIT(s), r, "Failed to open user namespace path %s: %m", s->exec_context.user_namespace_path);
×
1579
                }
1580

1581
                if (s->exec_context.network_namespace_path &&
×
1582
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1583
                        r = open_shareable_ns_path(s->exec_runtime->shared->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
×
1584
                        if (r < 0)
×
1585
                                return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
×
1586
                }
1587

1588
                if (s->exec_context.ipc_namespace_path &&
×
1589
                    s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
×
1590
                        r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
×
1591
                        if (r < 0)
×
1592
                                return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
×
1593
                }
1594
        }
1595

1596
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1597
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
2✔
1598
        _cleanup_close_ int fd = -EBADF;
2✔
1599

1600
        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
2✔
1601
                return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
×
1602

1603
        r = unit_fork_helper_process(UNIT(s), "(sd-listen)", /* into_cgroup= */ true, &pid);
2✔
1604
        if (r < 0)
18✔
1605
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off listener stub process: %m");
×
1606
        if (r == 0) {
18✔
1607
                /* Child */
1608

1609
                pair[0] = safe_close(pair[0]);
16✔
1610

1611
                if (exec_needs_network_namespace(&s->exec_context) &&
16✔
1612
                    s->exec_runtime &&
×
1613
                    s->exec_runtime->shared &&
×
1614
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1615

1616
                        if (namespace_type_supported(NAMESPACE_NET)) {
×
1617
                                r = setup_shareable_ns(s->exec_runtime->shared->netns_storage_socket, CLONE_NEWNET);
×
1618
                                if (r < 0) {
×
1619
                                        log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
×
1620
                                        _exit(EXIT_NETWORK);
×
1621
                                }
1622
                        } else if (s->exec_context.network_namespace_path) {
×
1623
                                log_unit_error(UNIT(s), "Network namespace path configured but network namespaces not supported.");
×
1624
                                _exit(EXIT_NETWORK);
×
1625
                        } else
1626
                                log_unit_warning(UNIT(s), "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
×
1627
                }
1628

1629
                fd = socket_address_listen_do(s, address, label);
16✔
1630
                if (fd < 0) {
16✔
1631
                        log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1632
                        _exit(EXIT_FAILURE);
×
1633
                }
1634

1635
                r = send_one_fd(pair[1], fd, 0);
16✔
1636
                if (r < 0) {
16✔
1637
                        log_address_error_errno(UNIT(s), address, r, "Failed to send listening socket (%s) to parent: %m");
×
1638
                        _exit(EXIT_FAILURE);
×
1639
                }
1640

1641
                _exit(EXIT_SUCCESS);
16✔
1642
        }
1643

1644
        pair[1] = safe_close(pair[1]);
2✔
1645
        fd = receive_one_fd(pair[0], 0);
2✔
1646

1647
        /* We synchronously wait for the helper, as it shouldn't be slow */
1648
        r = pidref_wait_for_terminate_and_check("(sd-listen)", &pid, WAIT_LOG_ABNORMAL);
2✔
1649
        if (r < 0)
2✔
1650
                return r;
1651

1652
        if (fd < 0)
2✔
1653
                return log_address_error_errno(UNIT(s), address, fd, "Failed to receive listening socket (%s): %m");
×
1654

1655
        return TAKE_FD(fd);
1656
}
1657

1658
static int socket_open_fds(Socket *orig_s) {
3,910✔
1659
        _cleanup_(socket_close_fdsp) Socket *s = orig_s;
3,910✔
1660
        _cleanup_freecon_ char *label = NULL;
3,910✔
1661
        bool know_label = false;
3,910✔
1662
        int r;
3,910✔
1663

1664
        assert(s);
3,910✔
1665

1666
        LIST_FOREACH(port, p, s->ports) {
7,891✔
1667

1668
                if (p->fd >= 0)
3,981✔
1669
                        continue;
×
1670

1671
                switch (p->type) {
3,981✔
1672

1673
                case SOCKET_SOCKET:
3,898✔
1674

1675
                        if (!know_label) {
3,898✔
1676
                                /* Figure out the label, if we don't it know yet. We do it once for the first
1677
                                 * socket where we need this and remember it for the rest. */
1678

1679
                                r = socket_determine_selinux_label(s, &label);
3,864✔
1680
                                if (r < 0)
3,864✔
1681
                                        return log_unit_error_errno(UNIT(s), r, "Failed to determine SELinux label: %m");
×
1682

1683
                                know_label = true;
1684
                        }
1685

1686
                        /* Apply the socket protocol */
1687
                        switch (p->address.type) {
3,898✔
1688

1689
                        case SOCK_STREAM:
3,708✔
1690
                                if (IN_SET(s->socket_protocol, IPPROTO_SCTP, IPPROTO_MPTCP))
3,708✔
1691
                                        p->address.protocol = s->socket_protocol;
×
1692
                                break;
1693

1694
                        case SOCK_SEQPACKET:
55✔
1695
                                if (s->socket_protocol == IPPROTO_SCTP)
55✔
1696
                                        p->address.protocol = s->socket_protocol;
×
1697
                                break;
1698

1699
                        case SOCK_DGRAM:
68✔
1700
                                if (s->socket_protocol == IPPROTO_UDPLITE)
68✔
1701
                                        p->address.protocol = s->socket_protocol;
×
1702
                                break;
1703
                        }
1704

1705
                        p->fd = socket_address_listen_in_cgroup(s, &p->address, label);
3,898✔
1706
                        if (p->fd < 0)
3,898✔
1707
                                return p->fd;
1708

1709
                        socket_apply_socket_options(s, p, p->fd);
3,898✔
1710
                        socket_symlink(s);
3,898✔
1711
                        break;
1712

1713
                case SOCKET_SPECIAL:
7✔
1714

1715
                        p->fd = special_address_create(p->path, s->writable);
7✔
1716
                        if (p->fd < 0)
7✔
1717
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open special file '%s': %m", p->path);
×
1718
                        break;
1719

1720
                case SOCKET_FIFO:
75✔
1721

1722
                        p->fd = fifo_address_create(
150✔
1723
                                        p->path,
75✔
1724
                                        s->directory_mode,
1725
                                        s->socket_mode);
1726
                        if (p->fd < 0)
75✔
1727
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open FIFO '%s': %m", p->path);
×
1728

1729
                        socket_apply_fifo_options(s, p->fd);
75✔
1730
                        socket_symlink(s);
75✔
1731
                        break;
1732

1733
                case SOCKET_MQUEUE:
1✔
1734

1735
                        p->fd = mq_address_create(
2✔
1736
                                        p->path,
1✔
1737
                                        s->socket_mode,
1738
                                        s->mq_maxmsg,
1739
                                        s->mq_msgsize);
1740
                        if (p->fd < 0)
1✔
1741
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open message queue '%s': %m", p->path);
×
1742
                        break;
1743

1744
                case SOCKET_USB_FUNCTION: {
×
1745
                        _cleanup_close_ int dfd = -EBADF;
7,891✔
1746

1747
                        dfd = open(p->path, O_DIRECTORY|O_CLOEXEC);
×
1748
                        if (dfd < 0)
×
1749
                                return log_unit_error_errno(UNIT(s), errno,
×
1750
                                                            "Failed to open USB FunctionFS dir '%s': %m", p->path);
1751

1752
                        p->fd = usbffs_address_create_at(dfd, "ep0");
×
1753
                        if (p->fd < 0)
×
1754
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open USB FunctionFS ep0: %m");
×
1755

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

1760
                        r = usbffs_dispatch_eps(p, dfd);
×
1761
                        if (r < 0)
×
1762
                                return log_unit_error_errno(UNIT(s), r, "Failed to dispatch USB FunctionFS eps: %m");
×
1763

1764
                        break;
×
1765
                }
1766

1767
                default:
×
1768
                        assert_not_reached();
×
1769
                }
1770
        }
1771

1772
        TAKE_PTR(s);
1773
        return 0;
1774
}
1775

1776
static void socket_unwatch_fds(Socket *s) {
11,640✔
1777
        int r;
11,640✔
1778

1779
        assert(s);
11,640✔
1780

1781
        LIST_FOREACH(port, p, s->ports) {
23,630✔
1782
                if (p->fd < 0)
11,990✔
1783
                        continue;
4,016✔
1784

1785
                r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
7,974✔
1786
                if (r < 0)
7,974✔
1787
                        log_unit_debug_errno(UNIT(s), r, "Failed to disable event source: %m");
×
1788
        }
1789
}
11,640✔
1790

1791
static int socket_watch_fds(Socket *s) {
7,832✔
1792
        int r;
7,832✔
1793

1794
        assert(s);
7,832✔
1795

1796
        LIST_FOREACH(port, p, s->ports) {
15,867✔
1797
                if (p->fd < 0)
8,035✔
1798
                        continue;
1✔
1799

1800
                if (p->event_source) {
8,034✔
1801
                        r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
875✔
1802
                        if (r < 0)
875✔
1803
                                goto fail;
×
1804
                } else {
1805
                        r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
7,159✔
1806
                        if (r < 0)
7,159✔
1807
                                goto fail;
×
1808

1809
                        (void) sd_event_source_set_description(p->event_source, "socket-port-io");
7,159✔
1810
                }
1811

1812
                r = sd_event_source_set_ratelimit(p->event_source, s->poll_limit.interval, s->poll_limit.burst);
8,034✔
1813
                if (r < 0)
8,034✔
1814
                        log_unit_debug_errno(UNIT(s), r, "Failed to set poll limit on I/O event source, ignoring: %m");
×
1815
        }
1816

1817
        return 0;
1818

1819
fail:
×
1820
        log_unit_warning_errno(UNIT(s), r, "Failed to watch listening fds: %m");
×
1821
        socket_unwatch_fds(s);
×
1822
        return r;
×
1823
}
1824

1825
enum {
1826
        SOCKET_OPEN_NONE,
1827
        SOCKET_OPEN_SOME,
1828
        SOCKET_OPEN_ALL,
1829
};
1830

1831
static int socket_check_open(Socket *s) {
4,694✔
1832
        bool have_open = false, have_closed = false;
4,694✔
1833

1834
        assert(s);
4,694✔
1835

1836
        LIST_FOREACH(port, p, s->ports) {
9,644✔
1837
                if (p->fd < 0)
4,950✔
1838
                        have_closed = true;
1839
                else
1840
                        have_open = true;
4,949✔
1841

1842
                if (have_open && have_closed)
4,950✔
1843
                        return SOCKET_OPEN_SOME;
1844
        }
1845

1846
        if (have_open)
4,694✔
1847
                return SOCKET_OPEN_ALL;
4,692✔
1848

1849
        return SOCKET_OPEN_NONE;
1850
}
1851

1852
static void socket_set_state(Socket *s, SocketState state) {
19,472✔
1853
        SocketState old_state;
19,472✔
1854

1855
        assert(s);
19,472✔
1856

1857
        if (s->state != state)
19,472✔
1858
                bus_unit_send_pending_change_signal(UNIT(s), false);
17,248✔
1859

1860
        old_state = s->state;
19,472✔
1861
        s->state = state;
19,472✔
1862

1863
        if (!SOCKET_STATE_WITH_PROCESS(state) && state != SOCKET_DEFERRED)
19,472✔
1864
                s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
19,227✔
1865

1866
        if (!SOCKET_STATE_WITH_PROCESS(state)) {
19,472✔
1867
                socket_unwatch_control_pid(s);
19,228✔
1868
                s->control_command = NULL;
19,228✔
1869
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
19,228✔
1870
        }
1871

1872
        if (state != SOCKET_LISTENING)
19,472✔
1873
                socket_unwatch_fds(s);
11,640✔
1874

1875
        if (!IN_SET(state,
11,640✔
1876
                    SOCKET_START_OPEN,
1877
                    SOCKET_START_CHOWN,
1878
                    SOCKET_START_POST,
1879
                    SOCKET_LISTENING,
1880
                    SOCKET_DEFERRED,
1881
                    SOCKET_RUNNING,
1882
                    SOCKET_STOP_PRE,
1883
                    SOCKET_STOP_PRE_SIGTERM,
1884
                    SOCKET_STOP_PRE_SIGKILL))
1885
                socket_close_fds(s);
3,339✔
1886

1887
        if (state != SOCKET_DEFERRED)
19,472✔
1888
                unit_remove_from_stop_notify_queue(UNIT(s));
19,471✔
1889

1890
        if (state != old_state)
19,472✔
1891
                log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state));
17,248✔
1892

1893
        unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], /* reload_success= */ true);
19,472✔
1894
}
19,472✔
1895

1896
static int socket_coldplug(Unit *u) {
7,955✔
1897
        Socket *s = ASSERT_PTR(SOCKET(u));
7,955✔
1898
        int r;
7,955✔
1899

1900
        assert(s->state == SOCKET_DEAD);
7,955✔
1901

1902
        if (s->deserialized_state == s->state)
7,955✔
1903
                return 0;
1904

1905
        /* Patch "deferred" back to "listening" and let socket_enter_running() figure out what to do.
1906
         * This saves us the trouble of handling flipping of DeferTrigger= vs Accept= during reload. */
1907
        if (s->deserialized_state == SOCKET_DEFERRED)
4,727✔
1908
                s->deserialized_state = SOCKET_LISTENING;
×
1909

1910
        if (pidref_is_set(&s->control_pid) &&
4,727✔
1911
            pidref_is_unwaited(&s->control_pid) > 0 &&
×
1912
            SOCKET_STATE_WITH_PROCESS(s->deserialized_state)) {
×
1913

1914
                r = unit_watch_pidref(UNIT(s), &s->control_pid, /* exclusive= */ false);
×
1915
                if (r < 0)
×
1916
                        return r;
1917

1918
                r = socket_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec));
×
1919
                if (r < 0)
×
1920
                        return r;
1921
        }
1922

1923
        if (IN_SET(s->deserialized_state,
4,727✔
1924
                   SOCKET_START_OPEN,
1925
                   SOCKET_START_CHOWN,
1926
                   SOCKET_START_POST,
1927
                   SOCKET_LISTENING,
1928
                   SOCKET_RUNNING)) {
1929

1930
                /* Originally, we used to simply reopen all sockets here that we didn't have file descriptors
1931
                 * for. However, this is problematic, as we won't traverse through the SOCKET_START_CHOWN
1932
                 * state for them, and thus the UID/GID wouldn't be right. Hence, instead simply check if we
1933
                 * have all fds open, and if there's a mismatch, warn loudly.
1934
                 *
1935
                 * Note that SOCKET_START_OPEN requires no special treatment, as it's only intermediate
1936
                 * between SOCKET_START_PRE and SOCKET_START_CHOWN and shall otherwise not be observed.
1937
                 * It's listed only for consistency. */
1938

1939
                r = socket_check_open(s);
4,694✔
1940
                if (r == SOCKET_OPEN_NONE)
4,694✔
1941
                        log_unit_warning(UNIT(s),
2✔
1942
                                         "Unit configuration changed while unit was running, "
1943
                                         "and no socket file descriptors are open. "
1944
                                         "Unit not functional until restarted.");
1945
                else if (r == SOCKET_OPEN_SOME)
4,692✔
1946
                        log_unit_warning(UNIT(s),
×
1947
                                         "Unit configuration changed while unit was running, "
1948
                                         "and some socket file descriptors have not been opened yet. "
1949
                                         "Unit not fully functional until restarted.");
1950
        }
1951

1952
        if (s->deserialized_state == SOCKET_LISTENING) {
4,727✔
1953
                r = socket_watch_fds(s);
3,025✔
1954
                if (r < 0)
3,025✔
1955
                        return r;
1956
        }
1957

1958
        if (!IN_SET(s->deserialized_state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_CLEANING))
4,727✔
1959
                (void) unit_setup_exec_runtime(u);
4,694✔
1960

1961
        socket_set_state(s, s->deserialized_state);
4,727✔
1962
        return 0;
4,727✔
1963
}
1964

1965
static int socket_spawn(Socket *s, ExecCommand *c, PidRef *ret_pid) {
204✔
1966
        _cleanup_(exec_params_shallow_clear) ExecParameters exec_params = EXEC_PARAMETERS_INIT(
204✔
1967
                        EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN);
1968
        _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
204✔
1969
        int r;
204✔
1970

1971
        assert(s);
204✔
1972
        assert(c);
204✔
1973
        assert(ret_pid);
204✔
1974

1975
        r = unit_prepare_exec(UNIT(s));
204✔
1976
        if (r < 0)
204✔
1977
                return r;
1978

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

1983
        r = unit_set_exec_params(UNIT(s), &exec_params);
204✔
1984
        if (r < 0)
204✔
1985
                return r;
1986

1987
        /* Note that ExecStartPre= command doesn't inherit any FDs. It runs before we open listen FDs. */
1988
        if (s->pass_fds_to_exec) {
204✔
1989
                _cleanup_strv_free_ char **fd_names = NULL;
×
1990
                _cleanup_free_ int *fds = NULL;
×
1991
                int n_fds;
×
1992

1993
                n_fds = socket_collect_fds(s, &fds);
×
1994
                if (n_fds < 0)
×
1995
                        return n_fds;
1996

1997
                r = strv_extend_n(&fd_names, socket_fdname(s), n_fds);
×
1998
                if (r < 0)
×
1999
                        return r;
2000

2001
                exec_params.fds = TAKE_PTR(fds);
×
2002
                exec_params.fd_names = TAKE_PTR(fd_names);
×
2003
                exec_params.n_socket_fds = n_fds;
×
2004
        }
2005

2006
        r = exec_spawn(UNIT(s),
204✔
2007
                       c,
2008
                       &s->exec_context,
204✔
2009
                       &exec_params,
2010
                       s->exec_runtime,
2011
                       &s->cgroup_context,
204✔
2012
                       &pidref);
2013
        if (r < 0)
204✔
2014
                return r;
2015

2016
        r = unit_watch_pidref(UNIT(s), &pidref, /* exclusive= */ true);
204✔
2017
        if (r < 0)
204✔
2018
                return r;
2019

2020
        *ret_pid = TAKE_PIDREF(pidref);
204✔
2021
        return 0;
204✔
2022
}
2023

2024
static int socket_chown(Socket *s, PidRef *ret_pid) {
40✔
2025
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
40✔
2026
        int r;
40✔
2027

2028
        assert(s);
40✔
2029
        assert(ret_pid);
40✔
2030

2031
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
40✔
2032
        if (r < 0)
40✔
2033
                return r;
2034

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

2038
        r = unit_fork_helper_process(UNIT(s), "(sd-chown)", /* into_cgroup= */ true, &pid);
40✔
2039
        if (r < 0)
164✔
2040
                return r;
2041
        if (r == 0) {
164✔
2042
                uid_t uid = UID_INVALID;
124✔
2043
                gid_t gid = GID_INVALID;
124✔
2044

2045
                /* Child */
2046

2047
                if (!isempty(s->user)) {
124✔
2048
                        const char *user = s->user;
1✔
2049

2050
                        r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0);
1✔
2051
                        if (r < 0) {
1✔
2052
                                log_unit_error_errno(UNIT(s), r,
×
2053
                                                     "Failed to resolve user '%s': %s",
2054
                                                     user, STRERROR_USER(r));
2055
                                _exit(EXIT_USER);
×
2056
                        }
2057
                }
2058

2059
                if (!isempty(s->group)) {
124✔
2060
                        const char *group = s->group;
124✔
2061

2062
                        r = get_group_creds(&group, &gid, 0);
124✔
2063
                        if (r < 0) {
124✔
2064
                                log_unit_error_errno(UNIT(s), r,
×
2065
                                                     "Failed to resolve group '%s': %s",
2066
                                                     group, STRERROR_GROUP(r));
2067
                                _exit(EXIT_GROUP);
×
2068
                        }
2069
                }
2070

2071
                LIST_FOREACH(port, p, s->ports) {
248✔
2072
                        const char *path = NULL;
124✔
2073

2074
                        if (p->type == SOCKET_SOCKET)
124✔
2075
                                path = socket_address_get_path(&p->address);
123✔
2076
                        else if (p->type == SOCKET_FIFO)
1✔
2077
                                path = p->path;
×
2078
                        else if (p->type == SOCKET_MQUEUE) {
1✔
2079
                                /* Use fchown on the fd since /dev/mqueue might not be mounted. */
2080
                                if (fchown(p->fd, uid, gid) < 0) {
1✔
2081
                                        log_unit_error_errno(UNIT(s), errno, "Failed to fchown(): %m");
×
2082
                                        _exit(EXIT_CHOWN);
×
2083
                                }
2084
                                continue;
1✔
2085
                        }
2086

2087
                        if (!path)
123✔
2088
                                continue;
×
2089

2090
                        if (chown(path, uid, gid) < 0) {
123✔
2091
                                log_unit_error_errno(UNIT(s), errno, "Failed to chown(): %m");
×
2092
                                _exit(EXIT_CHOWN);
×
2093
                        }
2094
                }
2095

2096
                _exit(EXIT_SUCCESS);
124✔
2097
        }
2098

2099
        r = unit_watch_pidref(UNIT(s), &pid, /* exclusive= */ true);
40✔
2100
        if (r < 0)
40✔
2101
                return r;
2102

2103
        *ret_pid = TAKE_PIDREF(pid);
40✔
2104
        return 0;
40✔
2105
}
2106

2107
static void socket_enter_dead(Socket *s, SocketResult f) {
3,305✔
2108
        assert(s);
3,305✔
2109

2110
        if (s->result == SOCKET_SUCCESS || IN_SET(f, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT, SOCKET_FAILURE_START_LIMIT_HIT))
3,305✔
2111
                s->result = f;
3,304✔
2112

2113
        if (s->result == SOCKET_SUCCESS)
3,305✔
2114
                unit_log_success(UNIT(s));
3,304✔
2115
        else
2116
                unit_log_failure(UNIT(s), socket_result_to_string(s->result));
1✔
2117

2118
        unit_warn_leftover_processes(UNIT(s), /* start= */ false);
3,305✔
2119

2120
        socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
6,609✔
2121

2122
        s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
3,305✔
2123

2124
        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir= */ true);
3,305✔
2125

2126
        unit_unref_uid_gid(UNIT(s), true);
3,305✔
2127
}
3,305✔
2128

2129
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
2130

2131
static void socket_enter_stop_post(Socket *s, SocketResult f) {
3,305✔
2132
        int r;
3,305✔
2133

2134
        assert(s);
3,305✔
2135

2136
        if (s->result == SOCKET_SUCCESS)
3,305✔
2137
                s->result = f;
3,304✔
2138

2139
        socket_unwatch_control_pid(s);
3,305✔
2140
        s->control_command_id = SOCKET_EXEC_STOP_POST;
3,305✔
2141
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST];
3,305✔
2142

2143
        if (s->control_command) {
3,305✔
2144
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2145
                if (r < 0) {
×
2146
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-post' task: %m");
×
2147
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2148
                        return;
×
2149
                }
2150

2151
                socket_set_state(s, SOCKET_STOP_POST);
×
2152
        } else
2153
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
3,305✔
2154
}
2155

2156
static int state_to_kill_operation(Socket *s, SocketState state) {
6,610✔
2157
        assert(s);
6,610✔
2158

2159
        if (state == SOCKET_STOP_PRE_SIGTERM)
6,610✔
2160
                return unit_has_job_type(UNIT(s), JOB_RESTART) ? KILL_RESTART : KILL_TERMINATE;
×
2161

2162
        if (state == SOCKET_FINAL_SIGTERM)
6,610✔
2163
                return KILL_TERMINATE;
3,305✔
2164

2165
        return KILL_KILL;
2166
}
2167

2168
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
6,610✔
2169
        int r;
6,610✔
2170

2171
        assert(s);
6,610✔
2172

2173
        if (s->result == SOCKET_SUCCESS)
6,610✔
2174
                s->result = f;
6,608✔
2175

2176
        r = unit_kill_context(UNIT(s), state_to_kill_operation(s, state));
6,610✔
2177
        if (r < 0) {
6,610✔
2178
                log_unit_warning_errno(UNIT(s), r, "Failed to kill processes: %m");
×
2179
                goto fail;
×
2180
        }
2181
        if (r > 0) {
6,610✔
2182
                r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
2183
                if (r < 0) {
×
2184
                        log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2185
                        goto fail;
×
2186
                }
2187

2188
                socket_set_state(s, state);
×
2189
        } else if (state == SOCKET_STOP_PRE_SIGTERM)
6,610✔
2190
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
×
2191
        else if (state == SOCKET_STOP_PRE_SIGKILL)
6,610✔
2192
                socket_enter_stop_post(s, SOCKET_SUCCESS);
×
2193
        else if (state == SOCKET_FINAL_SIGTERM)
6,610✔
2194
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
3,305✔
2195
        else
2196
                socket_enter_dead(s, SOCKET_SUCCESS);
3,305✔
2197

2198
        return;
2199

2200
fail:
×
2201
        if (IN_SET(state, SOCKET_STOP_PRE_SIGTERM, SOCKET_STOP_PRE_SIGKILL))
×
2202
                socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2203
        else
2204
                socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2205
}
2206

2207
static void socket_enter_stop_pre(Socket *s, SocketResult f) {
3,305✔
2208
        int r;
3,305✔
2209

2210
        assert(s);
3,305✔
2211

2212
        if (s->result == SOCKET_SUCCESS)
3,305✔
2213
                s->result = f;
3,305✔
2214

2215
        socket_unwatch_control_pid(s);
3,305✔
2216
        s->control_command_id = SOCKET_EXEC_STOP_PRE;
3,305✔
2217
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE];
3,305✔
2218

2219
        if (s->control_command) {
3,305✔
2220
                r = socket_spawn(s, s->control_command, &s->control_pid);
4✔
2221
                if (r < 0) {
4✔
2222
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-pre' task: %m");
×
2223
                        socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2224
                        return;
×
2225
                }
2226

2227
                socket_set_state(s, SOCKET_STOP_PRE);
4✔
2228
        } else
2229
                socket_enter_stop_post(s, SOCKET_SUCCESS);
3,301✔
2230
}
2231

2232
static void flush_ports(Socket *s) {
3✔
2233
        assert(s);
3✔
2234

2235
        /* Flush all incoming traffic, regardless if actual bytes or new connections, so that this socket isn't busy
2236
         * anymore */
2237

2238
        LIST_FOREACH(port, p, s->ports) {
6✔
2239
                if (p->fd < 0)
3✔
2240
                        continue;
×
2241

2242
                if (p->type == SOCKET_MQUEUE)
3✔
2243
                        (void) flush_mqueue(p->fd);
×
2244
                else {
2245
                        (void) flush_accept(p->fd);
3✔
2246
                        (void) flush_fd(p->fd);
3✔
2247
                }
2248
        }
2249
}
3✔
2250

2251
static void socket_enter_listening(Socket *s) {
4,807✔
2252
        int r;
4,807✔
2253

2254
        assert(s);
4,807✔
2255

2256
        if (!s->accept && s->flush_pending) {
4,807✔
2257
                log_unit_debug(UNIT(s), "Flushing socket before listening.");
3✔
2258
                flush_ports(s);
3✔
2259
        }
2260

2261
        r = socket_watch_fds(s);
4,807✔
2262
        if (r < 0) {
4,807✔
2263
                log_unit_warning_errno(UNIT(s), r, "Failed to watch sockets: %m");
×
2264
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2265
                return;
×
2266
        }
2267

2268
        socket_set_state(s, SOCKET_LISTENING);
4,807✔
2269
}
2270

2271
static void socket_enter_start_post(Socket *s) {
3,910✔
2272
        int r;
3,910✔
2273

2274
        assert(s);
3,910✔
2275

2276
        socket_unwatch_control_pid(s);
3,910✔
2277
        s->control_command_id = SOCKET_EXEC_START_POST;
3,910✔
2278
        s->control_command = s->exec_command[SOCKET_EXEC_START_POST];
3,910✔
2279

2280
        if (s->control_command) {
3,910✔
2281
                r = socket_spawn(s, s->control_command, &s->control_pid);
200✔
2282
                if (r < 0) {
200✔
2283
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-post' task: %m");
×
2284
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2285
                        return;
×
2286
                }
2287

2288
                socket_set_state(s, SOCKET_START_POST);
200✔
2289
        } else
2290
                socket_enter_listening(s);
3,710✔
2291
}
2292

2293
static void socket_enter_start_chown(Socket *s) {
3,910✔
2294
        int r;
3,910✔
2295

2296
        assert(s);
3,910✔
2297
        assert(s->state == SOCKET_START_OPEN);
3,910✔
2298

2299
        if (!isempty(s->user) || !isempty(s->group)) {
3,910✔
2300

2301
                socket_unwatch_control_pid(s);
40✔
2302
                s->control_command_id = SOCKET_EXEC_START_CHOWN;
40✔
2303
                s->control_command = NULL;
40✔
2304

2305
                r = socket_chown(s, &s->control_pid);
40✔
2306
                if (r < 0) {
40✔
2307
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-chown' task: %m");
×
2308
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2309
                        return;
×
2310
                }
2311

2312
                socket_set_state(s, SOCKET_START_CHOWN);
40✔
2313
        } else
2314
                socket_enter_start_post(s);
3,870✔
2315
}
2316

2317
static void socket_enter_start_open(Socket *s) {
3,910✔
2318
        int r;
3,910✔
2319

2320
        assert(s);
3,910✔
2321
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_START_PRE));
3,910✔
2322

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

2328
        socket_set_state(s, SOCKET_START_OPEN);
3,910✔
2329

2330
        r = socket_open_fds(s);
3,910✔
2331
        if (r < 0) {
3,910✔
2332
                log_unit_error_errno(UNIT(s), r, "Failed to listen on sockets: %m");
×
2333
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2334
                return;
×
2335
        }
2336

2337
        socket_enter_start_chown(s);
3,910✔
2338
}
2339

2340
static void socket_enter_start_pre(Socket *s) {
3,910✔
2341
        int r;
3,910✔
2342

2343
        assert(s);
3,910✔
2344

2345
        socket_unwatch_control_pid(s);
3,910✔
2346

2347
        unit_warn_leftover_processes(UNIT(s), /* start= */ true);
3,910✔
2348

2349
        s->control_command_id = SOCKET_EXEC_START_PRE;
3,910✔
2350
        s->control_command = s->exec_command[SOCKET_EXEC_START_PRE];
3,910✔
2351

2352
        if (s->control_command) {
3,910✔
2353
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2354
                if (r < 0) {
×
2355
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-pre' task: %m");
×
2356
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2357
                        return;
×
2358
                }
2359

2360
                socket_set_state(s, SOCKET_START_PRE);
×
2361
        } else
2362
                socket_enter_start_open(s);
3,910✔
2363
}
2364

2365
static bool socket_may_defer(Socket *s) {
2✔
2366
        assert(s);
2✔
2367

2368
        switch (s->defer_trigger) {
2✔
2369

2370
        case SOCKET_DEFER_NO:
2371
                return false;
2372

2373
        case SOCKET_DEFER_YES:
2374
                return !hashmap_isempty(UNIT(s)->manager->jobs);
2✔
2375

2376
        case SOCKET_DEFER_PATIENT:
×
2377
                assert(s->defer_trigger_max_usec > 0);
×
2378
                return true;
2379

2380
        default:
×
2381
                assert_not_reached();
×
2382
        }
2383
}
2384

2385
static bool socket_stop_notify(Unit *u) {
2✔
2386
        Socket *s = ASSERT_PTR(SOCKET(u));
2✔
2387
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
2✔
2388
        int r;
2✔
2389

2390
        assert(s->state == SOCKET_DEFERRED);
2✔
2391

2392
        r = manager_add_job(u->manager, JOB_START, UNIT_DEREF(s->service), JOB_LENIENT, &error, /* ret= */ NULL);
2✔
2393
        if (r >= 0) { /* Yay! */
2✔
2394
                socket_set_state(s, SOCKET_RUNNING);
×
2395
                return true; /* changed */
2396
        }
2397
        if (sd_bus_error_has_name(&error, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE)) {
2✔
2398
                if (s->defer_trigger == SOCKET_DEFER_PATIENT || !hashmap_isempty(u->manager->jobs))
2✔
2399
                        /* Wait for some more */
2400
                        return false;
2401

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

2406
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2407
        return true; /* changed */
2408
}
2409

2410
static void socket_enter_deferred(Socket *s) {
1✔
2411
        int r;
1✔
2412

2413
        assert(s);
1✔
2414
        assert(socket_may_defer(s));
1✔
2415

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

2423
        r = socket_arm_timer(s, /* relative= */ true, s->defer_trigger_max_usec);
1✔
2424
        if (r < 0) {
1✔
2425
                log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2426
                return socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2427
        }
2428

2429
        unit_add_to_stop_notify_queue(UNIT(s));
1✔
2430

2431
        /* Disable IO event sources */
2432
        socket_set_state(s, SOCKET_DEFERRED);
1✔
2433
}
2434

2435
static void socket_enter_running(Socket *s, int cfd_in) {
364✔
2436
        /* Note that this call takes possession of the connection fd passed. It either has to assign it
2437
         * somewhere or close it. */
2438
        _cleanup_close_ int cfd = cfd_in;
364✔
2439
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
364✔
2440
        int r;
364✔
2441

2442
        assert(s);
364✔
2443

2444
        /* We don't take connections anymore if we are supposed to shut down anyway */
2445
        if (unit_stop_pending(UNIT(s))) {
364✔
2446

2447
                log_unit_debug(UNIT(s), "Suppressing connection request since unit stop is scheduled.");
×
2448

2449
                if (cfd >= 0)
×
2450
                        goto refuse;
×
2451

2452
                flush_ports(s);
×
2453
                return;
2454
        }
2455

2456
        if (s->state == SOCKET_DEFERRED) {
364✔
2457
                assert(cfd < 0);
×
2458
                return;
2459
        }
2460

2461
        if (!ratelimit_below(&s->trigger_limit)) {
364✔
2462
                log_unit_warning(UNIT(s), "Trigger limit hit, refusing further activation.");
1✔
2463
                socket_enter_stop_pre(s, SOCKET_FAILURE_TRIGGER_LIMIT_HIT);
1✔
2464
                goto refuse;
1✔
2465
        }
2466

2467
        if (cfd < 0) { /* Accept=no case */
363✔
2468
                bool pending = false;
212✔
2469
                Unit *other;
212✔
2470

2471
                /* If there's already a start pending don't bother to do anything */
2472
                UNIT_FOREACH_DEPENDENCY(other, UNIT(s), UNIT_ATOM_TRIGGERS)
751✔
2473
                        if (unit_active_or_pending(other)) {
212✔
2474
                                pending = true;
2475
                                break;
2476
                        }
2477

2478
                if (!pending) {
212✔
2479
                        if (!UNIT_ISSET(s->service)) {
115✔
2480
                                log_unit_warning(UNIT(s),
×
2481
                                                 "Service to activate vanished, refusing activation.");
2482
                                goto fail;
×
2483
                        }
2484

2485
                        if (s->defer_trigger != SOCKET_DEFER_NO) {
115✔
2486
                                r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_LENIENT, &error, /* ret= */ NULL);
1✔
2487
                                if (r < 0 && sd_bus_error_has_name(&error, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE) && socket_may_defer(s))
1✔
2488
                                        /* We only check BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE here, not
2489
                                         * BUS_ERROR_TRANSACTION_JOBS_CONFLICTING or BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC,
2490
                                         * since those are errors in a single transaction, which are most likely
2491
                                         * caused by dependency issues in the unit configuration.
2492
                                         * Deferring activation probably won't help. */
2493
                                        return socket_enter_deferred(s);
1✔
2494
                        } else
2495
                                r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, /* ret= */ NULL);
114✔
2496
                        if (r < 0)
114✔
2497
                                goto queue_error;
×
2498
                }
2499

2500
                socket_set_state(s, SOCKET_RUNNING);
211✔
2501
        } else { /* Accept=yes case */
2502
                _cleanup_(socket_peer_unrefp) SocketPeer *p = NULL;
151✔
2503
                Unit *service;
151✔
2504

2505
                if (s->n_connections >= s->max_connections) {
151✔
2506
                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), dropping connection.",
×
2507
                                         s->n_connections);
2508
                        goto refuse;
×
2509
                }
2510

2511
                if (s->max_connections_per_source > 0) {
151✔
2512
                        r = socket_acquire_peer(s, cfd, &p);
143✔
2513
                        if (ERRNO_IS_NEG_DISCONNECT(r))
143✔
2514
                                return;
2515
                        if (r < 0)
143✔
2516
                                /* We didn't have enough resources to acquire peer information, let's fail. */
2517
                                goto fail;
×
2518
                        if (r > 0 && p->n_ref > s->max_connections_per_source) {
143✔
2519
                                _cleanup_free_ char *t = NULL;
×
2520

2521
                                if (p->peer.sa.sa_family == AF_UNIX)
×
2522
                                        (void) asprintf(&t, "UID " UID_FMT, p->peer_cred.uid);
×
2523
                                else
2524
                                        (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, /* translate_ipv6= */ true, /* include_port= */ false, &t);
×
2525

2526
                                log_unit_warning(UNIT(s),
×
2527
                                                 "Too many incoming connections (%u) from source %s, dropping connection.",
2528
                                                 p->n_ref, strnull(t));
2529
                                goto refuse;
×
2530
                        }
2531
                }
2532

2533
                r = socket_load_service_unit(s, cfd, &service);
151✔
2534
                if (ERRNO_IS_NEG_DISCONNECT(r))
151✔
2535
                        return;
2536
                if (r < 0 || UNIT_IS_LOAD_ERROR(service->load_state)) {
151✔
2537
                        log_unit_warning_errno(UNIT(s), r < 0 ? r : service->load_error,
×
2538
                                               "Failed to load connection service unit: %m");
2539
                        goto fail;
×
2540
                }
2541
                if (service->load_state == UNIT_MASKED) {
151✔
2542
                        log_unit_warning(UNIT(s), "Connection service unit is masked, refusing.");
×
2543
                        goto fail;
×
2544
                }
2545

2546
                s->n_accepted++;
151✔
2547

2548
                r = service_set_socket_fd(SERVICE(service), cfd, s, p, s->selinux_context_from_net);
302✔
2549
                if (ERRNO_IS_NEG_DISCONNECT(r))
151✔
2550
                        return;
2551
                if (r < 0) {
151✔
2552
                        log_unit_warning_errno(UNIT(s), r, "Failed to set socket on service: %m");
×
2553
                        goto fail;
×
2554
                }
2555

2556
                /* We passed ownership of the fd and socket peer to the service now. */
2557
                TAKE_FD(cfd);
151✔
2558
                TAKE_PTR(p);
151✔
2559

2560
                s->n_connections++;
151✔
2561

2562
                r = manager_add_job(UNIT(s)->manager, JOB_START, service, JOB_REPLACE, &error, /* ret= */ NULL);
151✔
2563
                if (r < 0) {
151✔
2564
                        /* We failed to activate the new service, but it still exists. Let's make sure the
2565
                         * service closes and forgets the connection fd again, immediately. */
2566
                        service_release_socket_fd(SERVICE(service));
×
2567
                        goto queue_error;
×
2568
                }
2569

2570
                /* Notify clients about changed counters */
2571
                unit_add_to_dbus_queue(UNIT(s));
151✔
2572
        }
2573

2574
        return;
2575

2576
refuse:
1✔
2577
        s->n_refused++;
1✔
2578
        return;
1✔
2579

2580
queue_error:
×
2581
        log_unit_warning_errno(UNIT(s), r, "Failed to queue service startup job%s: %s",
×
2582
                               cfd >= 0 && !ERRNO_IS_RESOURCE(r) ? " (Maybe the service is missing or is a template unit?)" : "",
2583
                               bus_error_message(&error, r));
2584

2585
fail:
×
2586
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2587
}
2588

2589
static void socket_run_next(Socket *s) {
×
2590
        int r;
×
2591

2592
        assert(s);
×
2593
        assert(s->control_command);
×
2594
        assert(s->control_command->command_next);
×
2595

2596
        socket_unwatch_control_pid(s);
×
2597

2598
        s->control_command = s->control_command->command_next;
×
2599

2600
        r = socket_spawn(s, s->control_command, &s->control_pid);
×
2601
        if (r < 0) {
×
2602
                log_unit_warning_errno(UNIT(s), r, "Failed to spawn next task: %m");
×
2603

2604
                if (s->state == SOCKET_START_POST)
×
2605
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2606
                else if (s->state == SOCKET_STOP_POST)
×
2607
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2608
                else
2609
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2610
        }
2611
}
×
2612

2613
static int socket_start(Unit *u) {
3,910✔
2614
        Socket *s = ASSERT_PTR(SOCKET(u));
3,910✔
2615
        int r;
3,910✔
2616

2617
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
3,910✔
2618

2619
        r = unit_acquire_invocation_id(u);
3,910✔
2620
        if (r < 0)
3,910✔
2621
                return r;
2622

2623
        s->result = SOCKET_SUCCESS;
3,910✔
2624
        exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
3,910✔
2625

2626
        if (s->cgroup_runtime)
3,910✔
2627
                s->cgroup_runtime->reset_accounting = true;
4✔
2628

2629
        socket_enter_start_pre(s);
3,910✔
2630
        return 1;
3,910✔
2631
}
2632

2633
static int socket_stop(Unit *u) {
3,304✔
2634
        Socket *s = ASSERT_PTR(SOCKET(u));
3,304✔
2635

2636
        /* Already on it */
2637
        if (IN_SET(s->state,
3,304✔
2638
                   SOCKET_STOP_PRE,
2639
                   SOCKET_STOP_PRE_SIGTERM,
2640
                   SOCKET_STOP_PRE_SIGKILL,
2641
                   SOCKET_STOP_POST,
2642
                   SOCKET_FINAL_SIGTERM,
2643
                   SOCKET_FINAL_SIGKILL))
2644
                return 0;
2645

2646
        /* If there's already something running we go directly into
2647
         * kill mode. */
2648
        if (IN_SET(s->state,
3,304✔
2649
                   SOCKET_START_PRE,
2650
                   SOCKET_START_OPEN,
2651
                   SOCKET_START_CHOWN,
2652
                   SOCKET_START_POST)) {
2653
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
×
2654
                return -EAGAIN;
×
2655
        }
2656

2657
        /* If we are currently cleaning, then abort it, brutally. */
2658
        if (s->state == SOCKET_CLEANING) {
3,304✔
2659
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
×
2660
                return 0;
×
2661
        }
2662

2663
        assert(IN_SET(s->state, SOCKET_LISTENING, SOCKET_DEFERRED, SOCKET_RUNNING));
3,304✔
2664

2665
        socket_enter_stop_pre(s, SOCKET_SUCCESS);
3,304✔
2666
        return 1;
3,304✔
2667
}
2668

2669
static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
7,298✔
2670
        Socket *s = ASSERT_PTR(SOCKET(u));
7,298✔
2671
        int r;
7,298✔
2672

2673
        assert(f);
7,298✔
2674
        assert(fds);
7,298✔
2675

2676
        (void) serialize_item(f, "state", socket_state_to_string(s->state));
7,298✔
2677
        (void) serialize_item(f, "result", socket_result_to_string(s->result));
7,298✔
2678
        (void) serialize_item_format(f, "n-accepted", "%u", s->n_accepted);
7,298✔
2679
        (void) serialize_item_format(f, "n-refused", "%u", s->n_refused);
7,298✔
2680
        (void) serialize_pidref(f, fds, "control-pid", &s->control_pid);
7,298✔
2681

2682
        if (s->control_command_id >= 0)
7,298✔
2683
                (void) serialize_item(f, "control-command", socket_exec_command_to_string(s->control_command_id));
×
2684

2685
        LIST_FOREACH(port, p, s->ports) {
14,893✔
2686
                int copy;
7,595✔
2687

2688
                if (p->fd < 0)
7,595✔
2689
                        continue;
2,212✔
2690

2691
                copy = fdset_put_dup(fds, p->fd);
5,383✔
2692
                if (copy < 0)
5,383✔
2693
                        return log_unit_warning_errno(u, copy, "Failed to serialize socket fd: %m");
×
2694

2695
                if (p->type == SOCKET_SOCKET) {
5,383✔
2696
                        _cleanup_free_ char *t = NULL;
5,089✔
2697

2698
                        r = socket_address_print(&p->address, &t);
5,089✔
2699
                        if (r < 0)
5,089✔
2700
                                return log_unit_error_errno(u, r, "Failed to format socket address: %m");
×
2701

2702
                        if (socket_address_family(&p->address) == AF_NETLINK)
5,089✔
2703
                                (void) serialize_item_format(f, "netlink", "%i %s", copy, t);
196✔
2704
                        else
2705
                                (void) serialize_item_format(f, "socket", "%i %i %s", copy, p->address.type, t);
4,893✔
2706
                } else if (p->type == SOCKET_SPECIAL)
2707
                        (void) serialize_item_format(f, "special", "%i %s", copy, p->path);
18✔
2708
                else if (p->type == SOCKET_MQUEUE)
2709
                        (void) serialize_item_format(f, "mqueue", "%i %s", copy, p->path);
×
2710
                else if (p->type == SOCKET_USB_FUNCTION)
2711
                        (void) serialize_item_format(f, "ffs", "%i %s", copy, p->path);
×
2712
                else {
2713
                        assert(p->type == SOCKET_FIFO);
×
2714
                        (void) serialize_item_format(f, "fifo", "%i %s", copy, p->path);
276✔
2715
                }
2716
        }
2717

2718
        (void) serialize_ratelimit(f, "trigger-ratelimit", &s->trigger_limit);
7,298✔
2719

2720
        return 0;
7,298✔
2721
}
2722

2723
static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
37,595✔
2724
        Socket *s = ASSERT_PTR(SOCKET(u));
37,595✔
2725
        int r;
37,595✔
2726

2727
        assert(key);
37,595✔
2728
        assert(value);
37,595✔
2729

2730
        if (streq(key, "state")) {
37,595✔
2731
                SocketState state;
6,529✔
2732

2733
                state = socket_state_from_string(value);
6,529✔
2734
                if (state < 0)
6,529✔
2735
                        log_unit_debug(u, "Failed to parse state value: %s", value);
×
2736
                else
2737
                        s->deserialized_state = state;
6,529✔
2738
        } else if (streq(key, "result")) {
31,066✔
2739
                SocketResult f;
6,529✔
2740

2741
                f = socket_result_from_string(value);
6,529✔
2742
                if (f < 0)
6,529✔
2743
                        log_unit_debug(u, "Failed to parse result value: %s", value);
×
2744
                else if (f != SOCKET_SUCCESS)
6,529✔
2745
                        s->result = f;
33✔
2746

2747
        } else if (streq(key, "n-accepted")) {
24,537✔
2748
                unsigned k;
6,529✔
2749

2750
                if (safe_atou(value, &k) < 0)
6,529✔
2751
                        log_unit_debug(u, "Failed to parse n-accepted value: %s", value);
×
2752
                else
2753
                        s->n_accepted += k;
6,529✔
2754
        } else if (streq(key, "n-refused")) {
18,008✔
2755
                unsigned k;
6,529✔
2756

2757
                if (safe_atou(value, &k) < 0)
6,529✔
2758
                        log_unit_debug(u, "Failed to parse n-refused value: %s", value);
×
2759
                else
2760
                        s->n_refused += k;
6,529✔
2761
        } else if (streq(key, "control-pid")) {
11,479✔
2762

2763
                if (!pidref_is_set(&s->control_pid))
37,595✔
2764
                        (void) deserialize_pidref(fds, value, &s->control_pid);
×
2765

2766
        } else if (streq(key, "control-command")) {
11,479✔
2767
                SocketExecCommand id;
×
2768

2769
                id = socket_exec_command_from_string(value);
×
2770
                if (id < 0)
×
2771
                        log_unit_debug(u, "Failed to parse exec-command value: %s", value);
×
2772
                else {
2773
                        s->control_command_id = id;
×
2774
                        s->control_command = s->exec_command[id];
×
2775
                }
2776
        } else if (streq(key, "fifo")) {
11,479✔
2777
                _cleanup_free_ char *fdv = NULL;
254✔
2778
                bool found = false;
254✔
2779
                int fd;
254✔
2780

2781
                r = extract_first_word(&value, &fdv, NULL, 0);
254✔
2782
                if (r <= 0) {
254✔
2783
                        log_unit_debug(u, "Failed to parse fifo value: %s", value);
×
2784
                        return 0;
×
2785
                }
2786

2787
                fd = parse_fd(fdv);
254✔
2788
                if (fd < 0 || !fdset_contains(fds, fd)) {
254✔
2789
                        log_unit_debug(u, "Invalid fifo value: %s", fdv);
×
2790
                        return 0;
×
2791
                }
2792

2793
                LIST_FOREACH(port, p, s->ports)
381✔
2794
                        if (p->fd < 0 &&
381✔
2795
                            p->type == SOCKET_FIFO &&
254✔
2796
                            path_equal_or_inode_same(p->path, value, 0)) {
254✔
2797
                                p->fd = fdset_remove(fds, fd);
254✔
2798
                                found = true;
254✔
2799
                                break;
254✔
2800
                        }
2801
                if (!found)
254✔
2802
                        log_unit_debug(u, "No matching fifo socket found: %s", value);
×
2803

2804
        } else if (streq(key, "special")) {
11,225✔
2805
                _cleanup_free_ char *fdv = NULL;
15✔
2806
                bool found = false;
15✔
2807
                int fd;
15✔
2808

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

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

2821
                LIST_FOREACH(port, p, s->ports)
15✔
2822
                        if (p->fd < 0 &&
15✔
2823
                            p->type == SOCKET_SPECIAL &&
15✔
2824
                            path_equal_or_inode_same(p->path, value, 0)) {
15✔
2825
                                p->fd = fdset_remove(fds, fd);
15✔
2826
                                found = true;
15✔
2827
                                break;
15✔
2828
                        }
2829
                if (!found)
15✔
2830
                        log_unit_debug(u, "No matching special socket found: %s", value);
×
2831

2832
        } else if (streq(key, "mqueue")) {
11,210✔
2833
                _cleanup_free_ char *fdv = NULL;
×
2834
                bool found = false;
×
2835
                int fd;
×
2836

2837
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2838
                if (r <= 0) {
×
2839
                        log_unit_debug(u, "Failed to parse mqueue value: %s", value);
×
2840
                        return 0;
×
2841
                }
2842

2843
                fd = parse_fd(fdv);
×
2844
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2845
                        log_unit_debug(u, "Invalid mqueue value: %s", fdv);
×
2846
                        return 0;
×
2847
                }
2848

2849
                LIST_FOREACH(port, p, s->ports)
×
2850
                        if (p->fd < 0 &&
×
2851
                            p->type == SOCKET_MQUEUE &&
×
2852
                            streq(p->path, value)) {
×
2853
                                p->fd = fdset_remove(fds, fd);
×
2854
                                found = true;
×
2855
                                break;
×
2856
                        }
2857
                if (!found)
×
2858
                        log_unit_debug(u, "No matching mqueue socket found: %s", value);
×
2859

2860
        } else if (streq(key, "socket")) {
11,210✔
2861
                _cleanup_free_ char *fdv = NULL, *typev = NULL;
4,518✔
2862
                bool found = false;
4,518✔
2863
                int fd, type;
4,518✔
2864

2865
                r = extract_first_word(&value, &fdv, NULL, 0);
4,518✔
2866
                if (r <= 0) {
4,518✔
2867
                        log_unit_debug(u, "Failed to parse socket fd from value: %s", value);
×
2868
                        return 0;
×
2869
                }
2870

2871
                fd = parse_fd(fdv);
4,518✔
2872
                if (fd < 0 || !fdset_contains(fds, fd)) {
4,518✔
2873
                        log_unit_debug(u, "Invalid socket fd: %s", fdv);
×
2874
                        return 0;
×
2875
                }
2876

2877
                r = extract_first_word(&value, &typev, NULL, 0);
4,518✔
2878
                if (r <= 0) {
4,518✔
2879
                        log_unit_debug(u, "Failed to parse socket type from value: %s", value);
×
2880
                        return 0;
×
2881
                }
2882

2883
                if (safe_atoi(typev, &type) < 0 || type < 0) {
4,518✔
2884
                        log_unit_debug(u, "Invalid socket type: %s", typev);
×
2885
                        return 0;
×
2886
                }
2887

2888
                LIST_FOREACH(port, p, s->ports)
4,648✔
2889
                        if (p->fd < 0 &&
9,164✔
2890
                            socket_address_is(&p->address, value, type)) {
4,517✔
2891
                                p->fd = fdset_remove(fds, fd);
4,517✔
2892
                                found = true;
4,517✔
2893
                                break;
4,517✔
2894
                        }
2895
                if (!found)
4,517✔
2896
                        log_unit_debug(u, "No matching %s socket found: %s",
1✔
2897
                                       socket_address_type_to_string(type), value);
2898

2899
        } else if (streq(key, "netlink")) {
6,692✔
2900
                _cleanup_free_ char *fdv = NULL;
163✔
2901
                bool found = false;
163✔
2902
                int fd;
163✔
2903

2904
                r = extract_first_word(&value, &fdv, NULL, 0);
163✔
2905
                if (r <= 0) {
163✔
2906
                        log_unit_debug(u, "Failed to parse socket value: %s", value);
×
2907
                        return 0;
×
2908
                }
2909

2910
                fd = parse_fd(fdv);
163✔
2911
                if (fd < 0 || !fdset_contains(fds, fd)) {
163✔
2912
                        log_unit_debug(u, "Invalid socket value: %s", fdv);
×
2913
                        return 0;
×
2914
                }
2915

2916
                LIST_FOREACH(port, p, s->ports)
163✔
2917
                        if (p->fd < 0 &&
326✔
2918
                            socket_address_is_netlink(&p->address, value)) {
163✔
2919
                                p->fd = fdset_remove(fds, fd);
163✔
2920
                                found = true;
163✔
2921
                                break;
163✔
2922
                        }
2923
                if (!found)
163✔
2924
                        log_unit_debug(u, "No matching netlink socket found: %s", value);
×
2925

2926
        } else if (streq(key, "ffs")) {
6,529✔
2927
                _cleanup_free_ char *fdv = NULL;
×
2928
                bool found = false;
×
2929
                int fd;
×
2930

2931
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2932
                if (r <= 0) {
×
2933
                        log_unit_debug(u, "Failed to parse ffs value: %s", value);
×
2934
                        return 0;
×
2935
                }
2936

2937
                fd = parse_fd(fdv);
×
2938
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2939
                        log_unit_debug(u, "Invalid ffs value: %s", fdv);
×
2940
                        return 0;
×
2941
                }
2942

2943
                LIST_FOREACH(port, p, s->ports)
×
2944
                        if (p->fd < 0 &&
×
2945
                            p->type == SOCKET_USB_FUNCTION &&
×
2946
                            path_equal_or_inode_same(p->path, value, 0)) {
×
2947
                                p->fd = fdset_remove(fds, fd);
×
2948
                                found = true;
×
2949
                                break;
×
2950
                        }
2951
                if (!found)
×
2952
                        log_unit_debug(u, "No matching ffs socket found: %s", value);
×
2953

2954
        } else if (streq(key, "trigger-ratelimit"))
6,529✔
2955
                deserialize_ratelimit(&s->trigger_limit, key, value);
6,529✔
2956
        else
2957
                log_unit_debug(UNIT(s), "Unknown serialization key: %s", key);
×
2958

2959
        return 0;
2960
}
2961

2962
static void socket_distribute_fds(Unit *u, FDSet *fds) {
1,212✔
2963
        Socket *s = ASSERT_PTR(SOCKET(u));
1,212✔
2964

2965
        LIST_FOREACH(port, p, s->ports) {
2,476✔
2966
                int fd;
1,264✔
2967

2968
                if (p->type != SOCKET_SOCKET)
1,264✔
2969
                        continue;
57✔
2970

2971
                if (p->fd >= 0)
1,207✔
2972
                        continue;
785✔
2973

2974
                FDSET_FOREACH(fd, fds) {
1,986✔
2975
                        if (socket_address_matches_fd(&p->address, fd)) {
1,564✔
2976
                                p->fd = fdset_remove(fds, fd);
×
2977
                                s->deserialized_state = SOCKET_LISTENING;
×
2978
                                break;
×
2979
                        }
2980
                }
2981
        }
2982
}
1,212✔
2983

2984
static UnitActiveState socket_active_state(Unit *u) {
863,485✔
2985
        Socket *s = ASSERT_PTR(SOCKET(u));
863,485✔
2986

2987
        return state_translation_table[s->state];
863,485✔
2988
}
2989

2990
static const char *socket_sub_state_to_string(Unit *u) {
6,935✔
2991
        Socket *s = ASSERT_PTR(SOCKET(u));
6,935✔
2992

2993
        return socket_state_to_string(s->state);
6,935✔
2994
}
2995

2996
int socket_port_to_address(const SocketPort *p, char **ret) {
100✔
2997
        _cleanup_free_ char *address = NULL;
100✔
2998
        int r;
100✔
2999

3000
        assert(p);
100✔
3001
        assert(ret);
100✔
3002

3003
        switch (p->type) {
100✔
3004
                case SOCKET_SOCKET: {
96✔
3005
                        r = socket_address_print(&p->address, &address);
96✔
3006
                        if (r < 0)
96✔
3007
                                return r;
3008

3009
                        break;
3010
                }
3011

3012
                case SOCKET_SPECIAL:
4✔
3013
                case SOCKET_MQUEUE:
3014
                case SOCKET_FIFO:
3015
                case SOCKET_USB_FUNCTION:
3016
                        address = strdup(p->path);
4✔
3017
                        if (!address)
4✔
3018
                                return -ENOMEM;
3019
                        break;
3020

3021
                default:
×
3022
                        assert_not_reached();
×
3023
        }
3024

3025
        *ret = TAKE_PTR(address);
100✔
3026

3027
        return 0;
100✔
3028
}
3029

3030
const char* socket_port_type_to_string(SocketPort *p) {
100✔
3031
        assert(p);
100✔
3032

3033
        switch (p->type) {
100✔
3034

3035
        case SOCKET_SOCKET:
96✔
3036

3037
                switch (p->address.type) {
96✔
3038

3039
                case SOCK_STREAM:
3040
                        return "Stream";
3041

3042
                case SOCK_DGRAM:
6✔
3043
                        return "Datagram";
6✔
3044

3045
                case SOCK_SEQPACKET:
4✔
3046
                        return "SequentialPacket";
4✔
3047

3048
                case SOCK_RAW:
6✔
3049
                        if (socket_address_family(&p->address) == AF_NETLINK)
6✔
3050
                                return "Netlink";
3051

3052
                        _fallthrough_;
×
3053
                default:
3054
                        return NULL;
×
3055
                }
3056

3057
        case SOCKET_SPECIAL:
3058
                return "Special";
3059

3060
        case SOCKET_MQUEUE:
×
3061
                return "MessageQueue";
×
3062

3063
        case SOCKET_FIFO:
4✔
3064
                return "FIFO";
4✔
3065

3066
        case SOCKET_USB_FUNCTION:
×
3067
                return "USBFunction";
×
3068

3069
        default:
×
3070
                return NULL;
×
3071
        }
3072
}
3073

3074
SocketType socket_port_type_from_string(const char *s) {
2✔
3075
        assert(s);
2✔
3076

3077
        if (STR_IN_SET(s, "Stream", "Datagram", "SequentialPacket", "Netlink"))
2✔
3078
                return SOCKET_SOCKET;
2✔
3079
        else if (streq(s, "Special"))
2✔
3080
                return SOCKET_SPECIAL;
3081
        else if (streq(s, "MessageQueue"))
2✔
3082
                return SOCKET_MQUEUE;
3083
        else if (streq(s, "FIFO"))
2✔
3084
                return SOCKET_FIFO;
3085
        else if (streq(s, "USBFunction"))
×
3086
                return SOCKET_USB_FUNCTION;
3087
        else
3088
                return _SOCKET_TYPE_INVALID;
×
3089
}
3090

3091
static bool socket_may_gc(Unit *u) {
24,273✔
3092
        Socket *s = ASSERT_PTR(SOCKET(u));
24,273✔
3093

3094
        return s->n_connections == 0;
24,273✔
3095
}
3096

3097
static int socket_accept_do(Socket *s, int fd) {
153✔
3098
        int cfd;
153✔
3099

3100
        assert(s);
153✔
3101
        assert(fd >= 0);
153✔
3102

3103
        cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
153✔
3104
        if (cfd < 0)
153✔
3105
                /* Convert transient network errors into clean and well-defined EAGAIN */
3106
                return ERRNO_IS_ACCEPT_AGAIN(errno) ? -EAGAIN : -errno;
×
3107

3108
        return cfd;
3109
}
3110

3111
static int socket_accept_in_cgroup(Socket *s, SocketPort *p, int fd) {
151✔
3112
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
3113
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
151✔
3114
        int cfd, r;
151✔
3115

3116
        assert(s);
151✔
3117
        assert(p);
151✔
3118
        assert(fd >= 0);
151✔
3119

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

3123
        if (!IN_SET(p->address.sockaddr.sa.sa_family, AF_INET, AF_INET6))
151✔
3124
                goto shortcut;
151✔
3125

3126
        if (bpf_program_supported() <= 0)
×
3127
                goto shortcut;
×
3128

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

3132
        r = unit_fork_helper_process(UNIT(s), "(sd-accept)", /* into_cgroup= */ true, &pid);
×
3133
        if (r < 0)
2✔
3134
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off accept stub process: %m");
×
3135
        if (r == 0) {
2✔
3136
                /* Child */
3137

3138
                pair[0] = safe_close(pair[0]);
2✔
3139

3140
                cfd = socket_accept_do(s, fd);
2✔
3141
                if (cfd == -EAGAIN) /* spurious accept() */
2✔
3142
                        _exit(EXIT_SUCCESS);
×
3143
                if (cfd < 0) {
2✔
3144
                        log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3145
                        _exit(EXIT_FAILURE);
×
3146
                }
3147

3148
                r = send_one_fd(pair[1], cfd, 0);
2✔
3149
                if (r < 0) {
2✔
3150
                        log_unit_error_errno(UNIT(s), r, "Failed to send connection socket to parent: %m");
×
3151
                        _exit(EXIT_FAILURE);
×
3152
                }
3153

3154
                _exit(EXIT_SUCCESS);
2✔
3155
        }
3156

3157
        pair[1] = safe_close(pair[1]);
×
3158
        cfd = receive_one_fd(pair[0], 0);
×
3159

3160
        /* We synchronously wait for the helper, as it shouldn't be slow */
3161
        r = pidref_wait_for_terminate_and_check("(sd-accept)", &pid, WAIT_LOG_ABNORMAL);
×
3162
        if (r < 0) {
×
3163
                safe_close(cfd);
×
3164
                return r;
3165
        }
3166

3167
        /* If we received no fd, we got EIO here. If this happens with a process exit code of EXIT_SUCCESS
3168
         * this is a spurious accept(), let's convert that back to EAGAIN here. */
3169
        if (cfd == -EIO && r == EXIT_SUCCESS)
×
3170
                return -EAGAIN;
3171
        if (cfd < 0)
×
3172
                return log_unit_error_errno(UNIT(s), cfd, "Failed to receive connection socket: %m");
×
3173

3174
        return cfd;
3175

3176
shortcut:
151✔
3177
        cfd = socket_accept_do(s, fd);
151✔
3178
        if (cfd == -EAGAIN) /* spurious accept(), skip it silently */
151✔
3179
                return -EAGAIN;
3180
        if (cfd < 0)
151✔
3181
                return log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3182

3183
        return cfd;
3184
}
3185

3186
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
364✔
3187
        SocketPort *p = ASSERT_PTR(userdata);
364✔
3188
        int cfd = -EBADF;
364✔
3189

3190
        assert(fd >= 0);
364✔
3191

3192
        if (p->socket->state != SOCKET_LISTENING)
364✔
3193
                return 0;
3194

3195
        log_unit_debug(UNIT(p->socket), "Incoming traffic");
364✔
3196

3197
        if (revents != EPOLLIN) {
364✔
3198
                if (revents & EPOLLHUP)
×
3199
                        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.");
×
3200
                else
3201
                        log_unit_error(UNIT(p->socket), "Got unexpected poll event (0x%x) on socket.", revents);
×
3202
                goto fail;
×
3203
        }
3204

3205
        if (p->socket->accept &&
364✔
3206
            p->type == SOCKET_SOCKET &&
302✔
3207
            socket_address_can_accept(&p->address)) {
151✔
3208

3209
                cfd = socket_accept_in_cgroup(p->socket, p, fd);
151✔
3210
                if (cfd == -EAGAIN) /* Spurious accept() */
151✔
3211
                        return 0;
3212
                if (cfd < 0)
151✔
3213
                        goto fail;
×
3214

3215
                socket_apply_socket_options(p->socket, p, cfd);
151✔
3216
        }
3217

3218
        socket_enter_running(p->socket, cfd);
364✔
3219
        return 0;
364✔
3220

3221
fail:
×
3222
        socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
×
3223
        return 0;
×
3224
}
3225

3226
static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
244✔
3227
        Socket *s = ASSERT_PTR(SOCKET(u));
244✔
3228
        SocketResult f;
244✔
3229

3230
        assert(pid >= 0);
244✔
3231

3232
        if (pid != s->control_pid.pid)
244✔
3233
                return;
3234

3235
        pidref_done(&s->control_pid);
244✔
3236

3237
        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
244✔
3238
                f = SOCKET_SUCCESS;
3239
        else if (code == CLD_EXITED)
×
3240
                f = SOCKET_FAILURE_EXIT_CODE;
3241
        else if (code == CLD_KILLED)
3242
                f = SOCKET_FAILURE_SIGNAL;
3243
        else if (code == CLD_DUMPED)
3244
                f = SOCKET_FAILURE_CORE_DUMP;
3245
        else
3246
                assert_not_reached();
×
3247

3248
        if (s->control_command) {
244✔
3249
                exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
204✔
3250

3251
                if (s->control_command->flags & EXEC_COMMAND_IGNORE_FAILURE)
204✔
3252
                        f = SOCKET_SUCCESS;
204✔
3253
        }
3254

3255
        unit_log_process_exit(
244✔
3256
                        u,
3257
                        "Control process",
3258
                        socket_exec_command_to_string(s->control_command_id),
3259
                        f == SOCKET_SUCCESS,
3260
                        code, status);
3261

3262
        if (s->result == SOCKET_SUCCESS)
244✔
3263
                s->result = f;
244✔
3264

3265
        if (s->control_command &&
244✔
3266
            s->control_command->command_next &&
204✔
3267
            f == SOCKET_SUCCESS) {
3268

3269
                log_unit_debug(u, "Running next command for state %s", socket_state_to_string(s->state));
×
3270
                socket_run_next(s);
×
3271
        } else {
3272
                s->control_command = NULL;
244✔
3273
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
244✔
3274

3275
                /* No further commands for this step, so let's figure
3276
                 * out what to do next */
3277

3278
                log_unit_debug(u, "Got final SIGCHLD for state %s", socket_state_to_string(s->state));
244✔
3279

3280
                switch (s->state) {
244✔
3281

3282
                case SOCKET_START_PRE:
×
3283
                        if (f == SOCKET_SUCCESS)
×
3284
                                socket_enter_start_open(s);
×
3285
                        else
3286
                                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
×
3287
                        break;
3288

3289
                case SOCKET_START_CHOWN:
40✔
3290
                        if (f == SOCKET_SUCCESS)
40✔
3291
                                socket_enter_start_post(s);
40✔
3292
                        else
3293
                                socket_enter_stop_pre(s, f);
×
3294
                        break;
3295

3296
                case SOCKET_START_POST:
200✔
3297
                        if (f == SOCKET_SUCCESS)
200✔
3298
                                socket_enter_listening(s);
200✔
3299
                        else
3300
                                socket_enter_stop_pre(s, f);
×
3301
                        break;
3302

3303
                case SOCKET_STOP_PRE:
4✔
3304
                case SOCKET_STOP_PRE_SIGTERM:
3305
                case SOCKET_STOP_PRE_SIGKILL:
3306
                        socket_enter_stop_post(s, f);
4✔
3307
                        break;
4✔
3308

3309
                case SOCKET_STOP_POST:
×
3310
                case SOCKET_FINAL_SIGTERM:
3311
                case SOCKET_FINAL_SIGKILL:
3312
                        socket_enter_dead(s, f);
×
3313
                        break;
×
3314

3315
                case SOCKET_CLEANING:
×
3316

3317
                        if (s->clean_result == SOCKET_SUCCESS)
×
3318
                                s->clean_result = f;
×
3319

3320
                        socket_enter_dead(s, SOCKET_SUCCESS);
×
3321
                        break;
×
3322

3323
                default:
×
3324
                        assert_not_reached();
×
3325
                }
3326
        }
3327

3328
        /* Notify clients about changed exit status */
3329
        unit_add_to_dbus_queue(u);
244✔
3330
}
3331

3332
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
×
3333
        Socket *s = ASSERT_PTR(SOCKET(userdata));
×
3334

3335
        assert(s->timer_event_source == source);
×
3336

3337
        switch (s->state) {
×
3338

3339
        case SOCKET_START_PRE:
3340
                log_unit_warning(UNIT(s), "Starting timed out. Terminating.");
×
3341
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3342
                break;
×
3343

3344
        case SOCKET_START_CHOWN:
3345
        case SOCKET_START_POST:
3346
                log_unit_warning(UNIT(s), "Starting timed out. Stopping.");
×
3347
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3348
                break;
×
3349

3350
        case SOCKET_DEFERRED:
3351
                log_unit_warning(UNIT(s), "DeferTriggerMaxSec= elapsed. Stopping.");
×
3352
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3353
                break;
×
3354

3355
        case SOCKET_STOP_PRE:
3356
                log_unit_warning(UNIT(s), "Stopping timed out. Terminating.");
×
3357
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3358
                break;
×
3359

3360
        case SOCKET_STOP_PRE_SIGTERM:
×
3361
                if (s->kill_context.send_sigkill) {
×
3362
                        log_unit_warning(UNIT(s), "Stopping timed out. Killing.");
×
3363
                        socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3364
                } else {
3365
                        log_unit_warning(UNIT(s), "Stopping timed out. Skipping SIGKILL. Ignoring.");
×
3366
                        socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3367
                }
3368
                break;
3369

3370
        case SOCKET_STOP_PRE_SIGKILL:
3371
                log_unit_warning(UNIT(s), "Processes still around after SIGKILL. Ignoring.");
×
3372
                socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3373
                break;
×
3374

3375
        case SOCKET_STOP_POST:
3376
                log_unit_warning(UNIT(s), "Stopping timed out (2). Terminating.");
×
3377
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3378
                break;
×
3379

3380
        case SOCKET_FINAL_SIGTERM:
×
3381
                if (s->kill_context.send_sigkill) {
×
3382
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Killing.");
×
3383
                        socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3384
                } else {
3385
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
×
3386
                        socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3387
                }
3388
                break;
3389

3390
        case SOCKET_FINAL_SIGKILL:
3391
                log_unit_warning(UNIT(s), "Still around after SIGKILL (2). Entering failed mode.");
×
3392
                socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3393
                break;
×
3394

3395
        case SOCKET_CLEANING:
3396
                log_unit_warning(UNIT(s), "Cleaning timed out. killing.");
×
3397

3398
                if (s->clean_result == SOCKET_SUCCESS)
×
3399
                        s->clean_result = SOCKET_FAILURE_TIMEOUT;
×
3400

3401
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, 0);
×
3402
                break;
×
3403

3404
        default:
×
3405
                assert_not_reached();
×
3406
        }
3407

3408
        return 0;
×
3409
}
3410

3411
int socket_collect_fds(Socket *s, int **ret) {
691✔
3412
        size_t n = 0, k = 0;
691✔
3413

3414
        assert(s);
691✔
3415
        assert(ret);
691✔
3416

3417
        /* Called from the service code for requesting our fds */
3418

3419
        LIST_FOREACH(port, p, s->ports) {
1,419✔
3420
                if (p->fd >= 0)
728✔
3421
                        n++;
709✔
3422
                n += p->n_auxiliary_fds;
728✔
3423
        }
3424

3425
        if (n == 0) {
691✔
3426
                *ret = NULL;
19✔
3427
                return 0;
19✔
3428
        }
3429

3430
        int *fds = new(int, n);
672✔
3431
        if (!fds)
672✔
3432
                return -ENOMEM;
3433

3434
        LIST_FOREACH(port, p, s->ports) {
1,381✔
3435
                if (p->fd >= 0)
709✔
3436
                        fds[k++] = p->fd;
709✔
3437
                FOREACH_ARRAY(i, p->auxiliary_fds, p->n_auxiliary_fds)
709✔
3438
                        fds[k++] = *i;
×
3439
        }
3440

3441
        assert(k == n);
672✔
3442

3443
        *ret = fds;
672✔
3444
        return (int) n;
672✔
3445
}
3446

3447
static void socket_reset_failed(Unit *u) {
191✔
3448
        Socket *s = SOCKET(u);
191✔
3449

3450
        assert(s);
×
3451

3452
        if (s->state == SOCKET_FAILED)
191✔
3453
                socket_set_state(s, SOCKET_DEAD);
1✔
3454

3455
        s->result = SOCKET_SUCCESS;
191✔
3456
        s->clean_result = SOCKET_SUCCESS;
191✔
3457
}
191✔
3458

3459
void socket_connection_unref(Socket *s) {
151✔
3460
        assert(s);
151✔
3461

3462
        /* The service is dead. Yay!
3463
         *
3464
         * This is strictly for one-instance-per-connection
3465
         * services. */
3466

3467
        assert(s->n_connections > 0);
151✔
3468
        s->n_connections--;
151✔
3469

3470
        log_unit_debug(UNIT(s), "One connection closed, %u left.", s->n_connections);
151✔
3471
}
151✔
3472

3473
static void socket_trigger_notify(Unit *u, Unit *other) {
5,762✔
3474
        Socket *s = ASSERT_PTR(SOCKET(u));
5,762✔
3475

3476
        assert(other);
5,762✔
3477

3478
        /* Filter out invocations with bogus state */
3479
        assert(UNIT_IS_LOAD_COMPLETE(other->load_state));
5,762✔
3480

3481
        Service *service = ASSERT_PTR(SERVICE(other));
5,762✔
3482

3483
        /* Don't propagate state changes from the service if we are already down */
3484
        if (!IN_SET(s->state, SOCKET_RUNNING, SOCKET_LISTENING, SOCKET_DEFERRED))
5,762✔
3485
                return;
3486

3487
        /* We don't care for the service state if we are in Accept=yes mode */
3488
        if (s->accept)
4,641✔
3489
                return;
3490

3491
        /* Propagate start limit hit state */
3492
        if (other->start_limit_hit) {
4,177✔
3493
                socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT);
×
3494
                return;
×
3495
        }
3496

3497
        /* Don't propagate anything if there's still a job queued */
3498
        if (other->job)
4,177✔
3499
                return;
3500

3501
        if (!SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize= */ true))
3,256✔
3502
                socket_enter_listening(s);
897✔
3503

3504
        if (SERVICE(other)->state == SERVICE_RUNNING)
3,256✔
3505
                socket_set_state(s, SOCKET_RUNNING);
2,266✔
3506
}
3507

3508
static void socket_handoff_timestamp(
408✔
3509
                Unit *u,
3510
                const struct ucred *ucred,
3511
                const dual_timestamp *ts) {
3512

3513
        Socket *s = ASSERT_PTR(SOCKET(u));
408✔
3514

3515
        assert(ucred);
408✔
3516
        assert(ts);
408✔
3517

3518
        if (s->control_pid.pid == ucred->pid && s->control_command) {
408✔
3519
                exec_status_handoff(&s->control_command->exec_status, ucred, ts);
408✔
3520
                unit_add_to_dbus_queue(u);
408✔
3521
        }
3522
}
408✔
3523

3524
static int socket_get_timeout(Unit *u, usec_t *timeout) {
×
3525
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3526
        usec_t t;
×
3527
        int r;
×
3528

3529
        assert(timeout);
×
3530

3531
        if (!s->timer_event_source)
×
3532
                return 0;
×
3533

3534
        r = sd_event_source_get_time(s->timer_event_source, &t);
×
3535
        if (r < 0)
×
3536
                return r;
3537
        if (t == USEC_INFINITY)
×
3538
                return 0;
3539

3540
        *timeout = t;
×
3541
        return 1;
×
3542
}
3543

3544
const char* socket_fdname(Socket *s) {
965✔
3545
        assert(s);
965✔
3546

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

3550
        if (s->fdname)
965✔
3551
                return s->fdname;
3552

3553
        if (s->accept)
440✔
3554
                return "connection";
3555

3556
        return UNIT(s)->id;
417✔
3557
}
3558

3559
static PidRef* socket_control_pid(Unit *u) {
7,035✔
3560
        return &ASSERT_PTR(SOCKET(u))->control_pid;
14,070✔
3561
}
3562

3563
static int socket_clean(Unit *u, ExecCleanMask mask) {
×
3564
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3565
        _cleanup_strv_free_ char **l = NULL;
×
3566
        int r;
×
3567

3568
        assert(mask != 0);
×
3569

3570
        if (s->state != SOCKET_DEAD)
×
3571
                return -EBUSY;
3572

3573
        r = exec_context_get_clean_directories(&s->exec_context, u->manager->prefix, mask, &l);
×
3574
        if (r < 0)
×
3575
                return r;
3576

3577
        if (strv_isempty(l))
×
3578
                return -EUNATCH;
3579

3580
        socket_unwatch_control_pid(s);
×
3581
        s->clean_result = SOCKET_SUCCESS;
×
3582
        s->control_command = NULL;
×
3583
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
×
3584

3585
        r = socket_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec);
×
3586
        if (r < 0) {
×
3587
                log_unit_warning_errno(u, r, "Failed to install timer: %m");
×
3588
                goto fail;
×
3589
        }
3590

3591
        r = unit_fork_and_watch_rm_rf(u, l, &s->control_pid);
×
3592
        if (r < 0) {
×
3593
                log_unit_warning_errno(u, r, "Failed to spawn cleaning task: %m");
×
3594
                goto fail;
×
3595
        }
3596

3597
        socket_set_state(s, SOCKET_CLEANING);
×
3598
        return 0;
3599

3600
fail:
×
3601
        s->clean_result = SOCKET_FAILURE_RESOURCES;
×
3602
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
×
3603
        return r;
×
3604
}
3605

3606
static int socket_can_clean(Unit *u, ExecCleanMask *ret) {
110✔
3607
        Socket *s = ASSERT_PTR(SOCKET(u));
110✔
3608

3609
        return exec_context_get_clean_mask(&s->exec_context, ret);
110✔
3610
}
3611

3612
static int socket_test_startable(Unit *u) {
3,910✔
3613
        Socket *s = ASSERT_PTR(SOCKET(u));
3,910✔
3614
        int r;
3,910✔
3615

3616
        /* It is already being started. */
3617
        if (IN_SET(s->state,
3,910✔
3618
                   SOCKET_START_PRE,
3619
                   SOCKET_START_OPEN,
3620
                   SOCKET_START_CHOWN,
3621
                   SOCKET_START_POST))
3622
                return false;
3623

3624
        /* Cannot run this without the service being around */
3625
        if (UNIT_ISSET(s->service)) {
3,910✔
3626
                Service *service = ASSERT_PTR(SERVICE(UNIT_DEREF(s->service)));
2,820✔
3627

3628
                if (UNIT(service)->load_state != UNIT_LOADED)
2,820✔
3629
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
×
3630
                                                    "Socket service %s not loaded, refusing.", UNIT(service)->id);
3631

3632
                /* If the service is already active we cannot start the socket */
3633
                if (SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize= */ false))
2,820✔
3634
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY),
×
3635
                                                    "Socket service %s already active, refusing.", UNIT(service)->id);
3636
        }
3637

3638
        r = unit_test_start_limit(u);
3,910✔
3639
        if (r < 0) {
3,910✔
3640
                socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT);
×
3641
                return r;
×
3642
        }
3643

3644
        return true;
3645
}
3646

3647
static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
3648
        [SOCKET_EXEC_START_PRE]   = "ExecStartPre",
3649
        [SOCKET_EXEC_START_CHOWN] = "ExecStartChown",
3650
        [SOCKET_EXEC_START_POST]  = "ExecStartPost",
3651
        [SOCKET_EXEC_STOP_PRE]    = "ExecStopPre",
3652
        [SOCKET_EXEC_STOP_POST]   = "ExecStopPost",
3653
};
3654

3655
DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
304✔
3656

3657
static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
3658
        [SOCKET_SUCCESS]                         = "success",
3659
        [SOCKET_FAILURE_RESOURCES]               = "resources",
3660
        [SOCKET_FAILURE_TIMEOUT]                 = "timeout",
3661
        [SOCKET_FAILURE_EXIT_CODE]               = "exit-code",
3662
        [SOCKET_FAILURE_SIGNAL]                  = "signal",
3663
        [SOCKET_FAILURE_CORE_DUMP]               = "core-dump",
3664
        [SOCKET_FAILURE_START_LIMIT_HIT]         = "start-limit-hit",
3665
        [SOCKET_FAILURE_TRIGGER_LIMIT_HIT]       = "trigger-limit-hit",
3666
        [SOCKET_FAILURE_SERVICE_START_LIMIT_HIT] = "service-start-limit-hit",
3667
};
3668

3669
DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
20,178✔
3670

3671
static const char* const socket_timestamping_table[_SOCKET_TIMESTAMPING_MAX] = {
3672
        [SOCKET_TIMESTAMPING_OFF] = "off",
3673
        [SOCKET_TIMESTAMPING_US]  = "us",
3674
        [SOCKET_TIMESTAMPING_NS]  = "ns",
3675
};
3676

3677
DEFINE_STRING_TABLE_LOOKUP(socket_timestamping, SocketTimestamping);
485✔
3678

3679
SocketTimestamping socket_timestamping_from_string_harder(const char *s) {
387✔
3680
        SocketTimestamping t;
387✔
3681
        int r;
387✔
3682

3683
        if (!s)
387✔
3684
                return _SOCKET_TIMESTAMPING_INVALID;
3685

3686
        t = socket_timestamping_from_string(s);
387✔
3687
        if (t >= 0)
387✔
3688
                return t;
3689

3690
        /* Let's alternatively support the various other aliases parse_time() accepts for ns and µs here,
3691
         * too. */
3692
        if (streq(s, "nsec"))
×
3693
                return SOCKET_TIMESTAMPING_NS;
3694
        if (STR_IN_SET(s, "usec", "µs", "μs")) /* Accept both small greek letter mu + micro sign unicode codepoints */
×
3695
                return SOCKET_TIMESTAMPING_US;
×
3696

3697
        r = parse_boolean(s);
×
3698
        if (r < 0)
×
3699
                return _SOCKET_TIMESTAMPING_INVALID;
3700

3701
        return r ? SOCKET_TIMESTAMPING_NS : SOCKET_TIMESTAMPING_OFF; /* If boolean yes, default to ns accuracy */
×
3702
}
3703

3704
static const char* const socket_defer_trigger_table[_SOCKET_DEFER_MAX] = {
3705
        [SOCKET_DEFER_NO]      = "no",
3706
        [SOCKET_DEFER_YES]     = "yes",
3707
        [SOCKET_DEFER_PATIENT] = "patient",
3708
};
3709

3710
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(socket_defer_trigger, SocketDeferTrigger, SOCKET_DEFER_YES);
1,283✔
3711

3712
const UnitVTable socket_vtable = {
3713
        .object_size = sizeof(Socket),
3714
        .exec_context_offset = offsetof(Socket, exec_context),
3715
        .cgroup_context_offset = offsetof(Socket, cgroup_context),
3716
        .kill_context_offset = offsetof(Socket, kill_context),
3717
        .exec_runtime_offset = offsetof(Socket, exec_runtime),
3718
        .cgroup_runtime_offset = offsetof(Socket, cgroup_runtime),
3719

3720
        .sections =
3721
                "Unit\0"
3722
                "Socket\0"
3723
                "Install\0",
3724
        .private_section = "Socket",
3725

3726
        .can_transient = true,
3727
        .can_trigger = true,
3728
        .can_fail = true,
3729

3730
        .init = socket_init,
3731
        .done = socket_done,
3732
        .load = socket_load,
3733

3734
        .coldplug = socket_coldplug,
3735

3736
        .dump = socket_dump,
3737

3738
        .start = socket_start,
3739
        .stop = socket_stop,
3740

3741
        .clean = socket_clean,
3742
        .can_clean = socket_can_clean,
3743

3744
        .get_timeout = socket_get_timeout,
3745

3746
        .serialize = socket_serialize,
3747
        .deserialize_item = socket_deserialize_item,
3748
        .distribute_fds = socket_distribute_fds,
3749

3750
        .active_state = socket_active_state,
3751
        .sub_state_to_string = socket_sub_state_to_string,
3752

3753
        .will_restart = unit_will_restart_default,
3754

3755
        .may_gc = socket_may_gc,
3756

3757
        .sigchld_event = socket_sigchld_event,
3758

3759
        .trigger_notify = socket_trigger_notify,
3760

3761
        .stop_notify = socket_stop_notify,
3762

3763
        .reset_failed = socket_reset_failed,
3764

3765
        .notify_handoff_timestamp = socket_handoff_timestamp,
3766

3767
        .control_pid = socket_control_pid,
3768

3769
        .bus_set_property = bus_socket_set_property,
3770
        .bus_commit_properties = bus_socket_commit_properties,
3771

3772
        .status_message_formats = {
3773
                .finished_start_job = {
3774
                        [JOB_DONE]       = "Listening on %s.",
3775
                        [JOB_FAILED]     = "Failed to listen on %s.",
3776
                        [JOB_TIMEOUT]    = "Timed out starting %s.",
3777
                },
3778
                .finished_stop_job = {
3779
                        [JOB_DONE]       = "Closed %s.",
3780
                        [JOB_FAILED]     = "Failed stopping %s.",
3781
                        [JOB_TIMEOUT]    = "Timed out stopping %s.",
3782
                },
3783
        },
3784

3785
        .test_startable = socket_test_startable,
3786
};
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