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

systemd / systemd / 15263807472

26 May 2025 08:53PM UTC coverage: 72.046% (-0.002%) from 72.048%
15263807472

push

github

yuwata
src/core/manager.c: log preset activity on first boot

This gives us a little more information about what units were enabled
or disabled on that first boot and will be useful for OS developers
tracking down the source of unit state.

An example with this enabled looks like:

```
NET: Registered PF_VSOCK protocol family
systemd[1]: Applying preset policy.
systemd[1]: Unit /etc/systemd/system/dnsmasq.service is masked, ignoring.
systemd[1]: Unit /etc/systemd/system/systemd-repart.service is masked, ignoring.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket'.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir.mount' → '/etc/systemd/system/var-mnt-workdir.mount'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir\x2dtmp.mount' → '/etc/systemd/system/var-mnt-workdir\x2dtmp.mount'.
systemd[1]: Created symlink '/etc/systemd/system/afterburn-sshkeys.target.requires/afterburn-sshkeys@core.service' → '/usr/lib/systemd/system/afterburn-sshkeys@.service'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket' → '/usr/lib/systemd/system/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket' → '/usr/lib/systemd/system/systemd-resolved-monitor.socket'.
systemd[1]: Populated /etc with preset unit settings.
```

Considering it only happens on first boot and not on every boot I think
the extra information is worth the extra verbosity in the logs just for
that boot.

5 of 6 new or added lines in 1 file covered. (83.33%)

5463 existing lines in 165 files now uncovered.

299151 of 415222 relevant lines covered (72.05%)

702386.45 hits per line

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

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

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

11
#include "sd-bus.h"
12

13
#include "alloc-util.h"
14
#include "bpf-program.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_RUNNING]          = UNIT_ACTIVE,
73
        [SOCKET_STOP_PRE]         = UNIT_DEACTIVATING,
74
        [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
75
        [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
76
        [SOCKET_STOP_POST]        = UNIT_DEACTIVATING,
77
        [SOCKET_FINAL_SIGTERM]    = UNIT_DEACTIVATING,
78
        [SOCKET_FINAL_SIGKILL]    = UNIT_DEACTIVATING,
79
        [SOCKET_FAILED]           = UNIT_FAILED,
80
        [SOCKET_CLEANING]         = UNIT_MAINTENANCE,
81
};
82

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

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

100
static bool SOCKET_SERVICE_IS_ACTIVE(Service *s, bool allow_finalize) {
3,998✔
101
        assert(s);
3,998✔
102

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

108
        if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(UNIT(s))))
3,998✔
109
                return false;
110

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

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

117
        return true;
118
}
119

120
static void socket_init(Unit *u) {
5,348✔
121
        Socket *s = ASSERT_PTR(SOCKET(u));
5,348✔
122

123
        assert(u->load_state == UNIT_STUB);
5,348✔
124

125
        s->backlog = SOMAXCONN_DELUXE;
5,348✔
126
        s->timeout_usec = u->manager->defaults.timeout_start_usec;
5,348✔
127
        s->directory_mode = 0755;
5,348✔
128
        s->socket_mode = 0666;
5,348✔
129

130
        s->max_connections = 64;
5,348✔
131

132
        s->priority = -1;
5,348✔
133
        s->ip_tos = -1;
5,348✔
134
        s->ip_ttl = -1;
5,348✔
135
        s->mark = -1;
5,348✔
136

137
        s->exec_context.std_output = u->manager->defaults.std_output;
5,348✔
138
        s->exec_context.std_error = u->manager->defaults.std_error;
5,348✔
139

140
        s->control_pid = PIDREF_NULL;
5,348✔
141
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
5,348✔
142

143
        s->trigger_limit = RATELIMIT_OFF;
5,348✔
144

145
        s->poll_limit = RATELIMIT_OFF;
5,348✔
146
}
5,348✔
147

148
static void socket_unwatch_control_pid(Socket *s) {
23,891✔
149
        assert(s);
23,891✔
150
        unit_unwatch_pidref_done(UNIT(s), &s->control_pid);
23,891✔
151
}
23,891✔
152

153
static void socket_port_close_auxiliary_fds(SocketPort *p) {
7,631✔
154
        assert(p);
7,631✔
155

156
        close_many(p->auxiliary_fds, p->n_auxiliary_fds);
7,631✔
157
        p->auxiliary_fds = mfree(p->auxiliary_fds);
7,631✔
158
        p->n_auxiliary_fds = 0;
7,631✔
159
}
7,631✔
160

161
SocketPort* socket_port_free(SocketPort *p) {
5,672✔
162
        if (!p)
5,672✔
163
                return NULL;
164

165
        sd_event_source_unref(p->event_source);
5,672✔
166

167
        socket_port_close_auxiliary_fds(p);
5,672✔
168
        safe_close(p->fd);
5,672✔
169
        free(p->path);
5,672✔
170

171
        return mfree(p);
5,672✔
172
}
173

174
void socket_free_ports(Socket *s) {
5,348✔
175
        assert(s);
5,348✔
176

177
        LIST_CLEAR(port, s->ports, socket_port_free);
11,020✔
178
}
5,348✔
179

180
static void socket_done(Unit *u) {
5,348✔
181
        Socket *s = ASSERT_PTR(SOCKET(u));
5,348✔
182
        SocketPeer *p;
5,348✔
183

184
        socket_free_ports(s);
5,348✔
185

186
        while ((p = set_steal_first(s->peers_by_address)))
5,348✔
187
                p->socket = NULL;
×
188

189
        s->peers_by_address = set_free(s->peers_by_address);
5,348✔
190

191
        s->exec_runtime = exec_runtime_free(s->exec_runtime);
5,348✔
192

193
        exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
5,348✔
194
        s->control_command = NULL;
5,348✔
195

196
        socket_unwatch_control_pid(s);
5,348✔
197

198
        unit_ref_unset(&s->service);
5,348✔
199

200
        s->tcp_congestion = mfree(s->tcp_congestion);
5,348✔
201
        s->bind_to_device = mfree(s->bind_to_device);
5,348✔
202

203
        s->smack = mfree(s->smack);
5,348✔
204
        s->smack_ip_in = mfree(s->smack_ip_in);
5,348✔
205
        s->smack_ip_out = mfree(s->smack_ip_out);
5,348✔
206

207
        strv_free(s->symlinks);
5,348✔
208

209
        s->user = mfree(s->user);
5,348✔
210
        s->group = mfree(s->group);
5,348✔
211

212
        s->fdname = mfree(s->fdname);
5,348✔
213

214
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
5,348✔
215
}
5,348✔
216

217
static int socket_arm_timer(Socket *s, bool relative, usec_t usec) {
173✔
218
        assert(s);
173✔
219

220
        return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, socket_dispatch_timer);
173✔
221
}
222

223
static bool have_non_accept_socket(Socket *s) {
6,544✔
224
        assert(s);
6,544✔
225

226
        if (!s->accept)
6,544✔
227
                return true;
228

229
        LIST_FOREACH(port, p, s->ports) {
4,796✔
230

231
                if (p->type != SOCKET_SOCKET)
2,398✔
232
                        return true;
233

234
                if (!socket_address_can_accept(&p->address))
2,398✔
235
                        return true;
236
        }
237

238
        return false;
239
}
240

241
static int socket_add_mount_dependencies(Socket *s) {
5,345✔
242
        int r;
5,345✔
243

244
        assert(s);
5,345✔
245

246
        LIST_FOREACH(port, p, s->ports) {
11,017✔
247
                const char *path = NULL;
5,672✔
248

249
                if (p->type == SOCKET_SOCKET)
5,672✔
250
                        path = socket_address_get_path(&p->address);
5,435✔
251
                else if (IN_SET(p->type, SOCKET_FIFO, SOCKET_SPECIAL, SOCKET_USB_FUNCTION))
237✔
252
                        path = p->path;
237✔
253

254
                if (!path)
5,672✔
255
                        continue;
348✔
256

257
                r = unit_add_mounts_for(UNIT(s), path, UNIT_DEPENDENCY_FILE, UNIT_MOUNT_REQUIRES);
5,324✔
258
                if (r < 0)
5,324✔
259
                        return r;
260
        }
261

262
        return 0;
263
}
264

265
static int socket_add_device_dependencies(Socket *s) {
5,345✔
266
        char *t;
5,345✔
267

268
        assert(s);
5,345✔
269

270
        if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
5,345✔
271
                return 0;
272

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

277
static int socket_add_default_dependencies(Socket *s) {
5,345✔
278
        int r;
5,345✔
279

280
        assert(s);
5,345✔
281

282
        if (!UNIT(s)->default_dependencies)
5,345✔
283
                return 0;
284

285
        r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
2,476✔
286
        if (r < 0)
2,476✔
287
                return r;
288

289
        if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
2,476✔
290
                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
1,068✔
291
                if (r < 0)
1,068✔
292
                        return r;
293
        }
294

295
        return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
2,476✔
296
}
297

298
static bool socket_has_exec(Socket *s) {
5,345✔
299
        assert(s);
5,345✔
300

301
        FOREACH_ARRAY(i, s->exec_command, _SOCKET_EXEC_COMMAND_MAX)
31,542✔
302
                if (*i)
26,373✔
303
                        return true;
304

305
        return false;
306
}
307

308
static int socket_add_extras(Socket *s) {
5,345✔
309
        Unit *u = UNIT(ASSERT_PTR(s));
5,345✔
310
        int r;
5,345✔
311

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

324
        if (s->trigger_limit.interval == USEC_INFINITY)
5,345✔
325
                s->trigger_limit.interval = 2 * USEC_PER_SEC;
5,345✔
326
        if (s->trigger_limit.burst == UINT_MAX)
5,345✔
327
                s->trigger_limit.burst = s->accept ? 200 : 20;
9,491✔
328

329
        if (s->poll_limit.interval == USEC_INFINITY)
5,345✔
330
                s->poll_limit.interval = 2 * USEC_PER_SEC;
5,195✔
331
        if (s->poll_limit.burst == UINT_MAX)
5,345✔
332
                s->poll_limit.burst = s->accept ? 150 : 15;
9,341✔
333

334
        if (have_non_accept_socket(s)) {
5,345✔
335

336
                if (!UNIT_ISSET(s->service)) {
4,146✔
337
                        Unit *x;
2,453✔
338

339
                        r = unit_load_related_unit(u, ".service", &x);
2,453✔
340
                        if (r < 0)
2,453✔
341
                                return r;
×
342

343
                        unit_ref_set(&s->service, u, x);
2,453✔
344
                }
345

346
                r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true, UNIT_DEPENDENCY_IMPLICIT);
4,146✔
347
                if (r < 0)
4,146✔
348
                        return r;
349
        }
350

351
        r = socket_add_mount_dependencies(s);
5,345✔
352
        if (r < 0)
5,345✔
353
                return r;
354

355
        r = socket_add_device_dependencies(s);
5,345✔
356
        if (r < 0)
5,345✔
357
                return r;
358

359
        r = unit_patch_contexts(u);
5,345✔
360
        if (r < 0)
5,345✔
361
                return r;
362

363
        if (socket_has_exec(s)) {
5,345✔
364
                r = unit_add_exec_dependencies(u, &s->exec_context);
176✔
365
                if (r < 0)
176✔
366
                        return r;
367
        }
368

369
        r = unit_set_default_slice(u);
5,345✔
370
        if (r < 0)
5,345✔
371
                return r;
372

373
        r = socket_add_default_dependencies(s);
5,345✔
374
        if (r < 0)
5,345✔
375
                return r;
×
376

377
        return 0;
378
}
379

380
static const char* socket_find_symlink_target(Socket *s) {
2,745✔
381
        const char *found = NULL;
2,745✔
382

383
        assert(s);
2,745✔
384

385
        LIST_FOREACH(port, p, s->ports) {
5,490✔
386
                const char *f;
2,937✔
387

388
                switch (p->type) {
2,937✔
389

390
                case SOCKET_FIFO:
132✔
391
                        f = p->path;
132✔
392
                        break;
132✔
393

394
                case SOCKET_SOCKET:
2,805✔
395
                        f = socket_address_get_path(&p->address);
2,805✔
396
                        break;
2,805✔
397

398
                default:
399
                        f = NULL;
400
                }
401

402
                if (f) {
2,937✔
403
                        if (found)
2,874✔
404
                                return NULL;
405

406
                        found = f;
407
                }
408
        }
409

410
        return found;
411
}
412

413
static int socket_verify(Socket *s) {
5,345✔
414
        assert(s);
5,345✔
415
        assert(UNIT(s)->load_state == UNIT_LOADED);
5,345✔
416

417
        if (!s->ports)
5,345✔
418
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit has no Listen setting (ListenStream=, ListenDatagram=, ListenFIFO=, ...). Refusing.");
×
419

420
        if (s->max_connections <= 0)
5,345✔
421
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "MaxConnection= setting too small. Refusing.");
×
422

423
        if (s->accept && have_non_accept_socket(s))
5,345✔
424
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
×
425

426
        if (s->accept && UNIT_ISSET(s->service))
5,345✔
427
                return log_unit_error_errno(UNIT(s), SYNTHETIC_ERRNO(ENOEXEC), "Explicit service configuration for accepting socket units not supported. Refusing.");
×
428

429
        if (!strv_isempty(s->symlinks) && !socket_find_symlink_target(s))
5,670✔
430
                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.");
×
431

432
        return 0;
433
}
434

