1 /* SPDX-License-Identifier: GPL-2.0-or-later */
12 #include "alloc-util.h"
13 #include "device-private.h"
14 #include "device-util.h"
15 #include "dirent-util.h"
18 #include "format-util.h"
20 #include "hexdecoct.h"
21 #include "mkdir-label.h"
22 #include "parse-util.h"
23 #include "path-util.h"
24 #include "random-util.h"
25 #include "selinux-util.h"
26 #include "smack-util.h"
27 #include "stat-util.h"
28 #include "stdio-util.h"
29 #include "string-util.h"
31 #include "time-util.h"
32 #include "udev-node.h"
33 #include "user-util.h"
35 #define CREATE_LINK_MAX_RETRIES 128
36 #define LINK_UPDATE_MAX_RETRIES 128
37 #define CREATE_STACK_LINK_MAX_RETRIES 128
38 #define UPDATE_TIMESTAMP_MAX_RETRIES 128
39 #define MAX_RANDOM_DELAY (250 * USEC_PER_MSEC)
40 #define MIN_RANDOM_DELAY ( 50 * USEC_PER_MSEC)
41 #define UDEV_NODE_HASH_KEY SD_ID128_MAKE(b9,6a,f1,ce,40,31,44,1a,9e,19,ec,8b,ae,f3,e3,2f)
43 static int create_symlink(const char *target
, const char *slink
) {
49 for (unsigned i
= 0; i
< CREATE_LINK_MAX_RETRIES
; i
++) {
50 r
= mkdir_parents_label(slink
, 0755);
56 mac_selinux_create_file_prepare(slink
, S_IFLNK
);
57 r
= RET_NERRNO(symlink(target
, slink
));
58 mac_selinux_create_file_clear();
66 static int node_symlink(sd_device
*dev
, const char *node
, const char *slink
) {
67 _cleanup_free_
char *slink_dirname
= NULL
, *target
= NULL
;
68 const char *id
, *slink_tmp
;
76 if (lstat(slink
, &stats
) >= 0) {
77 if (!S_ISLNK(stats
.st_mode
))
78 return log_device_debug_errno(dev
, SYNTHETIC_ERRNO(EEXIST
),
79 "Conflicting inode '%s' found, link to '%s' will not be created.", slink
, node
);
80 } else if (errno
!= ENOENT
)
81 return log_device_debug_errno(dev
, errno
, "Failed to lstat() '%s': %m", slink
);
83 r
= path_extract_directory(slink
, &slink_dirname
);
85 return log_device_debug_errno(dev
, r
, "Failed to get parent directory of '%s': %m", slink
);
87 /* use relative link */
88 r
= path_make_relative(slink_dirname
, node
, &target
);
90 return log_device_debug_errno(dev
, r
, "Failed to get relative path from '%s' to '%s': %m", slink
, node
);
92 r
= device_get_device_id(dev
, &id
);
94 return log_device_debug_errno(dev
, r
, "Failed to get device id: %m");
96 slink_tmp
= strjoina(slink
, ".tmp-", id
);
97 (void) unlink(slink_tmp
);
99 r
= create_symlink(target
, slink_tmp
);
101 return log_device_debug_errno(dev
, r
, "Failed to create symlink '%s' to '%s': %m", slink_tmp
, target
);
103 if (rename(slink_tmp
, slink
) < 0) {
104 r
= log_device_debug_errno(dev
, errno
, "Failed to rename '%s' to '%s': %m", slink_tmp
, slink
);
105 (void) unlink(slink_tmp
);
112 static int link_find_prioritized(sd_device
*dev
, bool add
, const char *stackdir
, char **ret
) {
113 _cleanup_closedir_
DIR *dir
= NULL
;
114 _cleanup_free_
char *target
= NULL
;
122 /* Find device node of device with highest priority. This returns 1 if a device found, 0 if no
123 * device found, or a negative errno. */
128 r
= device_get_devlink_priority(dev
, &priority
);
132 r
= sd_device_get_devname(dev
, &devnode
);
136 target
= strdup(devnode
);
141 dir
= opendir(stackdir
);
143 if (add
) /* The stack directory must exist. */
152 r
= device_get_device_id(dev
, &id
);
156 FOREACH_DIRENT_ALL(de
, dir
, break) {
157 _cleanup_free_
char *path
= NULL
, *buf
= NULL
;
160 if (de
->d_name
[0] == '.')
164 if (streq(de
->d_name
, id
))
167 path
= path_join(stackdir
, de
->d_name
);
171 if (readlink_malloc(path
, &buf
) >= 0) {
174 /* New format. The devnode and priority can be obtained from symlink. */
176 devnode
= strchr(buf
, ':');
177 if (!devnode
|| devnode
== buf
)
181 if (!path_startswith(devnode
, "/dev"))
184 if (safe_atoi(buf
, &tmp_prio
) < 0)
187 if (target
&& tmp_prio
<= priority
)
190 r
= free_and_strdup(&target
, devnode
);
194 _cleanup_(sd_device_unrefp
) sd_device
*tmp_dev
= NULL
;
197 /* Old format. The devnode and priority must be obtained from uevent and
198 * udev database files. */
200 if (sd_device_new_from_device_id(&tmp_dev
, de
->d_name
) < 0)
203 if (device_get_devlink_priority(tmp_dev
, &tmp_prio
) < 0)
206 if (target
&& tmp_prio
<= priority
)
209 if (sd_device_get_devname(tmp_dev
, &devnode
) < 0)
212 r
= free_and_strdup(&target
, devnode
);
220 *ret
= TAKE_PTR(target
);
224 size_t udev_node_escape_path(const char *src
, char *dest
, size_t size
) {
232 for (i
= 0, j
= 0; src
[i
] != '\0'; i
++) {
234 if (j
+4 >= size
- 12 + 1)
236 memcpy(&dest
[j
], "\\x2f", 4);
238 } else if (src
[i
] == '\\') {
239 if (j
+4 >= size
- 12 + 1)
241 memcpy(&dest
[j
], "\\x5c", 4);
244 if (j
+1 >= size
- 12 + 1)
254 /* If the input path is too long to encode as a filename, then let's suffix with a string
255 * generated from the hash of the path. */
257 h
= siphash24_string(src
, UDEV_NODE_HASH_KEY
.bytes
);
259 for (unsigned k
= 0; k
<= 10; k
++)
260 dest
[size
- k
- 2] = urlsafe_base64char((h
>> (k
* 6)) & 63);
262 dest
[size
- 1] = '\0';
266 static int update_timestamp(sd_device
*dev
, const char *path
, struct stat
*prev
) {
270 /* Even if a symlink in the stack directory is created/removed, the mtime of the directory may
271 * not be changed. Why? Let's consider the following situation. For simplicity, let's assume
272 * there exist two udev workers (A and B) and all of them calls link_update() for the same
273 * devlink simultaneously.
275 * 1. A creates/removes a symlink in the stack directory.
276 * 2. A calls the first stat() in the loop of link_update().
277 * 3. A calls link_find_prioritized().
278 * 4. B creates/removes another symlink in the stack directory, so the result of the step 3 is outdated.
279 * 5. B finishes link_update().
280 * 6. A creates/removes devlink according to the outdated result in the step 3.
281 * 7. A calls the second stat() in the loop of link_update().
283 * If these 7 steps are processed in this order within a short time period that kernel's timer
284 * does not increase, then even if the contents in the stack directory is changed, the results
285 * of two stat() called by A shows the same timestamp, and A cannot detect the change.
287 * By calling this function after creating/removing symlinks in the stack directory, the
288 * timestamp of the stack directory is always increased at least in the above step 5, so A can
289 * detect the update. */
291 if ((prev
->st_mode
& S_IFMT
) == 0)
292 return 0; /* Does not exist, or previous stat() failed. */
294 for (unsigned i
= 0; i
< UPDATE_TIMESTAMP_MAX_RETRIES
; i
++) {
297 if (stat(path
, &st
) < 0)
300 if (!stat_inode_unmodified(prev
, &st
))
303 log_device_debug(dev
,
304 "%s is modified, but its timestamp is not changed, "
305 "updating timestamp after 10ms.",
308 (void) usleep(10 * USEC_PER_MSEC
);
309 if (utimensat(AT_FDCWD
, path
, NULL
, 0) < 0)
316 static int update_stack_directory(sd_device
*dev
, const char *dirname
, bool add
) {
317 _cleanup_free_
char *filename
= NULL
, *data
= NULL
, *buf
= NULL
;
318 const char *devname
, *id
;
325 r
= device_get_device_id(dev
, &id
);
327 return log_device_debug_errno(dev
, r
, "Failed to get device id: %m");
329 filename
= path_join(dirname
, id
);
331 return log_oom_debug();
334 int unlink_error
= 0, stat_error
= 0;
336 if (stat(dirname
, &st
) < 0) {
338 return 0; /* The stack directory is already removed. That's OK. */
342 if (unlink(filename
) < 0)
343 unlink_error
= -errno
;
345 if (rmdir(dirname
) >= 0 || errno
== ENOENT
)
348 if (unlink_error
< 0) {
349 if (unlink_error
== -ENOENT
)
352 /* If we failed to remove the symlink, then there is almost nothing we can do. */
353 return log_device_debug_errno(dev
, unlink_error
, "Failed to remove %s: %m", filename
);
357 return log_device_debug_errno(dev
, stat_error
, "Failed to stat %s: %m", dirname
);
359 /* The symlink was removed. Check if the timestamp of directory is changed. */
360 r
= update_timestamp(dev
, dirname
, &st
);
361 if (r
< 0 && r
!= -ENOENT
)
362 return log_device_debug_errno(dev
, r
, "Failed to update timestamp of %s: %m", dirname
);
367 r
= sd_device_get_devname(dev
, &devname
);
369 return log_device_debug_errno(dev
, r
, "Failed to get device node: %m");
371 r
= device_get_devlink_priority(dev
, &priority
);
373 return log_device_debug_errno(dev
, r
, "Failed to get priority of device node symlink: %m");
375 if (asprintf(&data
, "%i:%s", priority
, devname
) < 0)
376 return log_oom_debug();
378 if (readlink_malloc(filename
, &buf
) >= 0 && streq(buf
, data
))
381 if (unlink(filename
) < 0 && errno
!= ENOENT
)
382 log_device_debug_errno(dev
, errno
, "Failed to remove %s, ignoring: %m", filename
);
384 for (unsigned j
= 0; j
< CREATE_STACK_LINK_MAX_RETRIES
; j
++) {
385 /* This may fail with -ENOENT when the parent directory is removed during
386 * creating the file by another udevd worker. */
387 r
= mkdir_p(dirname
, 0755);
391 return log_device_debug_errno(dev
, r
, "Failed to create directory %s: %m", dirname
);
393 if (stat(dirname
, &st
) < 0) {
396 return log_device_debug_errno(dev
, errno
, "Failed to stat %s: %m", dirname
);
399 if (symlink(data
, filename
) < 0) {
402 return log_device_debug_errno(dev
, errno
, "Failed to create symbolic link %s: %m", filename
);
405 /* The symlink was created. Check if the timestamp of directory is changed. */
406 r
= update_timestamp(dev
, dirname
, &st
);
408 return log_device_debug_errno(dev
, r
, "Failed to update timestamp of %s: %m", dirname
);
413 return log_device_debug_errno(dev
, SYNTHETIC_ERRNO(ELOOP
), "Failed to create symbolic link %s: %m", filename
);
416 /* manage "stack of names" with possibly specified device priorities */
417 static int link_update(sd_device
*dev
, const char *slink_in
, bool add
) {
418 _cleanup_free_
char *slink
= NULL
, *dirname
= NULL
;
419 const char *slink_name
;
420 char name_enc
[NAME_MAX
+1];
426 slink
= strdup(slink_in
);
428 return log_oom_debug();
430 path_simplify(slink
);
432 slink_name
= path_startswith(slink
, "/dev");
434 empty_or_root(slink_name
) ||
435 !path_is_normalized(slink_name
))
436 return log_device_debug_errno(dev
, SYNTHETIC_ERRNO(EINVAL
),
437 "Invalid symbolic link of device node: %s", slink
);
439 (void) udev_node_escape_path(slink_name
, name_enc
, sizeof(name_enc
));
440 dirname
= path_join("/run/udev/links", name_enc
);
442 return log_oom_debug();
444 r
= update_stack_directory(dev
, dirname
, add
);
448 for (unsigned i
= 0; i
< LINK_UPDATE_MAX_RETRIES
; i
++) {
449 _cleanup_free_
char *target
= NULL
;
450 struct stat st1
= {}, st2
= {};
453 usec_t delay
= MIN_RANDOM_DELAY
+ random_u64_range(MAX_RANDOM_DELAY
- MIN_RANDOM_DELAY
);
455 log_device_debug(dev
, "Directory %s was updated, retrying to update devlink %s after %s.",
456 dirname
, slink
, FORMAT_TIMESPAN(delay
, USEC_PER_MSEC
));
457 (void) usleep(delay
);
460 if (stat(dirname
, &st1
) < 0 && errno
!= ENOENT
)
461 return log_device_debug_errno(dev
, errno
, "Failed to stat %s: %m", dirname
);
463 r
= link_find_prioritized(dev
, add
, dirname
, &target
);
465 return log_device_debug_errno(dev
, r
, "Failed to determine device node with the highest priority for '%s': %m", slink
);
467 log_device_debug(dev
, "No reference left for '%s', removing", slink
);
469 if (unlink(slink
) < 0 && errno
!= ENOENT
)
470 log_device_debug_errno(dev
, errno
, "Failed to remove '%s', ignoring: %m", slink
);
472 (void) rmdir_parents(slink
, "/dev");
476 r
= node_symlink(dev
, target
, slink
);
480 if (stat(dirname
, &st2
) < 0 && errno
!= ENOENT
)
481 return log_device_debug_errno(dev
, errno
, "Failed to stat %s: %m", dirname
);
483 if (((st1
.st_mode
& S_IFMT
) == 0 && (st2
.st_mode
& S_IFMT
) == 0) ||
484 stat_inode_unmodified(&st1
, &st2
))
491 static int device_get_devpath_by_devnum(sd_device
*dev
, char **ret
) {
492 const char *subsystem
;
499 r
= sd_device_get_subsystem(dev
, &subsystem
);
503 r
= sd_device_get_devnum(dev
, &devnum
);
507 return device_path_make_major_minor(streq(subsystem
, "block") ? S_IFBLK
: S_IFCHR
, devnum
, ret
);
510 int udev_node_update(sd_device
*dev
, sd_device
*dev_old
) {
511 _cleanup_free_
char *filename
= NULL
;
512 const char *devnode
, *devlink
;
518 r
= sd_device_get_devname(dev
, &devnode
);
520 return log_device_debug_errno(dev
, r
, "Failed to get devnode: %m");
523 const char *id
= NULL
;
525 (void) device_get_device_id(dev
, &id
);
526 log_device_debug(dev
, "Handling device node '%s', devnum=%s", devnode
, strna(id
));
529 /* update possible left-over symlinks */
530 FOREACH_DEVICE_DEVLINK(dev_old
, devlink
) {
531 /* check if old link name still belongs to this device */
532 if (device_has_devlink(dev
, devlink
))
535 log_device_debug(dev
,
536 "Removing/updating old device symlink '%s', which is no longer belonging to this device.",
539 r
= link_update(dev
, devlink
, /* add = */ false);
541 log_device_warning_errno(dev
, r
,
542 "Failed to remove/update device symlink '%s', ignoring: %m",
546 /* create/update symlinks, add symlinks to name index */
547 FOREACH_DEVICE_DEVLINK(dev
, devlink
) {
548 r
= link_update(dev
, devlink
, /* add = */ true);
550 log_device_warning_errno(dev
, r
,
551 "Failed to create/update device symlink '%s', ignoring: %m",
555 r
= device_get_devpath_by_devnum(dev
, &filename
);
557 return log_device_debug_errno(dev
, r
, "Failed to get device path: %m");
559 /* always add /dev/{block,char}/$major:$minor */
560 r
= node_symlink(dev
, devnode
, filename
);
562 return log_device_warning_errno(dev
, r
, "Failed to create device symlink '%s': %m", filename
);
567 int udev_node_remove(sd_device
*dev
) {
568 _cleanup_free_
char *filename
= NULL
;
574 /* remove/update symlinks, remove symlinks from name index */
575 FOREACH_DEVICE_DEVLINK(dev
, devlink
) {
576 r
= link_update(dev
, devlink
, /* add = */ false);
578 log_device_warning_errno(dev
, r
,
579 "Failed to remove/update device symlink '%s', ignoring: %m",
583 r
= device_get_devpath_by_devnum(dev
, &filename
);
585 return log_device_debug_errno(dev
, r
, "Failed to get device path: %m");
587 /* remove /dev/{block,char}/$major:$minor */
588 if (unlink(filename
) < 0 && errno
!= ENOENT
)
589 return log_device_debug_errno(dev
, errno
, "Failed to remove '%s': %m", filename
);
594 static int udev_node_apply_permissions_impl(
595 sd_device
*dev
, /* can be NULL, only used for logging. */
602 OrderedHashmap
*seclabel_list
) {
604 bool apply_mode
, apply_uid
, apply_gid
;
608 assert(node_fd
>= 0);
611 if (fstat(node_fd
, &stats
) < 0)
612 return log_device_debug_errno(dev
, errno
, "cannot stat() node %s: %m", devnode
);
614 /* If group is set, but mode is not set, "upgrade" mode for the group. */
615 if (mode
== MODE_INVALID
&& gid_is_valid(gid
) && gid
> 0)
618 apply_mode
= mode
!= MODE_INVALID
&& (stats
.st_mode
& 0777) != (mode
& 0777);
619 apply_uid
= uid_is_valid(uid
) && stats
.st_uid
!= uid
;
620 apply_gid
= gid_is_valid(gid
) && stats
.st_gid
!= gid
;
622 if (apply_mode
|| apply_uid
|| apply_gid
|| apply_mac
) {
623 bool selinux
= false, smack
= false;
624 const char *name
, *label
;
626 if (apply_mode
|| apply_uid
|| apply_gid
) {
627 log_device_debug(dev
, "Setting permissions %s, uid=" UID_FMT
", gid=" GID_FMT
", mode=%#o",
629 uid_is_valid(uid
) ? uid
: stats
.st_uid
,
630 gid_is_valid(gid
) ? gid
: stats
.st_gid
,
631 mode
!= MODE_INVALID
? mode
& 0777 : stats
.st_mode
& 0777);
633 r
= fchmod_and_chown(node_fd
, mode
, uid
, gid
);
635 log_device_full_errno(dev
, r
== -ENOENT
? LOG_DEBUG
: LOG_ERR
, r
,
636 "Failed to set owner/mode of %s to uid=" UID_FMT
637 ", gid=" GID_FMT
", mode=%#o: %m",
639 uid_is_valid(uid
) ? uid
: stats
.st_uid
,
640 gid_is_valid(gid
) ? gid
: stats
.st_gid
,
641 mode
!= MODE_INVALID
? mode
& 0777 : stats
.st_mode
& 0777);
643 log_device_debug(dev
, "Preserve permissions of %s, uid=" UID_FMT
", gid=" GID_FMT
", mode=%#o",
645 uid_is_valid(uid
) ? uid
: stats
.st_uid
,
646 gid_is_valid(gid
) ? gid
: stats
.st_gid
,
647 mode
!= MODE_INVALID
? mode
& 0777 : stats
.st_mode
& 0777);
649 /* apply SECLABEL{$module}=$label */
650 ORDERED_HASHMAP_FOREACH_KEY(label
, name
, seclabel_list
) {
653 if (streq(name
, "selinux")) {
656 q
= mac_selinux_apply_fd(node_fd
, devnode
, label
);
658 log_device_full_errno(dev
, q
== -ENOENT
? LOG_DEBUG
: LOG_ERR
, q
,
659 "SECLABEL: failed to set SELinux label '%s': %m", label
);
661 log_device_debug(dev
, "SECLABEL: set SELinux label '%s'", label
);
663 } else if (streq(name
, "smack")) {
666 q
= mac_smack_apply_fd(node_fd
, SMACK_ATTR_ACCESS
, label
);
668 log_device_full_errno(dev
, q
== -ENOENT
? LOG_DEBUG
: LOG_ERR
, q
,
669 "SECLABEL: failed to set SMACK label '%s': %m", label
);
671 log_device_debug(dev
, "SECLABEL: set SMACK label '%s'", label
);
674 log_device_error(dev
, "SECLABEL: unknown subsystem, ignoring '%s'='%s'", name
, label
);
677 /* set the defaults */
679 (void) mac_selinux_fix_fd(node_fd
, devnode
, LABEL_IGNORE_ENOENT
);
681 (void) mac_smack_apply_fd(node_fd
, SMACK_ATTR_ACCESS
, NULL
);
684 /* always update timestamp when we re-use the node, like on media change events */
685 r
= futimens_opath(node_fd
, NULL
);
687 log_device_debug_errno(dev
, r
, "Failed to adjust timestamp of node %s: %m", devnode
);
692 int udev_node_apply_permissions(
698 OrderedHashmap
*seclabel_list
) {
701 _cleanup_close_
int node_fd
= -1;
706 r
= sd_device_get_devname(dev
, &devnode
);
708 return log_device_debug_errno(dev
, r
, "Failed to get devname: %m");
710 node_fd
= sd_device_open(dev
, O_PATH
|O_CLOEXEC
);
712 if (ERRNO_IS_DEVICE_ABSENT(node_fd
)) {
713 log_device_debug_errno(dev
, node_fd
, "Device node %s is missing, skipping handling.", devnode
);
714 return 0; /* This is necessarily racey, so ignore missing the device */
717 return log_device_debug_errno(dev
, node_fd
, "Cannot open node %s: %m", devnode
);
720 return udev_node_apply_permissions_impl(dev
, node_fd
, devnode
, apply_mac
, mode
, uid
, gid
, seclabel_list
);
723 int static_node_apply_permissions(
730 _cleanup_free_
char *unescaped_filename
= NULL
;
731 _cleanup_close_
int node_fd
= -1;
738 if (uid
== UID_INVALID
&& gid
== GID_INVALID
&& mode
== MODE_INVALID
&& !tags
)
741 devnode
= strjoina("/dev/", name
);
743 node_fd
= open(devnode
, O_PATH
|O_CLOEXEC
);
746 return log_error_errno(errno
, "Failed to open %s: %m", devnode
);
750 if (fstat(node_fd
, &stats
) < 0)
751 return log_error_errno(errno
, "Failed to stat %s: %m", devnode
);
753 if (!S_ISBLK(stats
.st_mode
) && !S_ISCHR(stats
.st_mode
)) {
754 log_warning("%s is neither block nor character device, ignoring.", devnode
);
758 if (!strv_isempty(tags
)) {
759 unescaped_filename
= xescape(name
, "/.");
760 if (!unescaped_filename
)
764 /* export the tags to a directory as symlinks, allowing otherwise dead nodes to be tagged */
765 STRV_FOREACH(t
, tags
) {
766 _cleanup_free_
char *p
= NULL
;
768 p
= path_join("/run/udev/static_node-tags/", *t
, unescaped_filename
);
772 r
= mkdir_parents(p
, 0755);
774 return log_error_errno(r
, "Failed to create parent directory for %s: %m", p
);
776 r
= symlink(devnode
, p
);
777 if (r
< 0 && errno
!= EEXIST
)
778 return log_error_errno(errno
, "Failed to create symlink %s -> %s: %m", p
, devnode
);
781 return udev_node_apply_permissions_impl(NULL
, node_fd
, devnode
, false, mode
, uid
, gid
, NULL
);