435
static void peer_address_hash_func(const SocketPeer *s, struct siphash *state) {
3✔
436
        assert(s);
3✔
437

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

450
static int peer_address_compare_func(const SocketPeer *x, const SocketPeer *y) {
2✔
451
        int r;
2✔
452

453
        r = CMP(x->peer.sa.sa_family, y->peer.sa.sa_family);
2✔
454
        if (r != 0)
2✔
455
                return r;
×
456

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

470
DEFINE_PRIVATE_HASH_OPS(peer_address_hash_ops, SocketPeer, peer_address_hash_func, peer_address_compare_func);
471

472
static int socket_load(Unit *u) {
5,348✔
473
        Socket *s = ASSERT_PTR(SOCKET(u));
5,348✔
474
        int r;
5,348✔
475

476
        assert(u->load_state == UNIT_STUB);
5,348✔
477

478
        r = unit_load_fragment_and_dropin(u, true);
5,348✔
479
        if (r < 0)
5,348✔
480
                return r;
481

482
        if (u->load_state != UNIT_LOADED)
5,345✔
483
                return 0;
484

485
        /* This is a new unit? Then let's add in some extras */
486
        r = socket_add_extras(s);
5,345✔
487
        if (r < 0)
5,345✔
488
                return r;
489

490
        return socket_verify(s);
5,345✔
491
}
492

493
static SocketPeer* socket_peer_dup(const SocketPeer *q) {
1✔
494
        SocketPeer *p;
1✔
495

496
        assert(q);
1✔
497

498
        p = new(SocketPeer, 1);
1✔
499
        if (!p)
1✔
500
                return NULL;
501

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

509
        return p;
1✔
510
}
511

512
static SocketPeer* socket_peer_free(SocketPeer *p) {
1✔
513
        assert(p);
1✔
514

515
        if (p->socket)
1✔
516
                set_remove(p->socket->peers_by_address, p);
1✔
517

518
        return mfree(p);
1✔
519
}
520

521
DEFINE_TRIVIAL_REF_UNREF_FUNC(SocketPeer, socket_peer, socket_peer_free);
3✔
522

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

531
        assert(s);
2✔
532
        assert(fd >= 0);
2✔
533
        assert(ret);
2✔
534

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

538
        switch (key.peer.sa.sa_family) {
2✔
539
        case AF_INET:
540
        case AF_INET6:
541
        case AF_VSOCK:
542
                break;
543

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

550
        default:
×
551
                *ret = NULL;
×
552
                return 0;
×
553
        }
554

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

561
        remote = socket_peer_dup(&key);
1✔
562
        if (!remote)
1✔
563
                return log_oom();
×
564

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

569
        remote->socket = s;
1✔
570

571
        *ret = TAKE_PTR(remote);
1✔
572
        return 1;
1✔
573
}
574

575
static const char* listen_lookup(int family, int type) {
×
576

577
        if (family == AF_NETLINK)
×
578
                return "ListenNetlink";
579

580
        if (type == SOCK_STREAM)
×
581
                return "ListenStream";
582
        else if (type == SOCK_DGRAM)
×
583
                return "ListenDatagram";
584
        else if (type == SOCK_SEQPACKET)
×
585
                return "ListenSequentialPacket";
586

587
        assert_not_reached();
×
588
}
589

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

594
        assert(f);
×
595

596
        prefix = strempty(prefix);
×
597
        prefix2 = strjoina(prefix, "\t");
×
598

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

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

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

653
        if (s->bind_to_device)
×
654
                fprintf(f,
×
655
                        "%sBindToDevice: %s\n",
656
                        prefix, s->bind_to_device);
657

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

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

678
        if (s->receive_buffer > 0)
×
679
                fprintf(f,
×
680
                        "%sReceiveBuffer: %zu\n",
681
                        prefix, s->receive_buffer);
682

683
        if (s->send_buffer > 0)
×
684
                fprintf(f,
×
685
                        "%sSendBuffer: %zu\n",
686
                        prefix, s->send_buffer);
687

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

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

698
        if (s->pipe_size > 0)
×
699
                fprintf(f,
×
700
                        "%sPipeSize: %zu\n",
701
                        prefix, s->pipe_size);
702

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

708
        if (s->mq_maxmsg > 0)
×
709
                fprintf(f,
×
710
                        "%sMessageQueueMaxMessages: %li\n",
711
                        prefix, s->mq_maxmsg);
712

713
        if (s->mq_msgsize > 0)
×
714
                fprintf(f,
×
715
                        "%sMessageQueueMessageSize: %li\n",
716
                        prefix, s->mq_msgsize);
717

718
        if (s->reuse_port)
×
719
                fprintf(f,
×
720
                        "%sReusePort: %s\n",
721
                         prefix, yes_no(s->reuse_port));
722

723
        if (s->smack)
×
724
                fprintf(f,
×
725
                        "%sSmackLabel: %s\n",
726
                        prefix, s->smack);
727

728
        if (s->smack_ip_in)
×
729
                fprintf(f,
×
730
                        "%sSmackLabelIPIn: %s\n",
731
                        prefix, s->smack_ip_in);
732

733
        if (s->smack_ip_out)
×
734
                fprintf(f,
×
735
                        "%sSmackLabelIPOut: %s\n",
736
                        prefix, s->smack_ip_out);
737

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

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

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

755
        if (s->keep_alive_cnt > 0)
×
756
                fprintf(f,
×
757
                        "%sKeepAliveProbes: %u\n",
758
                        prefix, s->keep_alive_cnt);
759

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

765
        LIST_FOREACH(port, p, s->ports) {
×
766

767
                switch (p->type) {
×
768
                case SOCKET_SOCKET: {
×
769
                        _cleanup_free_ char *k = NULL;
×
770
                        int r;
×
771

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

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

804
        str = ip_protocol_to_name(s->socket_protocol);
×
805
        if (str)
×
806
                fprintf(f, "%sSocketProtocol: %s\n", prefix, str);
×
807

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

813
                fprintf(f, "\n");
×
814
        }
815

816
        fprintf(f,
×
817
                "%sTimeoutSec: %s\n",
818
                prefix, FORMAT_TIMESPAN(s->timeout_usec, USEC_PER_SEC));
×
819

820
        exec_context_dump(&s->exec_context, f, prefix);
×
821
        kill_context_dump(&s->kill_context, f, prefix);
×
822

823
        for (SocketExecCommand c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
×
824
                if (!s->exec_command[c])
×
825
                        continue;
×
826

827
                fprintf(f, "%s%s %s:\n",
×
828
                        prefix, glyph(GLYPH_ARROW_RIGHT), socket_exec_command_to_string(c));
829

830
                exec_command_dump_list(s->exec_command[c], f, prefix2);
×
831
        }
832

833
        cgroup_context_dump(UNIT(s), f, prefix);
×
834
}
×
835

836
static int instance_from_socket(
2✔
837
                int fd,
838
                unsigned nr,
839
                char **ret) {
840

841
        union sockaddr_union local, remote;
2✔
842
        socklen_t l;
2✔
843
        int r;
2✔
844

845
        assert(fd >= 0);
2✔
846
        assert(ret);
2✔
847

848
        l = sizeof(local);
2✔
849
        if (getsockname(fd, &local.sa, &l) < 0)
2✔
850
                return -errno;
2✔
851

852
        l = sizeof(remote);
2✔
853
        if (getpeername(fd, &remote.sa, &l) < 0)
2✔
854
                return -errno;
×
855

856
        uint64_t cookie;
2✔
857
        r = socket_get_cookie(fd, &cookie);
2✔
858
        if (r < 0)
2✔
859
                return r;
860

861
        char *s;
2✔
862

863
        switch (local.sa.sa_family) {
2✔
864

865
        case AF_INET: {
×
866
                uint32_t
×
867
                        a = be32toh(local.in.sin_addr.s_addr),
×
868
                        b = be32toh(remote.in.sin_addr.s_addr);
×
869

870
                if (asprintf(&s,
×
871
                             "%u-%" PRIu64 "-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
872
                             nr,
873
                             cookie,
874
                             a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
875
                             be16toh(local.in.sin_port),
×
876
                             b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
877
                             be16toh(remote.in.sin_port)) < 0)
×
878
                        return -ENOMEM;
879

880
                break;
881
        }
882

883
        case AF_INET6: {
×
884
                static const unsigned char ipv4_prefix[] = {
×
885
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
886
                };
887

888
                if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
×
889
                    memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
×
890
                        const uint8_t
×
891
                                *a = local.in6.sin6_addr.s6_addr+12,
×
892
                                *b = remote.in6.sin6_addr.s6_addr+12;
×
893

894
                        if (asprintf(&s,
×
895
                                     "%u-%" PRIu64 "-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
896
                                     nr,
897
                                     cookie,
898
                                     a[0], a[1], a[2], a[3],
×
899
                                     be16toh(local.in6.sin6_port),
×
900
                                     b[0], b[1], b[2], b[3],
×
901
                                     be16toh(remote.in6.sin6_port)) < 0)
×
902
                                return -ENOMEM;
903
                } else {
904
                        if (asprintf(&s,
×
905
                                     "%u-%" PRIu64 "-%s:%u-%s:%u",
906
                                     nr,
907
                                     cookie,
908
                                     IN6_ADDR_TO_STRING(&local.in6.sin6_addr),
×
909
                                     be16toh(local.in6.sin6_port),
×
910
                                     IN6_ADDR_TO_STRING(&remote.in6.sin6_addr),
×
911
                                     be16toh(remote.in6.sin6_port)) < 0)
×
912
                                return -ENOMEM;
×
913
                }
914

915
                break;
916
        }
917

918
        case AF_UNIX: {
2✔
919
                struct ucred ucred;
2✔
920

921
                r = getpeercred(fd, &ucred);
2✔
922
                if (r >= 0) {
2✔
923
                        _cleanup_close_ int pidfd = getpeerpidfd(fd);
4✔
924
                        uint64_t pidfd_id;
2✔
925

926
                        if (pidfd >= 0 && pidfd_get_inode_id(pidfd, &pidfd_id) >= 0)
2✔
UNCOV
927
                                r = asprintf(&s, "%u-%" PRIu64 "-" PID_FMT "_%" PRIu64 "-" UID_FMT,
×
928
                                             nr, cookie, ucred.pid, pidfd_id, ucred.uid);
929
                        else
930
                                r = asprintf(&s, "%u-%" PRIu64 "-" PID_FMT "-" UID_FMT,
2✔
931
                                             nr, cookie, ucred.pid, ucred.uid);
932
                        if (r < 0)
2✔
933
                                return -ENOMEM;
×
934
                } else if (r == -ENODATA) {
×
935
                        /* This handles the case where somebody is connecting from another pid/uid namespace
936
                         * (e.g. from outside of our container). */
937
                        if (asprintf(&s,
×
938
                                     "%u-%" PRIu64 "-unknown",
939
                                     nr,
940
                                     cookie) < 0)
941
                                return -ENOMEM;
942
                } else
943
                        return r;
944

945
                break;
2✔
946
        }
947

948
        case AF_VSOCK:
×
949
                if (asprintf(&s,
×
950
                             "%u-%" PRIu64 "-%u:%u-%u:%u",
951
                             nr,
952
                             cookie,
953
                             local.vm.svm_cid, local.vm.svm_port,
954
                             remote.vm.svm_cid, remote.vm.svm_port) < 0)
955
                        return -ENOMEM;
956

957
                break;
958

959
        default:
×
960
                assert_not_reached();
×
961
        }
962

963
        *ret = s;
2✔
964
        return 0;
2✔
965
}
966

967
static void socket_close_fds(Socket *s) {
1,927✔
968
        assert(s);
1,927✔
969

970
        LIST_FOREACH(port, p, s->ports) {
3,886✔
971
                bool was_open = p->fd >= 0;
1,959✔
972

973
                p->event_source = sd_event_source_disable_unref(p->event_source);
1,959✔
974
                p->fd = safe_close(p->fd);
1,959✔
975
                socket_port_close_auxiliary_fds(p);
1,959✔
976

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

983
                if (!was_open || !s->remove_on_stop)
1,959✔
984
                        continue;
1,900✔
985

986
                switch (p->type) {
59✔
987

988
                case SOCKET_FIFO:
18✔
989
                        (void) unlink(p->path);
18✔
990
                        break;
18✔
991

992
                case SOCKET_MQUEUE:
×
993
                        (void) mq_unlink(p->path);
×
994
                        break;
×
995

996
                case SOCKET_SOCKET:
41✔
997
                        (void) socket_address_unlink(&p->address);
41✔
998
                        break;
41✔
999

1000
                default:
1001
                        ;
1002
                }
1003
        }
1004

1005
        if (s->remove_on_stop)
1,927✔
1006
                STRV_FOREACH(i, s->symlinks)
68✔
1007
                        (void) unlink(*i);
18✔
1008

1009
        /* Note that we don't return NULL here, since s has not been freed. */
1010
}
1,927✔
1011

1012
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(Socket*, socket_close_fds, NULL);
2,330✔
1013

1014
static void socket_apply_socket_options(Socket *s, SocketPort *p, int fd) {
2,356✔
1015
        int r;
2,356✔
1016

1017
        assert(s);
2,356✔
1018
        assert(p);
2,356✔
1019
        assert(fd >= 0);
2,356✔
1020

1021
        if (s->keep_alive) {
2,356✔
1022
                r = setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, true);
×
1023
                if (r < 0)
×
1024
                        log_unit_warning_errno(UNIT(s), r, "SO_KEEPALIVE failed: %m");
×
1025
        }
1026

1027
        if (timestamp_is_set(s->keep_alive_time)) {
2,356✔
1028
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPIDLE, s->keep_alive_time / USEC_PER_SEC);
×
1029
                if (r < 0)
×
1030
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPIDLE failed: %m");
×
1031
        }
1032

1033
        if (s->keep_alive_interval > 0) {
2,356✔
1034
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPINTVL, s->keep_alive_interval / USEC_PER_SEC);
×
1035
                if (r < 0)
×
1036
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPINTVL failed: %m");
×
1037
        }
1038

1039
        if (s->keep_alive_cnt > 0) {
2,356✔
1040
                r = setsockopt_int(fd, SOL_TCP, TCP_KEEPCNT, s->keep_alive_cnt);
×
1041
                if (r < 0)
×
1042
                        log_unit_warning_errno(UNIT(s), r, "TCP_KEEPCNT failed: %m");
×
1043
        }
1044

1045
        if (s->defer_accept > 0) {
2,356✔
1046
                r = setsockopt_int(fd, SOL_TCP, TCP_DEFER_ACCEPT, s->defer_accept / USEC_PER_SEC);
×
1047
                if (r < 0)
×
1048
                        log_unit_warning_errno(UNIT(s), r, "TCP_DEFER_ACCEPT failed: %m");
×
1049
        }
1050

1051
        if (s->no_delay) {
2,356✔
1052
                if (s->socket_protocol == IPPROTO_SCTP) {
×
1053
                        r = setsockopt_int(fd, SOL_SCTP, SCTP_NODELAY, true);
×
1054
                        if (r < 0)
×
1055
                                log_unit_warning_errno(UNIT(s), r, "SCTP_NODELAY failed: %m");
×
1056
                } else {
1057
                        r = setsockopt_int(fd, SOL_TCP, TCP_NODELAY, true);
×
1058
                        if (r < 0)
×
1059
                                log_unit_warning_errno(UNIT(s), r, "TCP_NODELAY failed: %m");
×
1060
                }
1061
        }
1062

1063
        if (s->broadcast) {
2,356✔
1064
                r = setsockopt_int(fd, SOL_SOCKET, SO_BROADCAST, true);
×
1065
                if (r < 0)
×
1066
                        log_unit_warning_errno(UNIT(s), r, "SO_BROADCAST failed: %m");
×
1067
        }
1068

1069
        if (s->pass_cred) {
2,356✔
1070
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true);
129✔
1071
                if (r < 0)
129✔
1072
                        log_unit_warning_errno(UNIT(s), r, "SO_PASSCRED failed: %m");
×
1073
        }
1074

1075
        if (s->pass_sec) {
2,356✔
1076
                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSSEC, true);
90✔
1077
                if (r < 0)
90✔
1078
                        log_unit_warning_errno(UNIT(s), r, "SO_PASSSEC failed: %m");
×
1079
        }
1080

1081
        if (s->pass_pktinfo) {
2,356✔
1082
                r = socket_set_recvpktinfo(fd, socket_address_family(&p->address), true);
33✔
1083
                if (r < 0)
33✔
1084
                        log_unit_warning_errno(UNIT(s), r, "Failed to enable packet info socket option: %m");
×
1085
        }
1086

1087
        if (s->timestamping != SOCKET_TIMESTAMPING_OFF) {
2,356✔
1088
                r = setsockopt_int(fd, SOL_SOCKET,
180✔
1089
                                   s->timestamping == SOCKET_TIMESTAMPING_NS ? SO_TIMESTAMPNS : SO_TIMESTAMP,
1090
                                   true);
1091
                if (r < 0)
90✔
1092
                        log_unit_warning_errno(UNIT(s), r, "Failed to enable timestamping socket option, ignoring: %m");
×
1093
        }
1094

1095
        if (s->priority >= 0) {
2,356✔
1096
                r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
173✔
1097
                if (r < 0)
173✔
1098
                        log_unit_warning_errno(UNIT(s), r, "SO_PRIORITY failed: %m");
×
1099
        }
1100

1101
        if (s->receive_buffer > 0) {
2,356✔
1102
                r = fd_set_rcvbuf(fd, s->receive_buffer, false);
147✔
1103
                if (r < 0)
147✔
1104
                        log_unit_full_errno(UNIT(s), ERRNO_IS_PRIVILEGE(r) ? LOG_DEBUG : LOG_WARNING, r,
×
1105
                                            "SO_RCVBUF/SO_RCVBUFFORCE failed: %m");
1106
        }
1107

1108
        if (s->send_buffer > 0) {
2,356✔
1109
                r = fd_set_sndbuf(fd, s->send_buffer, false);
30✔
1110
                if (r < 0)
30✔
1111
                        log_unit_full_errno(UNIT(s), ERRNO_IS_PRIVILEGE(r) ? LOG_DEBUG : LOG_WARNING, r,
×
1112
                                            "SO_SNDBUF/SO_SNDBUFFORCE failed: %m");
1113
        }
1114

1115
        if (s->mark >= 0) {
2,356✔
1116
                r = setsockopt_int(fd, SOL_SOCKET, SO_MARK, s->mark);
×
1117
                if (r < 0)
×
1118
                        log_unit_warning_errno(UNIT(s), r, "SO_MARK failed: %m");
×
1119
        }
1120

1121
        if (s->ip_tos >= 0) {
2,356✔
1122
                r = setsockopt_int(fd, IPPROTO_IP, IP_TOS, s->ip_tos);
×
1123
                if (r < 0)
×
1124
                        log_unit_warning_errno(UNIT(s), r, "IP_TOS failed: %m");
×
1125
        }
1126

1127
        if (s->ip_ttl >= 0) {
2,356✔
1128
                r = socket_set_ttl(fd, socket_address_family(&p->address), s->ip_ttl);
×
1129
                if (r < 0)
×
1130
                        log_unit_warning_errno(UNIT(s), r, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
×
1131
        }
1132

1133
        if (s->tcp_congestion)
2,356✔
1134
                if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
×
1135
                        log_unit_warning_errno(UNIT(s), errno, "TCP_CONGESTION failed: %m");
×
1136

1137
        if (s->smack_ip_in) {
2,356✔
1138
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPIN, s->smack_ip_in);
×
1139
                if (r < 0)
×
1140
                        log_unit_error_errno(UNIT(s), r, "mac_smack_apply_ip_in_fd: %m");
×
1141
        }
1142

1143
        if (s->smack_ip_out) {
2,356✔
1144
                r = mac_smack_apply_fd(fd, SMACK_ATTR_IPOUT, s->smack_ip_out);
×
1145
                if (r < 0)
×
1146
                        log_unit_error_errno(UNIT(s), r, "mac_smack_apply_ip_out_fd: %m");
×
1147
        }
1148
}
2,356✔
1149

1150
static void socket_apply_fifo_options(Socket *s, int fd) {
66✔
1151
        int r;
66✔
1152

1153
        assert(s);
66✔
1154
        assert(fd >= 0);
66✔
1155

1156
        if (s->pipe_size > 0)
66✔
1157
                if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
×
1158
                        log_unit_warning_errno(UNIT(s), errno, "Setting pipe size failed, ignoring: %m");
×
1159

1160
        if (s->smack) {
66✔
1161
                r = mac_smack_apply_fd(fd, SMACK_ATTR_ACCESS, s->smack);
×
1162
                if (r < 0)
×
1163
                        log_unit_error_errno(UNIT(s), r, "SMACK relabelling failed, ignoring: %m");
×
1164
        }
1165
}
66✔
1166

1167
static int fifo_address_create(
66✔
1168
                const char *path,
1169
                mode_t directory_mode,
1170
                mode_t socket_mode) {
1171

1172
        _cleanup_close_ int fd = -EBADF;
66✔
1173
        mode_t old_mask;
66✔
1174
        struct stat st;
66✔
1175
        int r;
66✔
1176

1177
        assert(path);
66✔
1178

1179
        (void) mkdir_parents_label(path, directory_mode);
66✔
1180

1181
        r = mac_selinux_create_file_prepare(path, S_IFIFO);
66✔
1182
        if (r < 0)
66✔
1183
                return r;
1184

1185
        /* Enforce the right access mode for the fifo */
1186
        old_mask = umask(~socket_mode);
66✔
1187

1188
        /* Include the original umask in our mask */
1189
        (void) umask(~socket_mode | old_mask);
66✔
1190

1191
        r = mkfifo(path, socket_mode);
66✔
1192
        (void) umask(old_mask);
66✔
1193

1194
        if (r < 0 && errno != EEXIST) {
66✔
1195
                r = -errno;
×
1196
                goto fail;
×
1197
        }
1198

1199
        fd = open(path, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK | O_NOFOLLOW);
66✔
1200
        if (fd < 0) {
66✔
1201
                r = -errno;
×
1202
                goto fail;
×
1203
        }
1204

1205
        mac_selinux_create_file_clear();
66✔
1206

1207
        if (fstat(fd, &st) < 0) {
66✔
1208
                r = -errno;
×
1209
                goto fail;
×
1210
        }
1211

1212
        if (!S_ISFIFO(st.st_mode) ||
66✔
1213
            (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
132✔
1214
            st.st_uid != getuid() ||
132✔
1215
            st.st_gid != getgid()) {
66✔
1216
                r = -EEXIST;
×
1217
                goto fail;
×
1218
        }
1219

1220
        return TAKE_FD(fd);
1221

1222
fail:
×
1223
        mac_selinux_create_file_clear();
×
1224
        return r;
1225
}
1226

1227
static int special_address_create(const char *path, bool writable) {
6✔
1228
        _cleanup_close_ int fd = -EBADF;
6✔
1229
        struct stat st;
6✔
1230

1231
        assert(path);
6✔
1232

1233
        fd = open(path, (writable ? O_RDWR : O_RDONLY)|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
6✔
1234
        if (fd < 0)
6✔
1235
                return -errno;
×
1236

1237
        if (fstat(fd, &st) < 0)
6✔
1238
                return -errno;
×
1239

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

1244
        return TAKE_FD(fd);
1245
}
1246

1247
static int usbffs_address_create_at(int dfd, const char *name) {
×
1248
        _cleanup_close_ int fd = -EBADF;
×
1249
        struct stat st;
×
1250

1251
        assert(dfd >= 0);
×
1252
        assert(name);
×
1253

1254
        fd = openat(dfd, name, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
×
1255
        if (fd < 0)
×
1256
                return -errno;
×
1257

1258
        if (fstat(fd, &st) < 0)
×
1259
                return -errno;
×
1260

1261
        /* Check whether this is a regular file (ffs endpoint) */
1262
        if (!S_ISREG(st.st_mode))
×
1263
                return -EEXIST;
×
1264

1265
        return TAKE_FD(fd);
1266
}
1267

1268
static int mq_address_create(
×
1269
                const char *path,
1270
                mode_t mq_mode,
1271
                long maxmsg,
1272
                long msgsize) {
1273

1274
        _cleanup_close_ int fd = -EBADF;
×
1275
        struct stat st;
×
1276
        mode_t old_mask;
×
1277
        struct mq_attr _attr, *attr = NULL;
×
1278

1279
        assert(path);
×
1280

1281
        if (maxmsg > 0 && msgsize > 0) {
×
1282
                _attr = (struct mq_attr) {
×
1283
                        .mq_flags = O_NONBLOCK,
1284
                        .mq_maxmsg = maxmsg,
1285
                        .mq_msgsize = msgsize,
1286
                };
1287
                attr = &_attr;
×
1288
        }
1289

1290
        /* Enforce the right access mode for the mq */
1291
        old_mask = umask(~mq_mode);
×
1292

1293
        /* Include the original umask in our mask */
1294
        (void) umask(~mq_mode | old_mask);
×
1295
        fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
×
1296
        (void) umask(old_mask);
×
1297

1298
        if (fd < 0)
×
1299
                return -errno;
×
1300

1301
        if (fstat(fd, &st) < 0)
×
1302
                return -errno;
×
1303

1304
        if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
×
1305
            st.st_uid != getuid() ||
×
1306
            st.st_gid != getgid())
×
1307
                return -EEXIST;
×
1308

1309
        return TAKE_FD(fd);
1310
}
1311

1312
static int socket_symlink(Socket *s) {
2,420✔
1313
        const char *p;
2,420✔
1314
        int r;
2,420✔
1315

1316
        assert(s);
2,420✔
1317

1318
        p = socket_find_symlink_target(s);
2,420✔
1319
        if (!p)
2,420✔
1320
                return 0;
1321

1322
        STRV_FOREACH(i, s->symlinks) {
2,294✔
1323
                (void) mkdir_parents_label(*i, s->directory_mode);
129✔
1324

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

1331
                        if (unlink(*i) >= 0)
×
1332
                                r = symlink_idempotent(p, *i, false);
×
1333
                }
1334
                if (r < 0)
129✔
1335
                        log_unit_warning_errno(UNIT(s), r, "Failed to create symlink %s %s %s, ignoring: %m",
×
1336
                                               p, glyph(GLYPH_ARROW_RIGHT), *i);
1337
        }
1338

1339
        return 0;
1340
}
1341

1342
static int usbffs_write_descs(int fd, Service *s) {
×
1343
        int r;
×
1344

1345
        assert(fd >= 0);
×
1346
        assert(s);
×
1347

1348
        if (!s->usb_function_descriptors || !s->usb_function_strings)
×
1349
                return -EINVAL;
1350

1351
        r = copy_file_fd(s->usb_function_descriptors, fd, 0);
×
1352
        if (r < 0)
×
1353
                return r;
1354

1355
        return copy_file_fd(s->usb_function_strings, fd, 0);
×
1356
}
1357

1358
static int usbffs_dispatch_eps(SocketPort *p, int dfd) {
×
1359
        _cleanup_free_ DirectoryEntries *des = NULL;
×
1360
        int r;
×
1361

1362
        assert(p);
×
1363
        assert(dfd >= 0);
×
1364

1365
        r = readdir_all(dfd, RECURSE_DIR_SORT|RECURSE_DIR_IGNORE_DOT, &des);
×
1366
        if (r < 0)
×
1367
                return r;
1368

1369
        p->auxiliary_fds = new(int, des->n_entries);
×
1370
        if (!p->auxiliary_fds)
×
1371
                return -ENOMEM;
1372

1373
        FOREACH_ARRAY(i, des->entries, des->n_entries) {
×
1374
                const struct dirent *de = *i;
×
1375

1376
                if (streq(de->d_name, "ep0"))
×
1377
                        continue;
×
1378

1379
                r = usbffs_address_create_at(dfd, de->d_name);
×
1380
                if (r < 0)
×
1381
                        goto fail;
×
1382

1383
                p->auxiliary_fds[p->n_auxiliary_fds++] = r;
×
1384
        }
1385

1386
        assert(p->n_auxiliary_fds < des->n_entries);
×
1387

1388
        return 0;
1389

1390
fail:
×
1391
        socket_port_close_auxiliary_fds(p);
×
1392
        return r;
1393
}
1394

1395
int socket_load_service_unit(Socket *s, int cfd, Unit **ret) {
2,340✔
1396
        int r;
2,340✔
1397

1398
        /* Figure out what the unit that will be used to handle the connections on the socket looks like.
1399
         *
1400
         * If cfd < 0, then we don't have a connection yet. In case of Accept=yes sockets, use a fake
1401
         * instance name.
1402
         */
1403

1404
        assert(s);
2,340✔
1405
        assert(ret);
2,340✔
1406

1407
        if (UNIT_ISSET(s->service)) {
2,340✔
1408
                *ret = UNIT_DEREF(s->service);
1,882✔
1409
                return 0;
2,340✔
1410
        }
1411

1412
        if (!s->accept)
458✔
1413
                return -ENODATA;
1414

1415
        /* Build the instance name and load the unit */
1416
        _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
458✔
1417

1418
        r = unit_name_to_prefix(UNIT(s)->id, &prefix);
458✔
1419
        if (r < 0)
458✔
1420
                return r;
1421

1422
        if (cfd >= 0) {
458✔
1423
                r = instance_from_socket(cfd, s->n_accepted, &instance);
2✔
1424
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
1425
                        /* ENOTCONN is legitimate if TCP RST was received. Other socket families might return
1426
                         * different errors. This connection is over, but the socket unit lives on. */
1427
                        return log_unit_debug_errno(UNIT(s), r,
×
1428
                                                    "Got %s on incoming socket, assuming aborted connection attempt, ignoring.",
1429
                                                    errno_to_name(r));
1430
                if (r < 0)
2✔
1431
                        return r;
1432
        }
1433

1434
        /* For accepting sockets, we don't know how the instance will be called until we get a connection and
1435
         * can figure out what the peer name is. So let's use "internal" as the instance to make it clear
1436
         * that this is not an actual peer name. We use "unknown" when we cannot figure out the peer. */
1437
        r = unit_name_build(prefix, instance ?: "internal", ".service", &name);
914✔
1438
        if (r < 0)
458✔
1439
                return r;
1440

1441
        return manager_load_unit(UNIT(s)->manager, name, NULL, NULL, ret);
458✔
1442
}
1443

1444
static int socket_determine_selinux_label(Socket *s, char **ret) {
2,291✔
1445
        Unit *service;
2,291✔
1446
        int r;
2,291✔
1447

1448
        assert(s);
2,291✔
1449
        assert(ret);
2,291✔
1450

1451
        r = socket_load_service_unit(s, /* cfd= */ -EBADF, &service);
2,291✔
1452
        if (r == -ENODATA) {
2,291✔
1453
                *ret = NULL;
×
1454
                return 0;
×
1455
        }
1456
        if (r < 0)
2,291✔
1457
                return r;
1458

1459
        r = service_determine_exec_selinux_label(SERVICE(service), ret);
4,582✔
1460
        if (r == -ENODATA) {
2,291✔
1461
                *ret = NULL;
2,291✔
1462
                return 0;
2,291✔
1463
        }
1464
        return r;
1465
}
1466

1467
static int socket_address_listen_do(
2,355✔
1468
                Socket *s,
1469
                const SocketAddress *address,
1470
                const char *label) {
1471

1472
        assert(s);
2,355✔
1473
        assert(address);
2,355✔
1474

1475
        return socket_address_listen(
4,710✔
1476
                        address,
1477
                        SOCK_CLOEXEC|SOCK_NONBLOCK,
1478
                        s->backlog,
2,355✔
1479
                        s->bind_ipv6_only,
1480
                        s->bind_to_device,
2,355✔
1481
                        s->reuse_port,
2,355✔
1482
                        s->free_bind,
2,355✔
1483
                        s->transparent,
2,355✔
1484
                        s->directory_mode,
1485
                        s->socket_mode,
1486
                        label);
1487
}
1488

1489
#define log_address_error_errno(u, address, error, fmt)          \
1490
        ({                                                       \
1491
                _cleanup_free_ char *_t = NULL;                  \
1492
                                                                 \
1493
                (void) socket_address_print(address, &_t);       \
1494
                log_unit_error_errno(u, error, fmt, strna(_t));  \
1495
        })
1496

1497
static bool fork_needed(const SocketAddress *address, Socket *s) {
2,354✔
1498
        assert(address);
2,354✔
1499
        assert(s);
2,354✔
1500

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

1503
        /* If there are any NFTSet= directives with cgroup source, we need the cgroup */
1504
        Unit *u = UNIT(s);
2,354✔
1505
        CGroupContext *c = unit_get_cgroup_context(u);
2,354✔
1506
        if (c)
2,354✔
1507
                FOREACH_ARRAY(nft_set, c->nft_set_context.sets, c->nft_set_context.n_sets)
2,354✔
1508
                        if (nft_set->source == NFT_SET_SOURCE_CGROUP)
×
1509
                                return true;
1510

1511
        if (IN_SET(address->sockaddr.sa.sa_family, AF_INET, AF_INET6) &&
2,354✔
1512
            bpf_program_supported() > 0) /* If BPF firewalling isn't supported anyway — there's no point in this forking complexity */
×
1513
                return true;
1514

1515
        return exec_needs_network_namespace(&s->exec_context);
2,354✔
1516
}
1517

1518
static int socket_address_listen_in_cgroup(
2,354✔
1519
                Socket *s,
1520
                const SocketAddress *address,
1521
                const char *label) {
1522

1523
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1524
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
2,354✔
1525
        int fd, r;
2,354✔
1526

1527
        assert(s);
2,354✔
1528
        assert(address);
2,354✔
1529

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

1535
        if (!fork_needed(address, s)) {
2,354✔
1536
                /* Shortcut things... */
1537
                fd = socket_address_listen_do(s, address, label);
2,354✔
1538
                if (fd < 0)
2,354✔
1539
                        return log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1540

1541
                return fd;
1542
        }
1543

1544
        r = unit_setup_exec_runtime(UNIT(s));
×
1545
        if (r < 0)
×
1546
                return log_unit_error_errno(UNIT(s), r, "Failed acquire runtime: %m");
×
1547

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

1557
        if (s->exec_context.ipc_namespace_path &&
×
1558
            s->exec_runtime &&
×
1559
            s->exec_runtime->shared &&
×
1560
            s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
×
1561
                r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
×
1562
                if (r < 0)
×
1563
                        return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
×
1564
        }
1565

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

1569
        r = unit_fork_helper_process(UNIT(s), "(sd-listen)", /* into_cgroup= */ true, &pid);
×
1570
        if (r < 0)
1✔
1571
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off listener stub process: %m");
×
1572
        if (r == 0) {
1✔
1573
                /* Child */
1574

1575
                pair[0] = safe_close(pair[0]);
1✔
1576

1577
                if (exec_needs_network_namespace(&s->exec_context) &&
1✔
1578
                    s->exec_runtime &&
×
1579
                    s->exec_runtime->shared &&
×
1580
                    s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
×
1581

1582
                        if (namespace_type_supported(NAMESPACE_NET)) {
×
1583
                                r = setup_shareable_ns(s->exec_runtime->shared->netns_storage_socket, CLONE_NEWNET);
×
1584
                                if (r < 0) {
×
1585
                                        log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
×
1586
                                        _exit(EXIT_NETWORK);
×
1587
                                }
1588
                        } else if (s->exec_context.network_namespace_path) {
×
1589
                                log_unit_error(UNIT(s), "Network namespace path configured but network namespaces not supported.");
×
1590
                                _exit(EXIT_NETWORK);
×
1591
                        } else
1592
                                log_unit_warning(UNIT(s), "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
×
1593
                }
1594

1595
                fd = socket_address_listen_do(s, address, label);
1✔
1596
                if (fd < 0) {
1✔
1597
                        log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
×
1598
                        _exit(EXIT_FAILURE);
×
1599
                }
1600

1601
                r = send_one_fd(pair[1], fd, 0);
1✔
1602
                if (r < 0) {
1✔
1603
                        log_address_error_errno(UNIT(s), address, r, "Failed to send listening socket (%s) to parent: %m");
×
1604
                        _exit(EXIT_FAILURE);
×
1605
                }
1606

1607
                _exit(EXIT_SUCCESS);
1✔
1608
        }
1609

1610
        pair[1] = safe_close(pair[1]);
×
1611
        fd = receive_one_fd(pair[0], 0);
×
1612

1613
        /* We synchronously wait for the helper, as it shouldn't be slow */
1614
        r = wait_for_terminate_and_check("(sd-listen)", pid.pid, WAIT_LOG_ABNORMAL);
×
1615
        if (r < 0) {
×
1616
                safe_close(fd);
×
1617
                return r;
1618
        }
1619

1620
        if (fd < 0)
×
1621
                return log_address_error_errno(UNIT(s), address, fd, "Failed to receive listening socket (%s): %m");
×
1622

1623
        return fd;
1624
}
1625

1626
static int socket_open_fds(Socket *orig_s) {
2,330✔
1627
        _cleanup_(socket_close_fdsp) Socket *s = orig_s;
2,330✔
1628
        _cleanup_freecon_ char *label = NULL;
×
1629
        bool know_label = false;
2,330✔
1630
        int r;
2,330✔
1631

1632
        assert(s);
2,330✔
1633

1634
        LIST_FOREACH(port, p, s->ports) {
2,330✔
1635

1636
                if (p->fd >= 0)
2,426✔
1637
                        continue;
×
1638

1639
                switch (p->type) {
2,426✔
1640

1641
                case SOCKET_SOCKET:
2,354✔
1642

1643
                        if (!know_label) {
2,354✔
1644
                                /* Figure out the label, if we don't it know yet. We do it once for the first
1645
                                 * socket where we need this and remember it for the rest. */
1646

1647
                                r = socket_determine_selinux_label(s, &label);
2,291✔
1648
                                if (r < 0)
2,291✔
1649
                                        return log_unit_error_errno(UNIT(s), r, "Failed to determine SELinux label: %m");
×
1650

1651
                                know_label = true;
1652
                        }
1653

1654
                        /* Apply the socket protocol */
1655
                        switch (p->address.type) {
2,354✔
1656

1657
                        case SOCK_STREAM:
2,189✔
1658
                                if (IN_SET(s->socket_protocol, IPPROTO_SCTP, IPPROTO_MPTCP))
2,189✔
1659
                                        p->address.protocol = s->socket_protocol;
×
1660
                                break;
1661

1662
                        case SOCK_SEQPACKET:
48✔
1663
                                if (s->socket_protocol == IPPROTO_SCTP)
48✔
1664
                                        p->address.protocol = s->socket_protocol;
×
1665
                                break;
1666

1667
                        case SOCK_DGRAM:
60✔
1668
                                if (s->socket_protocol == IPPROTO_UDPLITE)
60✔
1669
                                        p->address.protocol = s->socket_protocol;
×
1670
                                break;
1671
                        }
1672

1673
                        p->fd = socket_address_listen_in_cgroup(s, &p->address, label);
2,354✔
1674
                        if (p->fd < 0)
2,354✔
1675
                                return p->fd;
1676

1677
                        socket_apply_socket_options(s, p, p->fd);
2,354✔
1678
                        socket_symlink(s);
2,354✔
1679
                        break;
1680

1681
                case SOCKET_SPECIAL:
6✔
1682

1683
                        p->fd = special_address_create(p->path, s->writable);
6✔
1684
                        if (p->fd < 0)
6✔
1685
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open special file '%s': %m", p->path);
×
1686
                        break;
1687

1688
                case SOCKET_FIFO:
66✔
1689

1690
                        p->fd = fifo_address_create(
132✔
1691
                                        p->path,
66✔
1692
                                        s->directory_mode,
1693
                                        s->socket_mode);
1694
                        if (p->fd < 0)
66✔
1695
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open FIFO '%s': %m", p->path);
×
1696

1697
                        socket_apply_fifo_options(s, p->fd);
66✔
1698
                        socket_symlink(s);
66✔
1699
                        break;
1700

1701
                case SOCKET_MQUEUE:
×
1702

1703
                        p->fd = mq_address_create(
×
1704
                                        p->path,
×
1705
                                        s->socket_mode,
1706
                                        s->mq_maxmsg,
1707
                                        s->mq_msgsize);
1708
                        if (p->fd < 0)
×
1709
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open message queue '%s': %m", p->path);
×
1710
                        break;
1711

1712
                case SOCKET_USB_FUNCTION: {
×
1713
                        _cleanup_close_ int dfd = -EBADF;
4,756✔
1714

1715
                        dfd = open(p->path, O_DIRECTORY|O_CLOEXEC);
×
1716
                        if (dfd < 0)
×
1717
                                return log_unit_error_errno(UNIT(s), errno,
×
1718
                                                            "Failed to open USB FunctionFS dir '%s': %m", p->path);
1719

1720
                        p->fd = usbffs_address_create_at(dfd, "ep0");
×
1721
                        if (p->fd < 0)
×
1722
                                return log_unit_error_errno(UNIT(s), p->fd, "Failed to open USB FunctionFS ep0: %m");
×
1723

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

1728
                        r = usbffs_dispatch_eps(p, dfd);
×
1729
                        if (r < 0)
×
1730
                                return log_unit_error_errno(UNIT(s), r, "Failed to dispatch USB FunctionFS eps: %m");
×
1731

1732
                        break;
×
1733
                }
1734

1735
                default:
×
1736
                        assert_not_reached();
×
1737
                }
1738
        }
1739

1740
        TAKE_PTR(s);
1741
        return 0;
1742
}
1743

1744
static void socket_unwatch_fds(Socket *s) {
6,433✔
1745
        int r;
6,433✔
1746

1747
        assert(s);
6,433✔
1748

1749
        LIST_FOREACH(port, p, s->ports) {
13,170✔
1750
                if (p->fd < 0)
6,737✔
1751
                        continue;
2,426✔
1752

1753
                r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
4,311✔
1754
                if (r < 0)
4,311✔
1755
                        log_unit_debug_errno(UNIT(s), r, "Failed to disable event source: %m");
×
1756
        }
1757
}
6,433✔
1758

1759
static int socket_watch_fds(Socket *s) {
3,769✔
1760
        int r;
3,769✔
1761

1762
        assert(s);
3,769✔
1763

1764
        LIST_FOREACH(port, p, s->ports) {
7,742✔
1765
                if (p->fd < 0)
3,973✔
1766
                        continue;
×
1767

1768
                if (p->event_source) {
3,973✔
1769
                        r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
676✔
1770
                        if (r < 0)
676✔
1771
                                goto fail;
×
1772
                } else {
1773
                        r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
3,297✔
1774
                        if (r < 0)
3,297✔
1775
                                goto fail;
×
1776

1777
                        (void) sd_event_source_set_description(p->event_source, "socket-port-io");
3,297✔
1778
                }
1779

1780
                r = sd_event_source_set_ratelimit(p->event_source, s->poll_limit.interval, s->poll_limit.burst);
3,973✔
1781
                if (r < 0)
3,973✔
1782
                        log_unit_debug_errno(UNIT(s), r, "Failed to set poll limit on I/O event source, ignoring: %m");
×
1783
        }
1784

1785
        return 0;
1786

1787
fail:
×
1788
        log_unit_warning_errno(UNIT(s), r, "Failed to watch listening fds: %m");
×
1789
        socket_unwatch_fds(s);
×
1790
        return r;
×
1791
}
1792

1793
enum {
1794
        SOCKET_OPEN_NONE,
1795
        SOCKET_OPEN_SOME,
1796
        SOCKET_OPEN_ALL,
1797
};
1798

1799
static int socket_check_open(Socket *s) {
1,236✔
1800
        bool have_open = false, have_closed = false;
1,236✔
1801

1802
        assert(s);
1,236✔
1803

1804
        LIST_FOREACH(port, p, s->ports) {
2,628✔
1805
                if (p->fd < 0)
1,392✔
1806
                        have_closed = true;
1807
                else
1808
                        have_open = true;
1,392✔
1809

1810
                if (have_open && have_closed)
1,392✔
1811
                        return SOCKET_OPEN_SOME;
1812
        }
1813

1814
        if (have_open)
1,236✔
1815
                return SOCKET_OPEN_ALL;
1,236✔
1816

1817
        return SOCKET_OPEN_NONE;
1818
}
1819

1820
static void socket_set_state(Socket *s, SocketState state) {
10,202✔
1821
        SocketState old_state;
10,202✔
1822

1823
        assert(s);
10,202✔
1824

1825
        if (s->state != state)
10,202✔
1826
                bus_unit_send_pending_change_signal(UNIT(s), false);
8,844✔
1827

1828
        old_state = s->state;
10,202✔
1829
        s->state = state;
10,202✔
1830

1831
        if (!SOCKET_STATE_WITH_PROCESS(state)) {
10,202✔
1832
                s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
10,029✔
1833
                socket_unwatch_control_pid(s);
10,029✔
1834
                s->control_command = NULL;
10,029✔
1835
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
10,029✔
1836
        }
1837

1838
        if (state != SOCKET_LISTENING)
10,202✔
1839
                socket_unwatch_fds(s);
6,433✔
1840

1841
        if (!IN_SET(state,
6,433✔
1842
                    SOCKET_START_OPEN,
1843
                    SOCKET_START_CHOWN,
1844
                    SOCKET_START_POST,
1845
                    SOCKET_LISTENING,
1846
                    SOCKET_RUNNING,
1847
                    SOCKET_STOP_PRE,
1848
                    SOCKET_STOP_PRE_SIGTERM,
1849
                    SOCKET_STOP_PRE_SIGKILL))
1850
                socket_close_fds(s);
1,927✔
1851

1852
        if (state != old_state)
10,202✔
1853
                log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state));
8,844✔
1854

1855
        unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], /* reload_success = */ true);
10,202✔
1856
}
10,202✔
1857

1858
static int socket_coldplug(Unit *u) {
2,952✔
1859
        Socket *s = ASSERT_PTR(SOCKET(u));
2,952✔
1860
        int r;
2,952✔
1861

1862
        assert(s->state == SOCKET_DEAD);
2,952✔
1863

1864
        if (s->deserialized_state == s->state)
2,952✔
1865
                return 0;
1866

1867
        if (pidref_is_set(&s->control_pid) &&
1,236✔
1868
            pidref_is_unwaited(&s->control_pid) > 0 &&
×
1869
            SOCKET_STATE_WITH_PROCESS(s->deserialized_state)) {
×
1870

1871
                r = unit_watch_pidref(UNIT(s), &s->control_pid, /* exclusive= */ false);
×
1872
                if (r < 0)
×
1873
                        return r;
1874

1875
                r = socket_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec));
×
1876
                if (r < 0)
×
1877
                        return r;
1878
        }
1879

1880
        if (IN_SET(s->deserialized_state,
1,236✔
1881
                   SOCKET_START_OPEN,
1882
                   SOCKET_START_CHOWN,
1883
                   SOCKET_START_POST,
1884
                   SOCKET_LISTENING,
1885
                   SOCKET_RUNNING)) {
1886

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

1896
                r = socket_check_open(s);
1,236✔
1897
                if (r == SOCKET_OPEN_NONE)
1,236✔
1898
                        log_unit_warning(UNIT(s),
×
1899
                                         "Socket unit configuration has changed while unit has been running, "
1900
                                         "no open socket file descriptor left. "
1901
                                         "The socket unit is not functional until restarted.");
1902
                else if (r == SOCKET_OPEN_SOME)
1,236✔
1903
                        log_unit_warning(UNIT(s),
×
1904
                                         "Socket unit configuration has changed while unit has been running, "
1905
                                         "and some socket file descriptors have not been opened yet. "
1906
                                         "The socket unit is not fully functional until restarted.");
1907
        }
1908

1909
        if (s->deserialized_state == SOCKET_LISTENING) {
1,236✔
1910
                r = socket_watch_fds(s);
753✔
1911
                if (r < 0)
753✔
1912
                        return r;
1913
        }
1914

1915
        if (!IN_SET(s->deserialized_state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_CLEANING))
1,236✔
1916
                (void) unit_setup_exec_runtime(u);
1,236✔
1917

1918
        socket_set_state(s, s->deserialized_state);
1,236✔
1919
        return 0;
1,236✔
1920
}
1921

1922
static int socket_spawn(Socket *s, ExecCommand *c, PidRef *ret_pid) {
173✔
1923
        _cleanup_(exec_params_shallow_clear) ExecParameters exec_params = EXEC_PARAMETERS_INIT(
173✔
1924
                        EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN);
1925
        _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
173✔
1926
        int r;
173✔
1927

1928
        assert(s);
173✔
1929
        assert(c);
173✔
1930
        assert(ret_pid);
173✔
1931

1932
        r = unit_prepare_exec(UNIT(s));
173✔
1933
        if (r < 0)
173✔
1934
                return r;
1935

1936
        r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
173✔
1937
        if (r < 0)
173✔
1938
                return r;
1939

1940
        r = unit_set_exec_params(UNIT(s), &exec_params);
173✔
1941
        if (r < 0)
173✔
1942
                return r;
1943

1944
        /* Note that ExecStartPre= command doesn't inherit any FDs. It runs before we open listen FDs. */
1945
        if (s->pass_fds_to_exec) {
173✔
1946
                _cleanup_strv_free_ char **fd_names = NULL;
×
1947
                _cleanup_free_ int *fds = NULL;
×
1948
                int n_fds;
×
1949

1950
                n_fds = socket_collect_fds(s, &fds);
×
1951
                if (n_fds < 0)
×
1952
                        return n_fds;
1953

1954
                r = strv_extend_n(&fd_names, socket_fdname(s), n_fds);
×
1955
                if (r < 0)
×
1956
                        return r;
1957

1958
                exec_params.flags |= EXEC_PASS_FDS;
×
1959
                exec_params.fds = TAKE_PTR(fds);
×
1960
                exec_params.fd_names = TAKE_PTR(fd_names);
×
1961
                exec_params.n_socket_fds = n_fds;
×
1962
        }
1963

1964
        r = exec_spawn(UNIT(s),
173✔
1965
                       c,
1966
                       &s->exec_context,
173✔
1967
                       &exec_params,
1968
                       s->exec_runtime,
1969
                       &s->cgroup_context,
173✔
1970
                       &pidref);
1971
        if (r < 0)
173✔
1972
                return r;
1973

1974
        r = unit_watch_pidref(UNIT(s), &pidref, /* exclusive= */ true);
173✔
1975
        if (r < 0)
173✔
1976
                return r;
1977

1978
        *ret_pid = TAKE_PIDREF(pidref);
173✔
1979
        return 0;
173✔
1980
}
1981

1982
static int socket_chown(Socket *s, PidRef *ret_pid) {
×
1983
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
1984
        int r;
×
1985

1986
        assert(s);
×
1987

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

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

1995
        r = unit_fork_helper_process(UNIT(s), "(sd-chown)", /* into_cgroup= */ true, &pid);
×
1996
        if (r < 0)
3✔
1997
                return r;
1998
        if (r == 0) {
3✔
1999
                uid_t uid = UID_INVALID;
3✔
2000
                gid_t gid = GID_INVALID;
3✔
2001

2002
                /* Child */
2003

2004
                if (!isempty(s->user)) {
3✔
2005
                        const char *user = s->user;
1✔
2006

2007
                        r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0);
1✔
2008
                        if (r < 0) {
1✔
2009
                                log_unit_error_errno(UNIT(s), r, "Failed to resolve user %s: %m", user);
×
2010
                                _exit(EXIT_USER);
×
2011
                        }
2012
                }
2013

2014
                if (!isempty(s->group)) {
3✔
2015
                        const char *group = s->group;
3✔
2016

2017
                        r = get_group_creds(&group, &gid, 0);
3✔
2018
                        if (r < 0) {
3✔
2019
                                log_unit_error_errno(UNIT(s), r, "Failed to resolve group %s: %m", group);
×
2020
                                _exit(EXIT_GROUP);
×
2021
                        }
2022
                }
2023

2024
                LIST_FOREACH(port, p, s->ports) {
6✔
2025
                        const char *path = NULL;
3✔
2026

2027
                        if (p->type == SOCKET_SOCKET)
3✔
2028
                                path = socket_address_get_path(&p->address);
2✔
2029
                        else if (p->type == SOCKET_FIFO)
1✔
2030
                                path = p->path;
×
2031
                        else if (p->type == SOCKET_MQUEUE) {
1✔
2032
                                /* Use fchown on the fd since /dev/mqueue might not be mounted. */
2033
                                if (fchown(p->fd, uid, gid) < 0) {
1✔
2034
                                        log_unit_error_errno(UNIT(s), errno, "Failed to fchown(): %m");
×
2035
                                        _exit(EXIT_CHOWN);
×
2036
                                }
2037
                                continue;
1✔
2038
                        }
2039

2040
                        if (!path)
2✔
2041
                                continue;
×
2042

2043
                        if (chown(path, uid, gid) < 0) {
2✔
2044
                                log_unit_error_errno(UNIT(s), errno, "Failed to chown(): %m");
×
2045
                                _exit(EXIT_CHOWN);
×
2046
                        }
2047
                }
2048

2049
                _exit(EXIT_SUCCESS);
3✔
2050
        }
2051

2052
        r = unit_watch_pidref(UNIT(s), &pid, /* exclusive= */ true);
×
2053
        if (r < 0)
×
2054
                return r;
2055

2056
        *ret_pid = TAKE_PIDREF(pid);
×
2057
        return 0;
×
2058
}
2059

2060
static void socket_enter_dead(Socket *s, SocketResult f) {
1,927✔
2061
        assert(s);
1,927✔
2062

2063
        if (s->result == SOCKET_SUCCESS)
1,927✔
2064
                s->result = f;
1,927✔
2065

2066
        if (s->result == SOCKET_SUCCESS)
1,927✔
2067
                unit_log_success(UNIT(s));
1,927✔
2068
        else
2069
                unit_log_failure(UNIT(s), socket_result_to_string(s->result));
×
2070

2071
        unit_warn_leftover_processes(UNIT(s), /* start = */ false);
1,927✔
2072

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

2075
        s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
1,927✔
2076

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

2079
        unit_unref_uid_gid(UNIT(s), true);
1,927✔
2080
}
1,927✔
2081

2082
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
2083

2084
static void socket_enter_stop_post(Socket *s, SocketResult f) {
1,927✔
2085
        int r;
1,927✔
2086

2087
        assert(s);
1,927✔
2088

2089
        if (s->result == SOCKET_SUCCESS)
1,927✔
2090
                s->result = f;
1,927✔
2091

2092
        socket_unwatch_control_pid(s);
1,927✔
2093
        s->control_command_id = SOCKET_EXEC_STOP_POST;
1,927✔
2094
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST];
1,927✔
2095

2096
        if (s->control_command) {
1,927✔
2097
                pidref_done(&s->control_pid);
×
2098

2099
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2100
                if (r < 0) {
×
2101
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-post' task: %m");
×
2102
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2103
                        return;
×
2104
                }
2105

2106
                socket_set_state(s, SOCKET_STOP_POST);
×
2107
        } else
2108
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
1,927✔
2109
}
2110

2111
static int state_to_kill_operation(Socket *s, SocketState state) {
3,854✔
2112
        assert(s);
3,854✔
2113

2114
        if (state == SOCKET_STOP_PRE_SIGTERM)
3,854✔
2115
                return unit_has_job_type(UNIT(s), JOB_RESTART) ? KILL_RESTART : KILL_TERMINATE;
×
2116

2117
        if (state == SOCKET_FINAL_SIGTERM)
3,854✔
2118
                return KILL_TERMINATE;
1,927✔
2119

2120
        return KILL_KILL;
2121
}
2122

2123
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
3,854✔
2124
        int r;
3,854✔
2125

2126
        assert(s);
3,854✔
2127

2128
        if (s->result == SOCKET_SUCCESS)
3,854✔
2129
                s->result = f;
3,854✔
2130

2131
        r = unit_kill_context(UNIT(s), state_to_kill_operation(s, state));
3,854✔
2132
        if (r < 0) {
3,854✔
2133
                log_unit_warning_errno(UNIT(s), r, "Failed to kill processes: %m");
×
2134
                goto fail;
×
2135
        }
2136
        if (r > 0) {
3,854✔
2137
                r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec);
×
2138
                if (r < 0) {
×
2139
                        log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m");
×
2140
                        goto fail;
×
2141
                }
2142

2143
                socket_set_state(s, state);
×
2144
        } else if (state == SOCKET_STOP_PRE_SIGTERM)
3,854✔
2145
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
×
2146
        else if (state == SOCKET_STOP_PRE_SIGKILL)
3,854✔
2147
                socket_enter_stop_post(s, SOCKET_SUCCESS);
×
2148
        else if (state == SOCKET_FINAL_SIGTERM)
3,854✔
2149
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
1,927✔
2150
        else
2151
                socket_enter_dead(s, SOCKET_SUCCESS);
1,927✔
2152

2153
        return;
2154

2155
fail:
×
2156
        if (IN_SET(state, SOCKET_STOP_PRE_SIGTERM, SOCKET_STOP_PRE_SIGKILL))
×
2157
                socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2158
        else
2159
                socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2160
}
2161

2162
static void socket_enter_stop_pre(Socket *s, SocketResult f) {
1,927✔
2163
        int r;
1,927✔
2164

2165
        assert(s);
1,927✔
2166

2167
        if (s->result == SOCKET_SUCCESS)
1,927✔
2168
                s->result = f;
1,927✔
2169

2170
        socket_unwatch_control_pid(s);
1,927✔
2171
        s->control_command_id = SOCKET_EXEC_STOP_PRE;
1,927✔
2172
        s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE];
1,927✔
2173

2174
        if (s->control_command) {
1,927✔
2175
                pidref_done(&s->control_pid);
×
2176

2177
                r = socket_spawn(s, s->control_command, &s->control_pid);
×
2178
                if (r < 0) {
×
2179
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'stop-pre' task: %m");
×
2180
                        socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
×
2181
                        return;
×
2182
                }
2183

2184
                socket_set_state(s, SOCKET_STOP_PRE);
×
2185
        } else
2186
                socket_enter_stop_post(s, SOCKET_SUCCESS);
1,927✔
2187
}
2188

2189
static void flush_ports(Socket *s) {
×
2190
        assert(s);
×
2191

2192
        /* Flush all incoming traffic, regardless if actual bytes or new connections, so that this socket isn't busy
2193
         * anymore */
2194

2195
        LIST_FOREACH(port, p, s->ports) {
×
2196
                if (p->fd < 0)
×
2197
                        continue;
×
2198

2199
                if (p->type == SOCKET_MQUEUE)
×
2200
                        (void) flush_mqueue(p->fd);
×
2201
                else {
2202
                        (void) flush_accept(p->fd);
×
2203
                        (void) flush_fd(p->fd);
×
2204
                }
2205
        }
2206
}
×
2207

2208
static void socket_enter_listening(Socket *s) {
3,016✔
2209
        int r;
3,016✔
2210

2211
        assert(s);
3,016✔
2212

2213
        if (!s->accept && s->flush_pending) {
3,016✔
2214
                log_unit_debug(UNIT(s), "Flushing socket before listening.");
×
2215
                flush_ports(s);
×
2216
        }
2217

2218
        r = socket_watch_fds(s);
3,016✔
2219
        if (r < 0) {
3,016✔
2220
                log_unit_warning_errno(UNIT(s), r, "Failed to watch sockets: %m");
×
2221
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2222
                return;
×
2223
        }
2224

2225
        socket_set_state(s, SOCKET_LISTENING);
3,016✔
2226
}
2227

2228
static void socket_enter_start_post(Socket *s) {
2,330✔
2229
        int r;
2,330✔
2230

2231
        assert(s);
2,330✔
2232

2233
        socket_unwatch_control_pid(s);
2,330✔
2234
        s->control_command_id = SOCKET_EXEC_START_POST;
2,330✔
2235
        s->control_command = s->exec_command[SOCKET_EXEC_START_POST];
2,330✔
2236

2237
        if (s->control_command) {
2,330✔
2238
                pidref_done(&s->control_pid);
173✔
2239

2240
                r = socket_spawn(s, s->control_command, &s->control_pid);
173✔
2241
                if (r < 0) {
173✔
2242
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-post' task: %m");
×
2243
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2244
                        return;
×
2245
                }
2246

2247
                socket_set_state(s, SOCKET_START_POST);
173✔
2248
        } else
2249
                socket_enter_listening(s);
2,157✔
2250
}
2251

2252
static void socket_enter_start_chown(Socket *s) {
2,330✔
2253
        int r;
2,330✔
2254

2255
        assert(s);
2,330✔
2256
        assert(s->state == SOCKET_START_OPEN);
2,330✔
2257

2258
        if (!isempty(s->user) || !isempty(s->group)) {
2,330✔
2259

2260
                socket_unwatch_control_pid(s);
×
2261
                s->control_command_id = SOCKET_EXEC_START_CHOWN;
×
2262
                s->control_command = NULL;
×
2263

2264
                r = socket_chown(s, &s->control_pid);
×
2265
                if (r < 0) {
×
2266
                        log_unit_warning_errno(UNIT(s), r, "Failed to spawn 'start-chown' task: %m");
×
2267
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2268
                        return;
×
2269
                }
2270

2271
                socket_set_state(s, SOCKET_START_CHOWN);
×
2272
        } else
2273
                socket_enter_start_post(s);
2,330✔
2274
}
2275

2276
static void socket_enter_start_open(Socket *s) {
2,330✔
2277
        int r;
2,330✔
2278

2279
        assert(s);
2,330✔
2280
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED, SOCKET_START_PRE));
2,330✔
2281

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

2287
        socket_set_state(s, SOCKET_START_OPEN);
2,330✔
2288

2289
        r = socket_open_fds(s);
2,330✔
2290
        if (r < 0) {
2,330✔
2291
                log_unit_error_errno(UNIT(s), r, "Failed to listen on sockets: %m");
×
2292
                socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2293
                return;
×
2294
        }
2295

2296
        socket_enter_start_chown(s);
2,330✔
2297
}
2298

2299
static void socket_enter_start_pre(Socket *s) {
2,330✔
2300
        int r;
2,330✔
2301

2302
        assert(s);
2,330✔
2303

2304
        socket_unwatch_control_pid(s);
2,330✔
2305

2306
        unit_warn_leftover_processes(UNIT(s), /* start = */ true);
2,330✔
2307

2308
        s->control_command_id = SOCKET_EXEC_START_PRE;
2,330✔
2309
        s->control_command = s->exec_command[SOCKET_EXEC_START_PRE];
2,330✔
2310

2311
        if (s->control_command) {
2,330✔
2312
                pidref_done(&s->control_pid);
×
2313

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

2321
                socket_set_state(s, SOCKET_START_PRE);
×
2322
        } else
2323
                socket_enter_start_open(s);
2,330✔
2324
}
2325

2326
static void socket_enter_running(Socket *s, int cfd_in) {
221✔
2327
        /* Note that this call takes possession of the connection fd passed. It either has to assign it
2328
         * somewhere or close it. */
2329
        _cleanup_close_ int cfd = cfd_in;
221✔
2330
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
221✔
2331
        int r;
221✔
2332

2333
        assert(s);
221✔
2334

2335
        /* We don't take connections anymore if we are supposed to shut down anyway */
2336
        if (unit_stop_pending(UNIT(s))) {
221✔
2337

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

2340
                if (cfd >= 0)
×
2341
                        goto refuse;
×
2342

2343
                flush_ports(s);
×
2344
                return;
2345
        }
2346

2347
        if (!ratelimit_below(&s->trigger_limit)) {
221✔
2348
                log_unit_warning(UNIT(s), "Trigger limit hit, refusing further activation.");
×
2349
                socket_enter_stop_pre(s, SOCKET_FAILURE_TRIGGER_LIMIT_HIT);
×
2350
                goto refuse;
×
2351
        }
2352

2353
        if (cfd < 0) { /* Accept=no case */
221✔
2354
                bool pending = false;
219✔
2355
                Unit *other;
219✔
2356

2357
                /* If there's already a start pending don't bother to do anything */
2358
                UNIT_FOREACH_DEPENDENCY(other, UNIT(s), UNIT_ATOM_TRIGGERS)
766✔
2359
                        if (unit_active_or_pending(other)) {
219✔
2360
                                pending = true;
2361
                                break;
2362
                        }
2363

2364
                if (!pending) {
219✔
2365
                        if (!UNIT_ISSET(s->service)) {
109✔
2366
                                log_unit_warning(UNIT(s),
×
2367
                                                 "Service to activate vanished, refusing activation.");
2368
                                goto fail;
×
2369
                        }
2370

2371
                        r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, /* ret = */ NULL);
109✔
2372
                        if (r == -EDEADLK)
109✔
2373
                                return (void) log_unit_debug_errno(UNIT(s), r, "Failed to queue service startup job, ignoring: %s", bus_error_message(&error, r));
15✔
2374
                        if (r < 0)
94✔
2375
                                goto queue_error;
×
2376
                }
2377

2378
                socket_set_state(s, SOCKET_RUNNING);
204✔
2379
        } else { /* Accept=yes case */
2380
                _cleanup_(socket_peer_unrefp) SocketPeer *p = NULL;
2✔
2381
                Unit *service;
2✔
2382

2383
                if (s->n_connections >= s->max_connections) {
2✔
2384
                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), dropping connection.",
×
2385
                                         s->n_connections);
2386
                        goto refuse;
×
2387
                }
2388

2389
                if (s->max_connections_per_source > 0) {
2✔
2390
                        r = socket_acquire_peer(s, cfd, &p);
2✔
2391
                        if (r < 0) {
2✔
2392
                                if (ERRNO_IS_DISCONNECT(r))
×
2393
                                        return;
2394
                                /* We didn't have enough resources to acquire peer information, let's fail. */
2395
                                goto fail;
×
2396
                        }
2397
                        if (r > 0 && p->n_ref > s->max_connections_per_source) {
2✔
2398
                                _cleanup_free_ char *t = NULL;
×
2399

2400
                                if (p->peer.sa.sa_family == AF_UNIX)
×
2401
                                        (void) asprintf(&t, "UID " UID_FMT, p->peer_cred.uid);
×
2402
                                else
2403
                                        (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, /* translate_ipv6= */ true, /* include_port= */ false, &t);
×
2404

2405
                                log_unit_warning(UNIT(s),
×
2406
                                                 "Too many incoming connections (%u) from source %s, dropping connection.",
2407
                                                 p->n_ref, strnull(t));
2408
                                goto refuse;
×
2409
                        }
2410
                }
2411

2412
                r = socket_load_service_unit(s, cfd, &service);
2✔
2413
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
2414
                        return;
2415
                if (r < 0 || UNIT_IS_LOAD_ERROR(service->load_state)) {
2✔
2416
                        log_unit_warning_errno(UNIT(s), r < 0 ? r : service->load_error,
×
2417
                                               "Failed to load connection service unit: %m");
2418
                        goto fail;
×
2419
                }
2420
                if (service->load_state == UNIT_MASKED) {
2✔
2421
                        log_unit_warning(UNIT(s), "Connection service unit is masked, refusing.");
×
2422
                        goto fail;
×
2423
                }
2424

2425
                s->n_accepted++;
2✔
2426

2427
                r = service_set_socket_fd(SERVICE(service), cfd, s, p, s->selinux_context_from_net);
4✔
2428
                if (ERRNO_IS_NEG_DISCONNECT(r))
2✔
2429
                        return;
2430
                if (r < 0) {
2✔
2431
                        log_unit_warning_errno(UNIT(s), r, "Failed to set socket on service: %m");
×
2432
                        goto fail;
×
2433
                }
2434

2435
                /* We passed ownership of the fd and socket peer to the service now. */
2436
                TAKE_FD(cfd);
2✔
2437
                TAKE_PTR(p);
2✔
2438

2439
                s->n_connections++;
2✔
2440

2441
                r = manager_add_job(UNIT(s)->manager, JOB_START, service, JOB_REPLACE, &error, /* ret = */ NULL);
2✔
2442
                if (r < 0) {
2✔
2443
                        /* We failed to activate the new service, but it still exists. Let's make sure the
2444
                         * service closes and forgets the connection fd again, immediately. */
2445
                        service_release_socket_fd(SERVICE(service));
×
2446
                        goto queue_error;
×
2447
                }
2448

2449
                /* Notify clients about changed counters */
2450
                unit_add_to_dbus_queue(UNIT(s));
2✔
2451
        }
2452

2453
        return;
2454

2455
refuse:
×
2456
        s->n_refused++;
×
2457
        return;
×
2458

2459
queue_error:
×
2460
        log_unit_warning_errno(UNIT(s), r, "Failed to queue service startup job%s: %s",
×
2461
                               cfd >= 0 && !ERRNO_IS_RESOURCE(r) ? " (Maybe the service is missing or is a template unit?)" : "",
2462
                               bus_error_message(&error, r));
2463

2464
fail:
×
2465
        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2466
}
2467

2468
static void socket_run_next(Socket *s) {
×
2469
        int r;
×
2470

2471
        assert(s);
×
2472
        assert(s->control_command);
×
2473
        assert(s->control_command->command_next);
×
2474

2475
        socket_unwatch_control_pid(s);
×
2476

2477
        s->control_command = s->control_command->command_next;
×
2478

2479
        pidref_done(&s->control_pid);
×
2480

2481
        r = socket_spawn(s, s->control_command, &s->control_pid);
×
2482
        if (r < 0) {
×
2483
                log_unit_warning_errno(UNIT(s), r, "Failed to spawn next task: %m");
×
2484

2485
                if (s->state == SOCKET_START_POST)
×
2486
                        socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
×
2487
                else if (s->state == SOCKET_STOP_POST)
×
2488
                        socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
×
2489
                else
2490
                        socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
×
2491
        }
2492
}
×
2493

2494
static int socket_start(Unit *u) {
2,330✔
2495
        Socket *s = ASSERT_PTR(SOCKET(u));
2,330✔
2496
        int r;
2,330✔
2497

2498
        /* We cannot fulfill this request right now, try again later
2499
         * please! */
2500
        if (IN_SET(s->state,
2,330✔
2501
                   SOCKET_STOP_PRE,
2502
                   SOCKET_STOP_PRE_SIGKILL,
2503
                   SOCKET_STOP_PRE_SIGTERM,
2504
                   SOCKET_STOP_POST,
2505
                   SOCKET_FINAL_SIGTERM,
2506
                   SOCKET_FINAL_SIGKILL,
2507
                   SOCKET_CLEANING))
2508
                return -EAGAIN;
2509

2510
        /* Already on it! */
2511
        if (IN_SET(s->state,
2,330✔
2512
                   SOCKET_START_PRE,
2513
                   SOCKET_START_OPEN,
2514
                   SOCKET_START_CHOWN,
2515
                   SOCKET_START_POST))
2516
                return 0;
2517

2518
        /* Cannot run this without the service being around */
2519
        if (UNIT_ISSET(s->service)) {
2,330✔
2520
                Service *service = ASSERT_PTR(SERVICE(UNIT_DEREF(s->service)));
1,891✔
2521

2522
                if (UNIT(service)->load_state != UNIT_LOADED)
1,891✔
2523
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
×
2524
                                                    "Socket service %s not loaded, refusing.", UNIT(service)->id);
2525

2526
                /* If the service is already active we cannot start the socket */
2527
                if (SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ false))
1,891✔
2528
                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY),
×
2529
                                                    "Socket service %s already active, refusing.", UNIT(service)->id);
2530
        }
2531

2532
        assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
2,330✔
2533

2534
        r = unit_acquire_invocation_id(u);
2,330✔
2535
        if (r < 0)
2,330✔
2536
                return r;
2537

2538
        s->result = SOCKET_SUCCESS;
2,330✔
2539
        exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
2,330✔
2540

2541
        if (s->cgroup_runtime)
2,330✔
2542
                s->cgroup_runtime->reset_accounting = true;
63✔
2543

2544
        socket_enter_start_pre(s);
2,330✔
2545
        return 1;
2,330✔
2546
}
2547

2548
static int socket_stop(Unit *u) {
1,927✔
2549
        Socket *s = ASSERT_PTR(SOCKET(u));
1,927✔
2550

2551
        /* Already on it */
2552
        if (IN_SET(s->state,
1,927✔
2553
                   SOCKET_STOP_PRE,
2554
                   SOCKET_STOP_PRE_SIGTERM,
2555
                   SOCKET_STOP_PRE_SIGKILL,
2556
                   SOCKET_STOP_POST,
2557
                   SOCKET_FINAL_SIGTERM,
2558
                   SOCKET_FINAL_SIGKILL))
2559
                return 0;
2560

2561
        /* If there's already something running we go directly into
2562
         * kill mode. */
2563
        if (IN_SET(s->state,
1,927✔
2564
                   SOCKET_START_PRE,
2565
                   SOCKET_START_OPEN,
2566
                   SOCKET_START_CHOWN,
2567
                   SOCKET_START_POST)) {
2568
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
×
2569
                return -EAGAIN;
×
2570
        }
2571

2572
        /* If we are currently cleaning, then abort it, brutally. */
2573
        if (s->state == SOCKET_CLEANING) {
1,927✔
2574
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
×
2575
                return 0;
×
2576
        }
2577

2578
        assert(IN_SET(s->state, SOCKET_LISTENING, SOCKET_RUNNING));
1,927✔
2579

2580
        socket_enter_stop_pre(s, SOCKET_SUCCESS);
1,927✔
2581
        return 1;
1,927✔
2582
}
2583

2584
static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
2,475✔
2585
        Socket *s = ASSERT_PTR(SOCKET(u));
2,475✔
2586
        int r;
2,475✔
2587

2588
        assert(f);
2,475✔
2589
        assert(fds);
2,475✔
2590

2591
        (void) serialize_item(f, "state", socket_state_to_string(s->state));
2,475✔
2592
        (void) serialize_item(f, "result", socket_result_to_string(s->result));
2,475✔
2593
        (void) serialize_item_format(f, "n-accepted", "%u", s->n_accepted);
2,475✔
2594
        (void) serialize_item_format(f, "n-refused", "%u", s->n_refused);
2,475✔
2595
        (void) serialize_pidref(f, fds, "control-pid", &s->control_pid);
2,475✔
2596

2597
        if (s->control_command_id >= 0)
2,475✔
2598
                (void) serialize_item(f, "control-command", socket_exec_command_to_string(s->control_command_id));
×
2599

2600
        LIST_FOREACH(port, p, s->ports) {
5,160✔
2601
                int copy;
2,685✔
2602

2603
                if (p->fd < 0)
2,685✔
2604
                        continue;
998✔
2605

2606
                copy = fdset_put_dup(fds, p->fd);
1,687✔
2607
                if (copy < 0)
1,687✔
2608
                        return log_unit_warning_errno(u, copy, "Failed to serialize socket fd: %m");
×
2609

2610
                if (p->type == SOCKET_SOCKET) {
1,687✔
2611
                        _cleanup_free_ char *t = NULL;
1,547✔
2612

2613
                        r = socket_address_print(&p->address, &t);
1,547✔
2614
                        if (r < 0)
1,547✔
2615
                                return log_unit_error_errno(u, r, "Failed to format socket address: %m");
×
2616

2617
                        if (socket_address_family(&p->address) == AF_NETLINK)
1,547✔
2618
                                (void) serialize_item_format(f, "netlink", "%i %s", copy, t);
115✔
2619
                        else
2620
                                (void) serialize_item_format(f, "socket", "%i %i %s", copy, p->address.type, t);
1,432✔
2621
                } else if (p->type == SOCKET_SPECIAL)
140✔
2622
                        (void) serialize_item_format(f, "special", "%i %s", copy, p->path);
18✔
2623
                else if (p->type == SOCKET_MQUEUE)
122✔
2624
                        (void) serialize_item_format(f, "mqueue", "%i %s", copy, p->path);
×
2625
                else if (p->type == SOCKET_USB_FUNCTION)
122✔
2626
                        (void) serialize_item_format(f, "ffs", "%i %s", copy, p->path);
×
2627
                else {
2628
                        assert(p->type == SOCKET_FIFO);
122✔
2629
                        (void) serialize_item_format(f, "fifo", "%i %s", copy, p->path);
122✔
2630
                }
2631
        }
2632

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

2635
        return 0;
2,475✔
2636
}
2637

2638
static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
11,172✔
2639
        Socket *s = ASSERT_PTR(SOCKET(u));
11,172✔
2640
        int r;
11,172✔
2641

2642
        assert(key);
11,172✔
2643
        assert(value);
11,172✔
2644

2645
        if (streq(key, "state")) {
11,172✔
2646
                SocketState state;
1,956✔
2647

2648
                state = socket_state_from_string(value);
1,956✔
2649
                if (state < 0)
1,956✔
2650
                        log_unit_debug(u, "Failed to parse state value: %s", value);
×
2651
                else
2652
                        s->deserialized_state = state;
1,956✔
2653
        } else if (streq(key, "result")) {
9,216✔
2654
                SocketResult f;
1,956✔
2655

2656
                f = socket_result_from_string(value);
1,956✔
2657
                if (f < 0)
1,956✔
2658
                        log_unit_debug(u, "Failed to parse result value: %s", value);
×
2659
                else if (f != SOCKET_SUCCESS)
1,956✔
2660
                        s->result = f;
×
2661

2662
        } else if (streq(key, "n-accepted")) {
7,260✔
2663
                unsigned k;
1,956✔
2664

2665
                if (safe_atou(value, &k) < 0)
1,956✔
2666
                        log_unit_debug(u, "Failed to parse n-accepted value: %s", value);
×
2667
                else
2668
                        s->n_accepted += k;
1,956✔
2669
        } else if (streq(key, "n-refused")) {
5,304✔
2670
                unsigned k;
1,956✔
2671

2672
                if (safe_atou(value, &k) < 0)
1,956✔
2673
                        log_unit_debug(u, "Failed to parse n-refused value: %s", value);
×
2674
                else
2675
                        s->n_refused += k;
1,956✔
2676
        } else if (streq(key, "control-pid")) {
3,348✔
2677

2678
                if (!pidref_is_set(&s->control_pid))
11,172✔
2679
                        (void) deserialize_pidref(fds, value, &s->control_pid);
×
2680

2681
        } else if (streq(key, "control-command")) {
3,348✔
2682
                SocketExecCommand id;
×
2683

2684
                id = socket_exec_command_from_string(value);
×
2685
                if (id < 0)
×
2686
                        log_unit_debug(u, "Failed to parse exec-command value: %s", value);
×
2687
                else {
2688
                        s->control_command_id = id;
×
2689
                        s->control_command = s->exec_command[id];
×
2690
                }
2691
        } else if (streq(key, "fifo")) {
3,348✔
2692
                _cleanup_free_ char *fdv = NULL;
102✔
2693
                bool found = false;
102✔
2694
                int fd;
102✔
2695

2696
                r = extract_first_word(&value, &fdv, NULL, 0);
102✔
2697
                if (r <= 0) {
102✔
2698
                        log_unit_debug(u, "Failed to parse fifo value: %s", value);
×
2699
                        return 0;
×
2700
                }
2701

2702
                fd = parse_fd(fdv);
102✔
2703
                if (fd < 0 || !fdset_contains(fds, fd)) {
102✔
2704
                        log_unit_debug(u, "Invalid fifo value: %s", fdv);
×
2705
                        return 0;
×
2706
                }
2707

2708
                LIST_FOREACH(port, p, s->ports)
153✔
2709
                        if (p->fd < 0 &&
153✔
2710
                            p->type == SOCKET_FIFO &&
102✔
2711
                            path_equal_or_inode_same(p->path, value, 0)) {
102✔
2712
                                p->fd = fdset_remove(fds, fd);
102✔
2713
                                found = true;
102✔
2714
                                break;
102✔
2715
                        }
2716
                if (!found)
102✔
2717
                        log_unit_debug(u, "No matching fifo socket found: %s", value);
×
2718

2719
        } else if (streq(key, "special")) {
3,246✔
2720
                _cleanup_free_ char *fdv = NULL;
15✔
2721
                bool found = false;
15✔
2722
                int fd;
15✔
2723

2724
                r = extract_first_word(&value, &fdv, NULL, 0);
15✔
2725
                if (r <= 0) {
15✔
2726
                        log_unit_debug(u, "Failed to parse special value: %s", value);
×
2727
                        return 0;
×
2728
                }
2729

2730
                fd = parse_fd(fdv);
15✔
2731
                if (fd < 0 || !fdset_contains(fds, fd)) {
15✔
2732
                        log_unit_debug(u, "Invalid special value: %s", fdv);
×
2733
                        return 0;
×
2734
                }
2735

2736
                LIST_FOREACH(port, p, s->ports)
15✔
2737
                        if (p->fd < 0 &&
15✔
2738
                            p->type == SOCKET_SPECIAL &&
15✔
2739
                            path_equal_or_inode_same(p->path, value, 0)) {
15✔
2740
                                p->fd = fdset_remove(fds, fd);
15✔
2741
                                found = true;
15✔
2742
                                break;
15✔
2743
                        }
2744
                if (!found)
15✔
2745
                        log_unit_debug(u, "No matching special socket found: %s", value);
×
2746

2747
        } else if (streq(key, "mqueue")) {
3,231✔
2748
                _cleanup_free_ char *fdv = NULL;
×
2749
                bool found = false;
×
2750
                int fd;
×
2751

2752
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2753
                if (r <= 0) {
×
2754
                        log_unit_debug(u, "Failed to parse mqueue value: %s", value);
×
2755
                        return 0;
×
2756
                }
2757

2758
                fd = parse_fd(fdv);
×
2759
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2760
                        log_unit_debug(u, "Invalid mqueue value: %s", fdv);
×
2761
                        return 0;
×
2762
                }
2763

2764
                LIST_FOREACH(port, p, s->ports)
×
2765
                        if (p->fd < 0 &&
×
2766
                            p->type == SOCKET_MQUEUE &&
×
2767
                            streq(p->path, value)) {
×
2768
                                p->fd = fdset_remove(fds, fd);
×
2769
                                found = true;
×
2770
                                break;
×
2771
                        }
2772
                if (!found)
×
2773
                        log_unit_debug(u, "No matching mqueue socket found: %s", value);
×
2774

2775
        } else if (streq(key, "socket")) {
3,231✔
2776
                _cleanup_free_ char *fdv = NULL, *typev = NULL;
1,188✔
2777
                bool found = false;
1,188✔
2778
                int fd, type;
1,188✔
2779

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

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

2792
                r = extract_first_word(&value, &typev, NULL, 0);
1,188✔
2793
                if (r <= 0) {
1,188✔
2794
                        log_unit_debug(u, "Failed to parse socket type from value: %s", value);
×
2795
                        return 0;
×
2796
                }
2797

2798
                if (safe_atoi(typev, &type) < 0 || type < 0) {
1,188✔
2799
                        log_unit_debug(u, "Invalid socket type: %s", typev);
×
2800
                        return 0;
×
2801
                }
2802

2803
                LIST_FOREACH(port, p, s->ports)
1,293✔
2804
                        if (p->fd < 0 &&
2,481✔
2805
                            socket_address_is(&p->address, value, type)) {
1,188✔
2806
                                p->fd = fdset_remove(fds, fd);
1,188✔
2807
                                found = true;
1,188✔
2808
                                break;
1,188✔
2809
                        }
2810
                if (!found)
1,188✔
2811
                        log_unit_debug(u, "No matching %s socket found: %s",
×
2812
                                       socket_address_type_to_string(type), value);
2813

2814
        } else if (streq(key, "netlink")) {
2,043✔
2815
                _cleanup_free_ char *fdv = NULL;
87✔
2816
                bool found = false;
87✔
2817
                int fd;
87✔
2818

2819
                r = extract_first_word(&value, &fdv, NULL, 0);
87✔
2820
                if (r <= 0) {
87✔
2821
                        log_unit_debug(u, "Failed to parse socket value: %s", value);
×
2822
                        return 0;
×
2823
                }
2824

2825
                fd = parse_fd(fdv);
87✔
2826
                if (fd < 0 || !fdset_contains(fds, fd)) {
87✔
2827
                        log_unit_debug(u, "Invalid socket value: %s", fdv);
×
2828
                        return 0;
×
2829
                }
2830

2831
                LIST_FOREACH(port, p, s->ports)
87✔
2832
                        if (p->fd < 0 &&
174✔
2833
                            socket_address_is_netlink(&p->address, value)) {
87✔
2834
                                p->fd = fdset_remove(fds, fd);
87✔
2835
                                found = true;
87✔
2836
                                break;
87✔
2837
                        }
2838
                if (!found)
87✔
2839
                        log_unit_debug(u, "No matching netlink socket found: %s", value);
×
2840

2841
        } else if (streq(key, "ffs")) {
1,956✔
2842
                _cleanup_free_ char *fdv = NULL;
×
2843
                bool found = false;
×
2844
                int fd;
×
2845

2846
                r = extract_first_word(&value, &fdv, NULL, 0);
×
2847
                if (r <= 0) {
×
2848
                        log_unit_debug(u, "Failed to parse ffs value: %s", value);
×
2849
                        return 0;
×
2850
                }
2851

2852
                fd = parse_fd(fdv);
×
2853
                if (fd < 0 || !fdset_contains(fds, fd)) {
×
2854
                        log_unit_debug(u, "Invalid ffs value: %s", fdv);
×
2855
                        return 0;
×
2856
                }
2857

2858
                LIST_FOREACH(port, p, s->ports)
×
2859
                        if (p->fd < 0 &&
×
2860
                            p->type == SOCKET_USB_FUNCTION &&
×
2861
                            path_equal_or_inode_same(p->path, value, 0)) {
×
2862
                                p->fd = fdset_remove(fds, fd);
×
2863
                                found = true;
×
2864
                                break;
×
2865
                        }
2866
                if (!found)
×
2867
                        log_unit_debug(u, "No matching ffs socket found: %s", value);
×
2868

2869
        } else if (streq(key, "trigger-ratelimit"))
1,956✔
2870
                (void) deserialize_ratelimit(&s->trigger_limit, key, value);
1,956✔
2871
        else
2872
                log_unit_debug(UNIT(s), "Unknown serialization key: %s", key);
×
2873

2874
        return 0;
2875
}
2876

2877
static void socket_distribute_fds(Unit *u, FDSet *fds) {
1,091✔
2878
        Socket *s = ASSERT_PTR(SOCKET(u));
1,091✔
2879

2880
        LIST_FOREACH(port, p, s->ports) {
2,272✔
2881
                int fd;
1,181✔
2882

2883
                if (p->type != SOCKET_SOCKET)
1,181✔
2884
                        continue;
65✔
2885

2886
                if (p->fd >= 0)
1,116✔
2887
                        continue;
665✔
2888

2889
                FDSET_FOREACH(fd, fds) {
1,386✔
2890
                        if (socket_address_matches_fd(&p->address, fd)) {
935✔
2891
                                p->fd = fdset_remove(fds, fd);
×
2892
                                s->deserialized_state = SOCKET_LISTENING;
×
2893
                                break;
×
2894
                        }
2895
                }
2896
        }
2897
}
1,091✔
2898

2899
static UnitActiveState socket_active_state(Unit *u) {
377,615✔
2900
        Socket *s = ASSERT_PTR(SOCKET(u));
377,615✔
2901

2902
        return state_translation_table[s->state];
377,615✔
2903
}
2904

2905
static const char *socket_sub_state_to_string(Unit *u) {
3,414✔
2906
        Socket *s = ASSERT_PTR(SOCKET(u));
3,414✔
2907

2908
        return socket_state_to_string(s->state);
3,414✔
2909
}
2910

2911
int socket_port_to_address(const SocketPort *p, char **ret) {
117✔
2912
        _cleanup_free_ char *address = NULL;
117✔
2913
        int r;
117✔
2914

2915
        assert(p);
117✔
2916
        assert(ret);
117✔
2917

2918
        switch (p->type) {
117✔
2919
                case SOCKET_SOCKET: {
111✔
2920
                        r = socket_address_print(&p->address, &address);
111✔
2921
                        if (r < 0)
111✔
2922
                                return r;
2923

2924
                        break;
2925
                }
2926

2927
                case SOCKET_SPECIAL:
6✔
2928
                case SOCKET_MQUEUE:
2929
                case SOCKET_FIFO:
2930
                case SOCKET_USB_FUNCTION:
2931
                        address = strdup(p->path);
6✔
2932
                        if (!address)
6✔
2933
                                return -ENOMEM;
2934
                        break;
2935

2936
                default:
×
2937
                        assert_not_reached();
×
2938
        }
2939

2940
        *ret = TAKE_PTR(address);
117✔
2941

2942
        return 0;
117✔
2943
}
2944

2945
const char* socket_port_type_to_string(SocketPort *p) {
117✔
2946
        assert(p);
117✔
2947

2948
        switch (p->type) {
117✔
2949

2950
        case SOCKET_SOCKET:
111✔
2951

2952
                switch (p->address.type) {
111✔
2953

2954
                case SOCK_STREAM:
2955
                        return "Stream";
2956

2957
                case SOCK_DGRAM:
9✔
2958
                        return "Datagram";
9✔
2959

2960
                case SOCK_SEQPACKET:
6✔
2961
                        return "SequentialPacket";
6✔
2962

2963
                case SOCK_RAW:
9✔
2964
                        if (socket_address_family(&p->address) == AF_NETLINK)
9✔
2965
                                return "Netlink";
2966

2967
                        _fallthrough_;
×
2968
                default:
2969
                        return NULL;
×
2970
                }
2971

2972
        case SOCKET_SPECIAL:
2973
                return "Special";
2974

2975
        case SOCKET_MQUEUE:
×
2976
                return "MessageQueue";
×
2977

2978
        case SOCKET_FIFO:
6✔
2979
                return "FIFO";
6✔
2980

2981
        case SOCKET_USB_FUNCTION:
×
2982
                return "USBFunction";
×
2983

2984
        default:
×
2985
                return NULL;
×
2986
        }
2987
}
2988

2989
SocketType socket_port_type_from_string(const char *s) {
×
2990
        assert(s);
×
2991

2992
        if (STR_IN_SET(s, "Stream", "Datagram", "SequentialPacket", "Netlink"))
×
2993
                return SOCKET_SOCKET;
×
2994
        else if (streq(s, "Special"))
×
2995
                return SOCKET_SPECIAL;
2996
        else if (streq(s, "MessageQueue"))
×
2997
                return SOCKET_MQUEUE;
2998
        else if (streq(s, "FIFO"))
×
2999
                return SOCKET_FIFO;
3000
        else if (streq(s, "USBFunction"))
×
3001
                return SOCKET_USB_FUNCTION;
3002
        else
3003
                return _SOCKET_TYPE_INVALID;
×
3004
}
3005

3006
static bool socket_may_gc(Unit *u) {
11,893✔
3007
        Socket *s = ASSERT_PTR(SOCKET(u));
11,893✔
3008

3009
        return s->n_connections == 0;
11,893✔
3010
}
3011

3012
static int socket_accept_do(Socket *s, int fd) {
2✔
3013
        int cfd;
2✔
3014

3015
        assert(s);
2✔
3016
        assert(fd >= 0);
2✔
3017

3018
        cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
2✔
3019
        if (cfd < 0)
2✔
3020
                /* Convert transient network errors into clean and well-defined EAGAIN */
3021
                return ERRNO_IS_ACCEPT_AGAIN(errno) ? -EAGAIN : -errno;
×
3022

3023
        return cfd;
3024
}
3025

3026
static int socket_accept_in_cgroup(Socket *s, SocketPort *p, int fd) {
2✔
3027
        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
×
3028
        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
2✔
3029
        int cfd, r;
2✔
3030

3031
        assert(s);
2✔
3032
        assert(p);
2✔
3033
        assert(fd >= 0);
2✔
3034

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

3038
        if (!IN_SET(p->address.sockaddr.sa.sa_family, AF_INET, AF_INET6))
2✔
3039
                goto shortcut;
2✔
3040

3041
        if (bpf_program_supported() <= 0)
×
3042
                goto shortcut;
×
3043

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

3047
        r = unit_fork_helper_process(UNIT(s), "(sd-accept)", /* into_cgroup= */ true, &pid);
×
3048
        if (r < 0)
×
3049
                return log_unit_error_errno(UNIT(s), r, "Failed to fork off accept stub process: %m");
×
3050
        if (r == 0) {
×
3051
                /* Child */
3052

3053
                pair[0] = safe_close(pair[0]);
×
3054

3055
                cfd = socket_accept_do(s, fd);
×
3056
                if (cfd == -EAGAIN) /* spurious accept() */
×
3057
                        _exit(EXIT_SUCCESS);
×
3058
                if (cfd < 0) {
×
3059
                        log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3060
                        _exit(EXIT_FAILURE);
×
3061
                }
3062

3063
                r = send_one_fd(pair[1], cfd, 0);
×
3064
                if (r < 0) {
×
3065
                        log_unit_error_errno(UNIT(s), r, "Failed to send connection socket to parent: %m");
×
3066
                        _exit(EXIT_FAILURE);
×
3067
                }
3068

3069
                _exit(EXIT_SUCCESS);
×
3070
        }
3071

3072
        pair[1] = safe_close(pair[1]);
×
3073
        cfd = receive_one_fd(pair[0], 0);
×
3074

3075
        /* We synchronously wait for the helper, as it shouldn't be slow */
3076
        r = wait_for_terminate_and_check("(sd-accept)", pid.pid, WAIT_LOG_ABNORMAL);
×
3077
        if (r < 0) {
×
3078
                safe_close(cfd);
×
3079
                return r;
3080
        }
3081

3082
        /* If we received no fd, we got EIO here. If this happens with a process exit code of EXIT_SUCCESS
3083
         * this is a spurious accept(), let's convert that back to EAGAIN here. */
3084
        if (cfd == -EIO)
×
3085
                return -EAGAIN;
3086
        if (cfd < 0)
×
3087
                return log_unit_error_errno(UNIT(s), cfd, "Failed to receive connection socket: %m");
×
3088

3089
        return cfd;
3090

3091
shortcut:
2✔
3092
        cfd = socket_accept_do(s, fd);
2✔
3093
        if (cfd == -EAGAIN) /* spurious accept(), skip it silently */
2✔
3094
                return -EAGAIN;
3095
        if (cfd < 0)
2✔
3096
                return log_unit_error_errno(UNIT(s), cfd, "Failed to accept connection socket: %m");
×
3097

3098
        return cfd;
3099
}
3100

3101
static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
221✔
3102
        SocketPort *p = ASSERT_PTR(userdata);
221✔
3103
        int cfd = -EBADF;
221✔
3104

3105
        assert(fd >= 0);
221✔
3106

3107
        if (p->socket->state != SOCKET_LISTENING)
221✔
3108
                return 0;
3109

3110
        log_unit_debug(UNIT(p->socket), "Incoming traffic");
221✔
3111

3112
        if (revents != EPOLLIN) {
221✔
3113
                if (revents & EPOLLHUP)
×
3114
                        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.");
×
3115
                else
3116
                        log_unit_error(UNIT(p->socket), "Got unexpected poll event (0x%x) on socket.", revents);
×
3117
                goto fail;
×
3118
        }
3119

3120
        if (p->socket->accept &&
221✔
3121
            p->type == SOCKET_SOCKET &&
4✔
3122
            socket_address_can_accept(&p->address)) {
2✔
3123

3124
                cfd = socket_accept_in_cgroup(p->socket, p, fd);
2✔
3125
                if (cfd == -EAGAIN) /* Spurious accept() */
2✔
3126
                        return 0;
3127
                if (cfd < 0)
2✔
3128
                        goto fail;
×
3129

3130
                socket_apply_socket_options(p->socket, p, cfd);
2✔
3131
        }
3132

3133
        socket_enter_running(p->socket, cfd);
221✔
3134
        return 0;
221✔
3135

3136
fail:
×
3137
        socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
×
3138
        return 0;
×
3139
}
3140

3141
static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
173✔
3142
        Socket *s = ASSERT_PTR(SOCKET(u));
173✔
3143
        SocketResult f;
173✔
3144

3145
        assert(pid >= 0);
173✔
3146

3147
        if (pid != s->control_pid.pid)
173✔
3148
                return;
3149

3150
        pidref_done(&s->control_pid);
173✔
3151

3152
        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
173✔
3153
                f = SOCKET_SUCCESS;
3154
        else if (code == CLD_EXITED)
×
3155
                f = SOCKET_FAILURE_EXIT_CODE;
3156
        else if (code == CLD_KILLED)
×
3157
                f = SOCKET_FAILURE_SIGNAL;
3158
        else if (code == CLD_DUMPED)
×
3159
                f = SOCKET_FAILURE_CORE_DUMP;
3160
        else
3161
                assert_not_reached();
×
3162

3163
        if (s->control_command) {
173✔
3164
                exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
173✔
3165

3166
                if (s->control_command->flags & EXEC_COMMAND_IGNORE_FAILURE)
173✔
3167
                        f = SOCKET_SUCCESS;
173✔
3168
        }
3169

3170
        unit_log_process_exit(
173✔
3171
                        u,
3172
                        "Control process",
3173
                        socket_exec_command_to_string(s->control_command_id),
3174
                        f == SOCKET_SUCCESS,
3175
                        code, status);
3176

3177
        if (s->result == SOCKET_SUCCESS)
173✔
3178
                s->result = f;
173✔
3179

3180
        if (s->control_command &&
173✔
3181
            s->control_command->command_next &&
173✔
3182
            f == SOCKET_SUCCESS) {
3183

3184
                log_unit_debug(u, "Running next command for state %s", socket_state_to_string(s->state));
×
3185
                socket_run_next(s);
×
3186
        } else {
3187
                s->control_command = NULL;
173✔
3188
                s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
173✔
3189

3190
                /* No further commands for this step, so let's figure
3191
                 * out what to do next */
3192

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

3195
                switch (s->state) {
173✔
3196

3197
                case SOCKET_START_PRE:
×
3198
                        if (f == SOCKET_SUCCESS)
×
3199
                                socket_enter_start_open(s);
×
3200
                        else
3201
                                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
×
3202
                        break;
3203

3204
                case SOCKET_START_CHOWN:
×
3205
                        if (f == SOCKET_SUCCESS)
×
3206
                                socket_enter_start_post(s);
×
3207
                        else
3208
                                socket_enter_stop_pre(s, f);
×
3209
                        break;
3210

3211
                case SOCKET_START_POST:
173✔
3212
                        if (f == SOCKET_SUCCESS)
173✔
3213
                                socket_enter_listening(s);
173✔
3214
                        else
3215
                                socket_enter_stop_pre(s, f);
×
3216
                        break;
3217

3218
                case SOCKET_STOP_PRE:
×
3219
                case SOCKET_STOP_PRE_SIGTERM:
3220
                case SOCKET_STOP_PRE_SIGKILL:
3221
                        socket_enter_stop_post(s, f);
×
3222
                        break;
×
3223

3224
                case SOCKET_STOP_POST:
×
3225
                case SOCKET_FINAL_SIGTERM:
3226
                case SOCKET_FINAL_SIGKILL:
3227
                        socket_enter_dead(s, f);
×
3228
                        break;
×
3229

3230
                case SOCKET_CLEANING:
×
3231

3232
                        if (s->clean_result == SOCKET_SUCCESS)
×
3233
                                s->clean_result = f;
×
3234

3235
                        socket_enter_dead(s, SOCKET_SUCCESS);
×
3236
                        break;
×
3237

3238
                default:
×
3239
                        assert_not_reached();
×
3240
                }
3241
        }
3242

3243
        /* Notify clients about changed exit status */
3244
        unit_add_to_dbus_queue(u);
173✔
3245
}
3246

3247
static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
×
3248
        Socket *s = ASSERT_PTR(SOCKET(userdata));
×
3249

3250
        assert(s->timer_event_source == source);
×
3251

3252
        switch (s->state) {
×
3253

3254
        case SOCKET_START_PRE:
3255
                log_unit_warning(UNIT(s), "Starting timed out. Terminating.");
×
3256
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3257
                break;
×
3258

3259
        case SOCKET_START_CHOWN:
3260
        case SOCKET_START_POST:
3261
                log_unit_warning(UNIT(s), "Starting timed out. Stopping.");
×
3262
                socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
×
3263
                break;
×
3264

3265
        case SOCKET_STOP_PRE:
3266
                log_unit_warning(UNIT(s), "Stopping timed out. Terminating.");
×
3267
                socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3268
                break;
×
3269

3270
        case SOCKET_STOP_PRE_SIGTERM:
×
3271
                if (s->kill_context.send_sigkill) {
×
3272
                        log_unit_warning(UNIT(s), "Stopping timed out. Killing.");
×
3273
                        socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3274
                } else {
3275
                        log_unit_warning(UNIT(s), "Stopping timed out. Skipping SIGKILL. Ignoring.");
×
3276
                        socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3277
                }
3278
                break;
3279

3280
        case SOCKET_STOP_PRE_SIGKILL:
3281
                log_unit_warning(UNIT(s), "Processes still around after SIGKILL. Ignoring.");
×
3282
                socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
×
3283
                break;
×
3284

3285
        case SOCKET_STOP_POST:
3286
                log_unit_warning(UNIT(s), "Stopping timed out (2). Terminating.");
×
3287
                socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
×
3288
                break;
×
3289

3290
        case SOCKET_FINAL_SIGTERM:
×
3291
                if (s->kill_context.send_sigkill) {
×
3292
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Killing.");
×
3293
                        socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
×
3294
                } else {
3295
                        log_unit_warning(UNIT(s), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
×
3296
                        socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3297
                }
3298
                break;
3299

3300
        case SOCKET_FINAL_SIGKILL:
3301
                log_unit_warning(UNIT(s), "Still around after SIGKILL (2). Entering failed mode.");
×
3302
                socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
×
3303
                break;
×
3304

3305
        case SOCKET_CLEANING:
3306
                log_unit_warning(UNIT(s), "Cleaning timed out. killing.");
×
3307

3308
                if (s->clean_result == SOCKET_SUCCESS)
×
3309
                        s->clean_result = SOCKET_FAILURE_TIMEOUT;
×
3310

3311
                socket_enter_signal(s, SOCKET_FINAL_SIGKILL, 0);
×
3312
                break;
×
3313

3314
        default:
×
3315
                assert_not_reached();
×
3316
        }
3317

3318
        return 0;
×
3319
}
3320

3321
int socket_collect_fds(Socket *s, int **ret) {
527✔
3322
        size_t n = 0, k = 0;
527✔
3323

3324
        assert(s);
527✔
3325
        assert(ret);
527✔
3326

3327
        /* Called from the service code for requesting our fds */
3328

3329
        LIST_FOREACH(port, p, s->ports) {
1,088✔
3330
                if (p->fd >= 0)
561✔
3331
                        n++;
542✔
3332
                n += p->n_auxiliary_fds;
561✔
3333
        }
3334

3335
        if (n == 0) {
527✔
3336
                *ret = NULL;
19✔
3337
                return 0;
19✔
3338
        }
3339

3340
        int *fds = new(int, n);
508✔
3341
        if (!fds)
508✔
3342
                return -ENOMEM;
3343

3344
        LIST_FOREACH(port, p, s->ports) {
1,050✔
3345
                if (p->fd >= 0)
542✔
3346
                        fds[k++] = p->fd;
542✔
3347
                FOREACH_ARRAY(i, p->auxiliary_fds, p->n_auxiliary_fds)
542✔
3348
                        fds[k++] = *i;
×
3349
        }
3350

3351
        assert(k == n);
508✔
3352

3353
        *ret = fds;
508✔
3354
        return (int) n;
508✔
3355
}
3356

3357
static void socket_reset_failed(Unit *u) {
36✔
3358
        Socket *s = SOCKET(u);
36✔
3359

3360
        assert(s);
×
3361

3362
        if (s->state == SOCKET_FAILED)
36✔
3363
                socket_set_state(s, SOCKET_DEAD);
×
3364

3365
        s->result = SOCKET_SUCCESS;
36✔
3366
        s->clean_result = SOCKET_SUCCESS;
36✔
3367
}
36✔
3368

3369
void socket_connection_unref(Socket *s) {
2✔
3370
        assert(s);
2✔
3371

3372
        /* The service is dead. Yay!
3373
         *
3374
         * This is strictly for one-instance-per-connection
3375
         * services. */
3376

3377
        assert(s->n_connections > 0);
2✔
3378
        s->n_connections--;
2✔
3379

3380
        log_unit_debug(UNIT(s), "One connection closed, %u left.", s->n_connections);
2✔
3381
}
2✔
3382

3383
static void socket_trigger_notify(Unit *u, Unit *other) {
3,191✔
3384
        Socket *s = ASSERT_PTR(SOCKET(u));
3,191✔
3385

3386
        assert(other);
3,191✔
3387

3388
        /* Filter out invocations with bogus state */
3389
        assert(UNIT_IS_LOAD_COMPLETE(other->load_state));
3,191✔
3390

3391
        Service *service = ASSERT_PTR(SERVICE(other));
3,191✔
3392

3393
        /* Don't propagate state changes from the service if we are already down */
3394
        if (!IN_SET(s->state, SOCKET_RUNNING, SOCKET_LISTENING))
3,191✔
3395
                return;
3396

3397
        /* We don't care for the service state if we are in Accept=yes mode */
3398
        if (s->accept)
2,795✔
3399
                return;
3400

3401
        /* Propagate start limit hit state */
3402
        if (other->start_limit_hit) {
2,789✔
3403
                socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT);
×
3404
                return;
×
3405
        }
3406

3407
        /* Don't propagate anything if there's still a job queued */
3408
        if (other->job)
2,789✔
3409
                return;
3410

3411
        if (!SOCKET_SERVICE_IS_ACTIVE(service, /* allow_finalize = */ true))
2,107✔
3412
                socket_enter_listening(s);
686✔
3413

3414
        if (SERVICE(other)->state == SERVICE_RUNNING)
2,107✔
3415
                socket_set_state(s, SOCKET_RUNNING);
1,316✔
3416
}
3417

3418
static void socket_handoff_timestamp(
346✔
3419
                Unit *u,
3420
                const struct ucred *ucred,
3421
                const dual_timestamp *ts) {
3422

3423
        Socket *s = ASSERT_PTR(SOCKET(u));
346✔
3424

3425
        assert(ucred);
346✔
3426
        assert(ts);
346✔
3427

3428
        if (s->control_pid.pid == ucred->pid && s->control_command) {
346✔
3429
                exec_status_handoff(&s->control_command->exec_status, ucred, ts);
346✔
3430
                unit_add_to_dbus_queue(u);
346✔
3431
        }
3432
}
346✔
3433

3434
static int socket_get_timeout(Unit *u, usec_t *timeout) {
×
3435
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3436
        usec_t t;
×
3437
        int r;
×
3438

3439
        if (!s->timer_event_source)
×
3440
                return 0;
×
3441

3442
        r = sd_event_source_get_time(s->timer_event_source, &t);
×
3443
        if (r < 0)
×
3444
                return r;
3445
        if (t == USEC_INFINITY)
×
3446
                return 0;
3447

3448
        *timeout = t;
×
3449
        return 1;
×
3450
}
3451

3452
const char* socket_fdname(Socket *s) {
618✔
3453
        assert(s);
618✔
3454

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

3458
        if (s->fdname)
618✔
3459
                return s->fdname;
3460

3461
        if (s->accept)
483✔
3462
                return "connection";
3463

3464
        return UNIT(s)->id;
472✔
3465
}
3466

3467
static PidRef* socket_control_pid(Unit *u) {
7,708✔
3468
        return &ASSERT_PTR(SOCKET(u))->control_pid;
15,416✔
3469
}
3470

3471
static int socket_clean(Unit *u, ExecCleanMask mask) {
×
3472
        Socket *s = ASSERT_PTR(SOCKET(u));
×
3473
        _cleanup_strv_free_ char **l = NULL;
×
3474
        int r;
×
3475

3476
        assert(mask != 0);
×
3477

3478
        if (s->state != SOCKET_DEAD)
×
3479
                return -EBUSY;
3480

3481
        r = exec_context_get_clean_directories(&s->exec_context, u->manager->prefix, mask, &l);
×
3482
        if (r < 0)
×
3483
                return r;
3484

3485
        if (strv_isempty(l))
×
3486
                return -EUNATCH;
3487

3488
        socket_unwatch_control_pid(s);
×
3489
        s->clean_result = SOCKET_SUCCESS;
×
3490
        s->control_command = NULL;
×
3491
        s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
×
3492

3493
        r = socket_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec);
×
3494
        if (r < 0) {
×
3495
                log_unit_warning_errno(u, r, "Failed to install timer: %m");
×
3496
                goto fail;
×
3497
        }
3498

3499
        r = unit_fork_and_watch_rm_rf(u, l, &s->control_pid);
×
3500
        if (r < 0) {
×
3501
                log_unit_warning_errno(u, r, "Failed to spawn cleaning task: %m");
×
3502
                goto fail;
×
3503
        }
3504

3505
        socket_set_state(s, SOCKET_CLEANING);
×
3506
        return 0;
3507

3508
fail:
×
3509
        s->clean_result = SOCKET_FAILURE_RESOURCES;
×
3510
        s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source);
×
3511
        return r;
×
3512
}
3513

3514
static int socket_can_clean(Unit *u, ExecCleanMask *ret) {
108✔
3515
        Socket *s = ASSERT_PTR(SOCKET(u));
108✔
3516

3517
        return exec_context_get_clean_mask(&s->exec_context, ret);
108✔
3518
}
3519

3520
static int socket_can_start(Unit *u) {
2,330✔
3521
        Socket *s = ASSERT_PTR(SOCKET(u));
2,330✔
3522
        int r;
2,330✔
3523

3524
        r = unit_test_start_limit(u);
2,330✔
3525
        if (r < 0) {
2,330✔
3526
                socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT);
×
3527
                return r;
×
3528
        }
3529

3530
        return 1;
3531
}
3532

3533
static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
3534
        [SOCKET_EXEC_START_PRE]   = "ExecStartPre",
3535
        [SOCKET_EXEC_START_CHOWN] = "ExecStartChown",
3536
        [SOCKET_EXEC_START_POST]  = "ExecStartPost",
3537
        [SOCKET_EXEC_STOP_PRE]    = "ExecStopPre",
3538
        [SOCKET_EXEC_STOP_POST]   = "ExecStopPost",
3539
};
3540

3541
DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
229✔
3542

3543
static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
3544
        [SOCKET_SUCCESS]                         = "success",
3545
        [SOCKET_FAILURE_RESOURCES]               = "resources",
3546
        [SOCKET_FAILURE_TIMEOUT]                 = "timeout",
3547
        [SOCKET_FAILURE_EXIT_CODE]               = "exit-code",
3548
        [SOCKET_FAILURE_SIGNAL]                  = "signal",
3549
        [SOCKET_FAILURE_CORE_DUMP]               = "core-dump",
3550
        [SOCKET_FAILURE_START_LIMIT_HIT]         = "start-limit-hit",
3551
        [SOCKET_FAILURE_TRIGGER_LIMIT_HIT]       = "trigger-limit-hit",
3552
        [SOCKET_FAILURE_SERVICE_START_LIMIT_HIT] = "service-start-limit-hit",
3553
};
3554

3555
DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
7,433✔
3556

3557
static const char* const socket_timestamping_table[_SOCKET_TIMESTAMPING_MAX] = {
3558
        [SOCKET_TIMESTAMPING_OFF] = "off",
3559
        [SOCKET_TIMESTAMPING_US]  = "us",
3560
        [SOCKET_TIMESTAMPING_NS]  = "ns",
3561
};
3562

3563
DEFINE_STRING_TABLE_LOOKUP(socket_timestamping, SocketTimestamping);
326✔
3564

3565
SocketTimestamping socket_timestamping_from_string_harder(const char *p) {
218✔
3566
        SocketTimestamping t;
218✔
3567
        int r;
218✔
3568

3569
        if (!p)
218✔
3570
                return _SOCKET_TIMESTAMPING_INVALID;
3571

3572
        t = socket_timestamping_from_string(p);
218✔
3573
        if (t >= 0)
218✔
3574
                return t;
3575

3576
        /* Let's alternatively support the various other aliases parse_time() accepts for ns and µs here,
3577
         * too. */
3578
        if (streq(p, "nsec"))
×
3579
                return SOCKET_TIMESTAMPING_NS;
3580
        if (STR_IN_SET(p, "usec", "µs", "μs")) /* Accept both small greek letter mu + micro sign unicode codepoints */
×
3581
                return SOCKET_TIMESTAMPING_US;
×
3582

3583
        r = parse_boolean(p);
×
3584
        if (r < 0)
×
3585
                return _SOCKET_TIMESTAMPING_INVALID;
3586

3587
        return r ? SOCKET_TIMESTAMPING_NS : SOCKET_TIMESTAMPING_OFF; /* If boolean yes, default to ns accuracy */
×
3588
}
3589

3590
const UnitVTable socket_vtable = {
3591
        .object_size = sizeof(Socket),
3592
        .exec_context_offset = offsetof(Socket, exec_context),
3593
        .cgroup_context_offset = offsetof(Socket, cgroup_context),
3594
        .kill_context_offset = offsetof(Socket, kill_context),
3595
        .exec_runtime_offset = offsetof(Socket, exec_runtime),
3596
        .cgroup_runtime_offset = offsetof(Socket, cgroup_runtime),
3597

3598
        .sections =
3599
                "Unit\0"
3600
                "Socket\0"
3601
                "Install\0",
3602
        .private_section = "Socket",
3603

3604
        .can_transient = true,
3605
        .can_trigger = true,
3606
        .can_fail = true,
3607

3608
        .init = socket_init,
3609
        .done = socket_done,
3610
        .load = socket_load,
3611

3612
        .coldplug = socket_coldplug,
3613

3614
        .dump = socket_dump,
3615

3616
        .start = socket_start,
3617
        .stop = socket_stop,
3618

3619
        .clean = socket_clean,
3620
        .can_clean = socket_can_clean,
3621

3622
        .get_timeout = socket_get_timeout,
3623

3624
        .serialize = socket_serialize,
3625
        .deserialize_item = socket_deserialize_item,
3626
        .distribute_fds = socket_distribute_fds,
3627

3628
        .active_state = socket_active_state,
3629
        .sub_state_to_string = socket_sub_state_to_string,
3630

3631
        .will_restart = unit_will_restart_default,
3632

3633
        .may_gc = socket_may_gc,
3634

3635
        .sigchld_event = socket_sigchld_event,
3636

3637
        .trigger_notify = socket_trigger_notify,
3638

3639
        .reset_failed = socket_reset_failed,
3640

3641
        .notify_handoff_timestamp = socket_handoff_timestamp,
3642

3643
        .control_pid = socket_control_pid,
3644

3645
        .bus_set_property = bus_socket_set_property,
3646
        .bus_commit_properties = bus_socket_commit_properties,
3647

3648
        .status_message_formats = {
3649
                .finished_start_job = {
3650
                        [JOB_DONE]       = "Listening on %s.",
3651
                        [JOB_FAILED]     = "Failed to listen on %s.",
3652
                        [JOB_TIMEOUT]    = "Timed out starting %s.",
3653
                },
3654
                .finished_stop_job = {
3655
                        [JOB_DONE]       = "Closed %s.",
3656
                        [JOB_FAILED]     = "Failed stopping %s.",
3657
                        [JOB_TIMEOUT]    = "Timed out stopping %s.",
3658
                },
3659
        },
3660

3661
        .can_start = socket_can_start,
3662
};
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