1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include <linux/falloc.h>
7 #include <linux/magic.h>
10 #include "alloc-util.h"
11 #include "blockdev-util.h"
12 #include "dirent-util.h"
16 #include "locale-util.h"
19 #include "missing_fcntl.h"
20 #include "missing_fs.h"
21 #include "missing_syscall.h"
23 #include "parse-util.h"
24 #include "path-util.h"
25 #include "process-util.h"
26 #include "random-util.h"
27 #include "stat-util.h"
28 #include "stdio-util.h"
29 #include "string-util.h"
31 #include "time-util.h"
32 #include "tmpfile-util.h"
33 #include "user-util.h"
36 int unlink_noerrno(const char *path
) {
47 int rmdir_parents(const char *path
, const char *stop
) {
56 /* Skip trailing slashes */
57 while (l
> 0 && path
[l
-1] == '/')
63 /* Skip last component */
64 while (l
> 0 && path
[l
-1] != '/')
67 /* Skip trailing slashes */
68 while (l
> 0 && path
[l
-1] == '/')
78 if (path_startswith(stop
, t
)) {
94 int rename_noreplace(int olddirfd
, const char *oldpath
, int newdirfd
, const char *newpath
) {
97 /* Try the ideal approach first */
98 if (renameat2(olddirfd
, oldpath
, newdirfd
, newpath
, RENAME_NOREPLACE
) >= 0)
101 /* renameat2() exists since Linux 3.15, btrfs and FAT added support for it later. If it is not implemented,
102 * fall back to a different method. */
103 if (!IN_SET(errno
, EINVAL
, ENOSYS
, ENOTTY
))
106 /* Let's try to use linkat()+unlinkat() as fallback. This doesn't work on directories and on some file systems
107 * that do not support hard links (such as FAT, most prominently), but for files it's pretty close to what we
108 * want — though not atomic (i.e. for a short period both the new and the old filename will exist). */
109 if (linkat(olddirfd
, oldpath
, newdirfd
, newpath
, 0) >= 0) {
111 if (unlinkat(olddirfd
, oldpath
, 0) < 0) {
112 r
= -errno
; /* Backup errno before the following unlinkat() alters it */
113 (void) unlinkat(newdirfd
, newpath
, 0);
120 if (!IN_SET(errno
, EINVAL
, ENOSYS
, ENOTTY
, EPERM
)) /* FAT returns EPERM on link()… */
123 /* OK, neither RENAME_NOREPLACE nor linkat()+unlinkat() worked. Let's then fall back to the racy TOCTOU
124 * vulnerable accessat(F_OK) check followed by classic, replacing renameat(), we have nothing better. */
126 if (faccessat(newdirfd
, newpath
, F_OK
, AT_SYMLINK_NOFOLLOW
) >= 0)
131 if (renameat(olddirfd
, oldpath
, newdirfd
, newpath
) < 0)
137 int readlinkat_malloc(int fd
, const char *p
, char **ret
) {
138 size_t l
= FILENAME_MAX
+1;
152 n
= readlinkat(fd
, p
, c
, l
-1);
159 if ((size_t) n
< l
-1) {
170 int readlink_malloc(const char *p
, char **ret
) {
171 return readlinkat_malloc(AT_FDCWD
, p
, ret
);
174 int readlink_value(const char *p
, char **ret
) {
175 _cleanup_free_
char *link
= NULL
;
179 r
= readlink_malloc(p
, &link
);
183 value
= basename(link
);
187 value
= strdup(value
);
196 int readlink_and_make_absolute(const char *p
, char **r
) {
197 _cleanup_free_
char *target
= NULL
;
204 j
= readlink_malloc(p
, &target
);
208 k
= file_in_same_dir(p
, target
);
216 int chmod_and_chown(const char *path
, mode_t mode
, uid_t uid
, gid_t gid
) {
217 _cleanup_close_
int fd
= -1;
221 fd
= open(path
, O_PATH
|O_CLOEXEC
|O_NOFOLLOW
); /* Let's acquire an O_PATH fd, as precaution to change
222 * mode/owner on the same file */
226 return fchmod_and_chown(fd
, mode
, uid
, gid
);
229 int fchmod_and_chown(int fd
, mode_t mode
, uid_t uid
, gid_t gid
) {
230 bool do_chown
, do_chmod
;
234 /* Change ownership and access mode of the specified fd. Tries to do so safely, ensuring that at no
235 * point in time the access mode is above the old access mode under the old ownership or the new
236 * access mode under the new ownership. Note: this call tries hard to leave the access mode
237 * unaffected if the uid/gid is changed, i.e. it undoes implicit suid/sgid dropping the kernel does
240 * This call is happy with O_PATH fds. */
242 if (fstat(fd
, &st
) < 0)
246 (uid
!= UID_INVALID
&& st
.st_uid
!= uid
) ||
247 (gid
!= GID_INVALID
&& st
.st_gid
!= gid
);
250 !S_ISLNK(st
.st_mode
) && /* chmod is not defined on symlinks */
251 ((mode
!= MODE_INVALID
&& ((st
.st_mode
^ mode
) & 07777) != 0) ||
252 do_chown
); /* If we change ownership, make sure we reset the mode afterwards, since chown()
253 * modifies the access mode too */
255 if (mode
== MODE_INVALID
)
256 mode
= st
.st_mode
; /* If we only shall do a chown(), save original mode, since chown() might break it. */
257 else if ((mode
& S_IFMT
) != 0 && ((mode
^ st
.st_mode
) & S_IFMT
) != 0)
258 return -EINVAL
; /* insist on the right file type if it was specified */
260 if (do_chown
&& do_chmod
) {
261 mode_t minimal
= st
.st_mode
& mode
; /* the subset of the old and the new mask */
263 if (((minimal
^ st
.st_mode
) & 07777) != 0) {
264 r
= fchmod_opath(fd
, minimal
& 07777);
271 if (fchownat(fd
, "", uid
, gid
, AT_EMPTY_PATH
) < 0)
275 r
= fchmod_opath(fd
, mode
& 07777);
280 return do_chown
|| do_chmod
;
283 int fchmod_umask(int fd
, mode_t m
) {
288 r
= fchmod(fd
, m
& (~u
)) < 0 ? -errno
: 0;
294 int fchmod_opath(int fd
, mode_t m
) {
295 char procfs_path
[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
297 /* This function operates also on fd that might have been opened with
298 * O_PATH. Indeed fchmodat() doesn't have the AT_EMPTY_PATH flag like
299 * fchownat() does. */
301 xsprintf(procfs_path
, "/proc/self/fd/%i", fd
);
302 if (chmod(procfs_path
, m
) < 0) {
306 if (proc_mounted() == 0)
307 return -ENOSYS
; /* if we have no /proc/, the concept is not implementable */
315 int stat_warn_permissions(const char *path
, const struct stat
*st
) {
319 /* Don't complain if we are reading something that is not a file, for example /dev/null */
320 if (!S_ISREG(st
->st_mode
))
323 if (st
->st_mode
& 0111)
324 log_warning("Configuration file %s is marked executable. Please remove executable permission bits. Proceeding anyway.", path
);
326 if (st
->st_mode
& 0002)
327 log_warning("Configuration file %s is marked world-writable. Please remove world writability permission bits. Proceeding anyway.", path
);
329 if (getpid_cached() == 1 && (st
->st_mode
& 0044) != 0044)
330 log_warning("Configuration file %s is marked world-inaccessible. This has no effect as configuration data is accessible via APIs without restrictions. Proceeding anyway.", path
);
335 int fd_warn_permissions(const char *path
, int fd
) {
341 if (fstat(fd
, &st
) < 0)
344 return stat_warn_permissions(path
, &st
);
347 int touch_file(const char *path
, bool parents
, usec_t stamp
, uid_t uid
, gid_t gid
, mode_t mode
) {
348 char fdpath
[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
349 _cleanup_close_
int fd
= -1;
354 /* Note that touch_file() does not follow symlinks: if invoked on an existing symlink, then it is the symlink
355 * itself which is updated, not its target
357 * Returns the first error we encounter, but tries to apply as much as possible. */
360 (void) mkdir_parents(path
, 0755);
362 /* Initially, we try to open the node with O_PATH, so that we get a reference to the node. This is useful in
363 * case the path refers to an existing device or socket node, as we can open it successfully in all cases, and
364 * won't trigger any driver magic or so. */
365 fd
= open(path
, O_PATH
|O_CLOEXEC
|O_NOFOLLOW
);
370 /* if the node doesn't exist yet, we create it, but with O_EXCL, so that we only create a regular file
371 * here, and nothing else */
372 fd
= open(path
, O_WRONLY
|O_CREAT
|O_EXCL
|O_CLOEXEC
, IN_SET(mode
, 0, MODE_INVALID
) ? 0644 : mode
);
377 /* Let's make a path from the fd, and operate on that. With this logic, we can adjust the access mode,
378 * ownership and time of the file node in all cases, even if the fd refers to an O_PATH object — which is
379 * something fchown(), fchmod(), futimensat() don't allow. */
380 xsprintf(fdpath
, "/proc/self/fd/%i", fd
);
382 ret
= fchmod_and_chown(fd
, mode
, uid
, gid
);
384 if (stamp
!= USEC_INFINITY
) {
385 struct timespec ts
[2];
387 timespec_store(&ts
[0], stamp
);
389 r
= utimensat(AT_FDCWD
, fdpath
, ts
, 0);
391 r
= utimensat(AT_FDCWD
, fdpath
, NULL
, 0);
392 if (r
< 0 && ret
>= 0)
398 int touch(const char *path
) {
399 return touch_file(path
, false, USEC_INFINITY
, UID_INVALID
, GID_INVALID
, MODE_INVALID
);
402 int symlink_idempotent(const char *from
, const char *to
, bool make_relative
) {
403 _cleanup_free_
char *relpath
= NULL
;
410 _cleanup_free_
char *parent
= NULL
;
412 parent
= dirname_malloc(to
);
416 r
= path_make_relative(parent
, from
, &relpath
);
423 if (symlink(from
, to
) < 0) {
424 _cleanup_free_
char *p
= NULL
;
429 r
= readlink_malloc(to
, &p
);
430 if (r
== -EINVAL
) /* Not a symlink? In that case return the original error we encountered: -EEXIST */
432 if (r
< 0) /* Any other error? In that case propagate it as is */
435 if (!streq(p
, from
)) /* Not the symlink we want it to be? In that case, propagate the original -EEXIST */
442 int symlink_atomic(const char *from
, const char *to
) {
443 _cleanup_free_
char *t
= NULL
;
449 r
= tempfn_random(to
, NULL
, &t
);
453 if (symlink(from
, t
) < 0)
456 if (rename(t
, to
) < 0) {
464 int mknod_atomic(const char *path
, mode_t mode
, dev_t dev
) {
465 _cleanup_free_
char *t
= NULL
;
470 r
= tempfn_random(path
, NULL
, &t
);
474 if (mknod(t
, mode
, dev
) < 0)
477 if (rename(t
, path
) < 0) {
485 int mkfifo_atomic(const char *path
, mode_t mode
) {
486 _cleanup_free_
char *t
= NULL
;
491 r
= tempfn_random(path
, NULL
, &t
);
495 if (mkfifo(t
, mode
) < 0)
498 if (rename(t
, path
) < 0) {
506 int mkfifoat_atomic(int dirfd
, const char *path
, mode_t mode
) {
507 _cleanup_free_
char *t
= NULL
;
512 if (path_is_absolute(path
))
513 return mkfifo_atomic(path
, mode
);
515 /* We're only interested in the (random) filename. */
516 r
= tempfn_random_child("", NULL
, &t
);
520 if (mkfifoat(dirfd
, t
, mode
) < 0)
523 if (renameat(dirfd
, t
, dirfd
, path
) < 0) {
531 int get_files_in_directory(const char *path
, char ***list
) {
532 _cleanup_closedir_
DIR *d
= NULL
;
534 size_t bufsize
= 0, n
= 0;
535 _cleanup_strv_free_
char **l
= NULL
;
539 /* Returns all files in a directory in *list, and the number
540 * of files as return value. If list is NULL returns only the
547 FOREACH_DIRENT_ALL(de
, d
, return -errno
) {
548 dirent_ensure_type(d
, de
);
550 if (!dirent_is_file(de
))
554 /* one extra slot is needed for the terminating NULL */
555 if (!GREEDY_REALLOC(l
, bufsize
, n
+ 2))
558 l
[n
] = strdup(de
->d_name
);
573 static int getenv_tmp_dir(const char **ret_path
) {
579 /* We use the same order of environment variables python uses in tempfile.gettempdir():
580 * https://docs.python.org/3/library/tempfile.html#tempfile.gettempdir */
581 FOREACH_STRING(n
, "TMPDIR", "TEMP", "TMP") {
584 e
= secure_getenv(n
);
587 if (!path_is_absolute(e
)) {
591 if (!path_is_normalized(e
)) {
608 /* Remember first error, to make this more debuggable */
620 static int tmp_dir_internal(const char *def
, const char **ret
) {
627 r
= getenv_tmp_dir(&e
);
633 k
= is_dir(def
, true);
637 return r
< 0 ? r
: k
;
643 int var_tmp_dir(const char **ret
) {
645 /* Returns the location for "larger" temporary files, that is backed by physical storage if available, and thus
646 * even might survive a boot: /var/tmp. If $TMPDIR (or related environment variables) are set, its value is
647 * returned preferably however. Note that both this function and tmp_dir() below are affected by $TMPDIR,
648 * making it a variable that overrides all temporary file storage locations. */
650 return tmp_dir_internal("/var/tmp", ret
);
653 int tmp_dir(const char **ret
) {
655 /* Similar to var_tmp_dir() above, but returns the location for "smaller" temporary files, which is usually
656 * backed by an in-memory file system: /tmp. */
658 return tmp_dir_internal("/tmp", ret
);
661 int unlink_or_warn(const char *filename
) {
662 if (unlink(filename
) < 0 && errno
!= ENOENT
)
663 /* If the file doesn't exist and the fs simply was read-only (in which
664 * case unlink() returns EROFS even if the file doesn't exist), don't
666 if (errno
!= EROFS
|| access(filename
, F_OK
) >= 0)
667 return log_error_errno(errno
, "Failed to remove \"%s\": %m", filename
);
672 int inotify_add_watch_fd(int fd
, int what
, uint32_t mask
) {
673 char path
[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int) + 1];
676 /* This is like inotify_add_watch(), except that the file to watch is not referenced by a path, but by an fd */
677 xsprintf(path
, "/proc/self/fd/%i", what
);
679 wd
= inotify_add_watch(fd
, path
, mask
);
686 int inotify_add_watch_and_warn(int fd
, const char *pathname
, uint32_t mask
) {
689 wd
= inotify_add_watch(fd
, pathname
, mask
);
692 return log_error_errno(errno
, "Failed to add a watch for %s: inotify watch limit reached", pathname
);
694 return log_error_errno(errno
, "Failed to add a watch for %s: %m", pathname
);
700 static bool unsafe_transition(const struct stat
*a
, const struct stat
*b
) {
701 /* Returns true if the transition from a to b is safe, i.e. that we never transition from unprivileged to
702 * privileged files or directories. Why bother? So that unprivileged code can't symlink to privileged files
703 * making us believe we read something safe even though it isn't safe in the specific context we open it in. */
705 if (a
->st_uid
== 0) /* Transitioning from privileged to unprivileged is always fine */
708 return a
->st_uid
!= b
->st_uid
; /* Otherwise we need to stay within the same UID */
711 static int log_unsafe_transition(int a
, int b
, const char *path
, unsigned flags
) {
712 _cleanup_free_
char *n1
= NULL
, *n2
= NULL
;
714 if (!FLAGS_SET(flags
, CHASE_WARN
))
717 (void) fd_get_path(a
, &n1
);
718 (void) fd_get_path(b
, &n2
);
720 return log_warning_errno(SYNTHETIC_ERRNO(ENOLINK
),
721 "Detected unsafe path transition %s %s %s during canonicalization of %s.",
722 strna(n1
), special_glyph(SPECIAL_GLYPH_ARROW
), strna(n2
), path
);
725 static int log_autofs_mount_point(int fd
, const char *path
, unsigned flags
) {
726 _cleanup_free_
char *n1
= NULL
;
728 if (!FLAGS_SET(flags
, CHASE_WARN
))
731 (void) fd_get_path(fd
, &n1
);
733 return log_warning_errno(SYNTHETIC_ERRNO(EREMOTE
),
734 "Detected autofs mount point %s during canonicalization of %s.",
738 int chase_symlinks(const char *path
, const char *original_root
, unsigned flags
, char **ret_path
, int *ret_fd
) {
739 _cleanup_free_
char *buffer
= NULL
, *done
= NULL
, *root
= NULL
;
740 _cleanup_close_
int fd
= -1;
741 unsigned max_follow
= CHASE_SYMLINKS_MAX
; /* how many symlinks to follow before giving up and returning ELOOP */
742 struct stat previous_stat
;
749 /* Either the file may be missing, or we return an fd to the final object, but both make no sense */
750 if ((flags
& CHASE_NONEXISTENT
) && ret_fd
)
753 if ((flags
& CHASE_STEP
) && ret_fd
)
759 /* This is a lot like canonicalize_file_name(), but takes an additional "root" parameter, that allows following
760 * symlinks relative to a root directory, instead of the root of the host.
762 * Note that "root" primarily matters if we encounter an absolute symlink. It is also used when following
763 * relative symlinks to ensure they cannot be used to "escape" the root directory. The path parameter passed is
764 * assumed to be already prefixed by it, except if the CHASE_PREFIX_ROOT flag is set, in which case it is first
765 * prefixed accordingly.
767 * Algorithmically this operates on two path buffers: "done" are the components of the path we already
768 * processed and resolved symlinks, "." and ".." of. "todo" are the components of the path we still need to
769 * process. On each iteration, we move one component from "todo" to "done", processing it's special meaning
770 * each time. The "todo" path always starts with at least one slash, the "done" path always ends in no
771 * slash. We always keep an O_PATH fd to the component we are currently processing, thus keeping lookup races
774 * Suggested usage: whenever you want to canonicalize a path, use this function. Pass the absolute path you got
775 * as-is: fully qualified and relative to your host's root. Optionally, specify the root parameter to tell this
776 * function what to do when encountering a symlink with an absolute path as directory: prefix it by the
779 * There are five ways to invoke this function:
781 * 1. Without CHASE_STEP or ret_fd: in this case the path is resolved and the normalized path is
782 * returned in `ret_path`. The return value is < 0 on error. If CHASE_NONEXISTENT is also set, 0
783 * is returned if the file doesn't exist, > 0 otherwise. If CHASE_NONEXISTENT is not set, >= 0 is
784 * returned if the destination was found, -ENOENT if it wasn't.
786 * 2. With ret_fd: in this case the destination is opened after chasing it as O_PATH and this file
787 * descriptor is returned as return value. This is useful to open files relative to some root
788 * directory. Note that the returned O_PATH file descriptors must be converted into a regular one (using
789 * fd_reopen() or such) before it can be used for reading/writing. ret_fd may not be combined with
792 * 3. With CHASE_STEP: in this case only a single step of the normalization is executed, i.e. only the first
793 * symlink or ".." component of the path is resolved, and the resulting path is returned. This is useful if
794 * a caller wants to trace the a path through the file system verbosely. Returns < 0 on error, > 0 if the
795 * path is fully normalized, and == 0 for each normalization step. This may be combined with
796 * CHASE_NONEXISTENT, in which case 1 is returned when a component is not found.
798 * 4. With CHASE_SAFE: in this case the path must not contain unsafe transitions, i.e. transitions from
799 * unprivileged to privileged files or directories. In such cases the return value is -ENOLINK. If
800 * CHASE_WARN is also set, a warning describing the unsafe transition is emitted.
802 * 5. With CHASE_NO_AUTOFS: in this case if an autofs mount point is encountered, path normalization
803 * is aborted and -EREMOTE is returned. If CHASE_WARN is also set, a warning showing the path of
804 * the mount point is emitted.
807 /* A root directory of "/" or "" is identical to none */
808 if (empty_or_root(original_root
))
809 original_root
= NULL
;
811 if (!original_root
&& !ret_path
&& !(flags
& (CHASE_NONEXISTENT
|CHASE_NO_AUTOFS
|CHASE_SAFE
|CHASE_STEP
)) && ret_fd
) {
812 /* Shortcut the ret_fd case if the caller isn't interested in the actual path and has no root set
813 * and doesn't care about any of the other special features we provide either. */
814 r
= open(path
, O_PATH
|O_CLOEXEC
|((flags
& CHASE_NOFOLLOW
) ? O_NOFOLLOW
: 0));
823 r
= path_make_absolute_cwd(original_root
, &root
);
827 /* Simplify the root directory, so that it has no duplicate slashes and nothing at the
828 * end. While we won't resolve the root path we still simplify it. Note that dropping the
829 * trailing slash should not change behaviour, since when opening it we specify O_DIRECTORY
830 * anyway. Moreover at the end of this function after processing everything we'll always turn
831 * the empty string back to "/". */
832 delete_trailing_chars(root
, "/");
833 path_simplify(root
, true);
835 if (flags
& CHASE_PREFIX_ROOT
) {
836 /* We don't support relative paths in combination with a root directory */
837 if (!path_is_absolute(path
))
840 path
= prefix_roota(root
, path
);
844 r
= path_make_absolute_cwd(path
, &buffer
);
848 fd
= open(root
?: "/", O_CLOEXEC
|O_DIRECTORY
|O_PATH
);
852 if (flags
& CHASE_SAFE
) {
853 if (fstat(fd
, &previous_stat
) < 0)
858 _cleanup_free_
char *absolute
= NULL
;
861 /* If we are operating on a root directory, let's take the root directory as it is. */
863 e
= path_startswith(buffer
, root
);
865 return log_full_errno(flags
& CHASE_WARN
? LOG_WARNING
: LOG_DEBUG
,
866 SYNTHETIC_ERRNO(ECHRNG
),
867 "Specified path '%s' is outside of specified root directory '%s', refusing to resolve.",
874 /* Make sure "todo" starts with a slash */
875 absolute
= strjoin("/", e
);
879 free_and_replace(buffer
, absolute
);
884 _cleanup_free_
char *first
= NULL
;
885 _cleanup_close_
int child
= -1;
889 /* Determine length of first component in the path */
890 n
= strspn(todo
, "/"); /* The slashes */
893 /* If we are looking at more than a single slash then skip all but one, so that when
894 * we are done with everything we have a normalized path with only single slashes
895 * separating the path components. */
900 m
= n
+ strcspn(todo
+ n
, "/"); /* The entire length of the component */
902 /* Extract the first component. */
903 first
= strndup(todo
, m
);
909 /* Empty? Then we reached the end. */
913 /* Just a single slash? Then we reached the end. */
914 if (path_equal(first
, "/")) {
915 /* Preserve the trailing slash */
917 if (flags
& CHASE_TRAIL_SLASH
)
918 if (!strextend(&done
, "/", NULL
))
924 /* Just a dot? Then let's eat this up. */
925 if (path_equal(first
, "/."))
928 /* Two dots? Then chop off the last bit of what we already found out. */
929 if (path_equal(first
, "/..")) {
930 _cleanup_free_
char *parent
= NULL
;
931 _cleanup_close_
int fd_parent
= -1;
933 /* If we already are at the top, then going up will not change anything. This is in-line with
934 * how the kernel handles this. */
935 if (empty_or_root(done
))
938 parent
= dirname_malloc(done
);
942 /* Don't allow this to leave the root dir. */
944 path_startswith(done
, root
) &&
945 !path_startswith(parent
, root
))
948 free_and_replace(done
, parent
);
950 if (flags
& CHASE_STEP
)
953 fd_parent
= openat(fd
, "..", O_CLOEXEC
|O_NOFOLLOW
|O_PATH
);
957 if (flags
& CHASE_SAFE
) {
958 if (fstat(fd_parent
, &st
) < 0)
961 if (unsafe_transition(&previous_stat
, &st
))
962 return log_unsafe_transition(fd
, fd_parent
, path
, flags
);
968 fd
= TAKE_FD(fd_parent
);
973 /* Otherwise let's see what this is. */
974 child
= openat(fd
, first
+ n
, O_CLOEXEC
|O_NOFOLLOW
|O_PATH
);
977 if (errno
== ENOENT
&&
978 (flags
& CHASE_NONEXISTENT
) &&
979 (isempty(todo
) || path_is_normalized(todo
))) {
981 /* If CHASE_NONEXISTENT is set, and the path does not exist, then that's OK, return
982 * what we got so far. But don't allow this if the remaining path contains "../ or "./"
983 * or something else weird. */
985 /* If done is "/", as first also contains slash at the head, then remove this redundant slash. */
986 if (streq_ptr(done
, "/"))
989 if (!strextend(&done
, first
, todo
, NULL
))
999 if (fstat(child
, &st
) < 0)
1001 if ((flags
& CHASE_SAFE
) &&
1002 unsafe_transition(&previous_stat
, &st
))
1003 return log_unsafe_transition(fd
, child
, path
, flags
);
1007 if ((flags
& CHASE_NO_AUTOFS
) &&
1008 fd_is_fs_type(child
, AUTOFS_SUPER_MAGIC
) > 0)
1009 return log_autofs_mount_point(child
, path
, flags
);
1011 if (S_ISLNK(st
.st_mode
) && !((flags
& CHASE_NOFOLLOW
) && isempty(todo
))) {
1013 _cleanup_free_
char *destination
= NULL
;
1015 /* This is a symlink, in this case read the destination. But let's make sure we don't follow
1016 * symlinks without bounds. */
1017 if (--max_follow
<= 0)
1020 r
= readlinkat_malloc(fd
, first
+ n
, &destination
);
1023 if (isempty(destination
))
1026 if (path_is_absolute(destination
)) {
1028 /* An absolute destination. Start the loop from the beginning, but use the root
1029 * directory as base. */
1032 fd
= open(root
?: "/", O_CLOEXEC
|O_DIRECTORY
|O_PATH
);
1036 if (flags
& CHASE_SAFE
) {
1037 if (fstat(fd
, &st
) < 0)
1040 if (unsafe_transition(&previous_stat
, &st
))
1041 return log_unsafe_transition(child
, fd
, path
, flags
);
1048 /* Note that we do not revalidate the root, we take it as is. */
1052 done
= strdup(root
);
1057 /* Prefix what's left to do with what we just read, and start the loop again, but
1058 * remain in the current directory. */
1059 joined
= path_join(destination
, todo
);
1061 joined
= path_join("/", destination
, todo
);
1066 todo
= buffer
= joined
;
1068 if (flags
& CHASE_STEP
)
1074 /* If this is not a symlink, then let's just add the name we read to what we already verified. */
1076 done
= TAKE_PTR(first
);
1078 /* If done is "/", as first also contains slash at the head, then remove this redundant slash. */
1079 if (streq(done
, "/"))
1082 if (!strextend(&done
, first
, NULL
))
1086 /* And iterate again, but go one directory further down. */
1088 fd
= TAKE_FD(child
);
1092 /* Special case, turn the empty string into "/", to indicate the root directory. */
1099 *ret_path
= TAKE_PTR(done
);
1102 /* Return the O_PATH fd we currently are looking to the caller. It can translate it to a
1103 * proper fd by opening /proc/self/fd/xyz. */
1106 *ret_fd
= TAKE_FD(fd
);
1109 if (flags
& CHASE_STEP
)
1118 c
= strjoin(strempty(done
), todo
);
1128 int chase_symlinks_and_open(
1131 unsigned chase_flags
,
1135 _cleanup_close_
int path_fd
= -1;
1136 _cleanup_free_
char *p
= NULL
;
1139 if (chase_flags
& CHASE_NONEXISTENT
)
1142 if (empty_or_root(root
) && !ret_path
&& (chase_flags
& (CHASE_NO_AUTOFS
|CHASE_SAFE
)) == 0) {
1143 /* Shortcut this call if none of the special features of this call are requested */
1144 r
= open(path
, open_flags
);
1151 r
= chase_symlinks(path
, root
, chase_flags
, ret_path
? &p
: NULL
, &path_fd
);
1154 assert(path_fd
>= 0);
1156 r
= fd_reopen(path_fd
, open_flags
);
1161 *ret_path
= TAKE_PTR(p
);
1166 int chase_symlinks_and_opendir(
1169 unsigned chase_flags
,
1173 char procfs_path
[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
1174 _cleanup_close_
int path_fd
= -1;
1175 _cleanup_free_
char *p
= NULL
;
1181 if (chase_flags
& CHASE_NONEXISTENT
)
1184 if (empty_or_root(root
) && !ret_path
&& (chase_flags
& (CHASE_NO_AUTOFS
|CHASE_SAFE
)) == 0) {
1185 /* Shortcut this call if none of the special features of this call are requested */
1194 r
= chase_symlinks(path
, root
, chase_flags
, ret_path
? &p
: NULL
, &path_fd
);
1197 assert(path_fd
>= 0);
1199 xsprintf(procfs_path
, "/proc/self/fd/%i", path_fd
);
1200 d
= opendir(procfs_path
);
1205 *ret_path
= TAKE_PTR(p
);
1211 int chase_symlinks_and_stat(
1214 unsigned chase_flags
,
1216 struct stat
*ret_stat
,
1219 _cleanup_close_
int path_fd
= -1;
1220 _cleanup_free_
char *p
= NULL
;
1226 if (chase_flags
& CHASE_NONEXISTENT
)
1229 if (empty_or_root(root
) && !ret_path
&& (chase_flags
& (CHASE_NO_AUTOFS
|CHASE_SAFE
)) == 0) {
1230 /* Shortcut this call if none of the special features of this call are requested */
1231 if (stat(path
, ret_stat
) < 0)
1237 r
= chase_symlinks(path
, root
, chase_flags
, ret_path
? &p
: NULL
, &path_fd
);
1240 assert(path_fd
>= 0);
1242 if (fstat(path_fd
, ret_stat
) < 0)
1246 *ret_path
= TAKE_PTR(p
);
1248 *ret_fd
= TAKE_FD(path_fd
);
1253 int access_fd(int fd
, int mode
) {
1254 char p
[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(fd
) + 1];
1256 /* Like access() but operates on an already open fd */
1258 xsprintf(p
, "/proc/self/fd/%i", fd
);
1259 if (access(p
, mode
) < 0) {
1260 if (errno
!= ENOENT
)
1263 /* ENOENT can mean two things: that the fd does not exist or that /proc is not mounted. Let's
1264 * make things debuggable and distinguish the two. */
1266 if (proc_mounted() == 0)
1267 return -ENOSYS
; /* /proc is not available or not set up properly, we're most likely in some chroot
1270 return -EBADF
; /* The directory exists, hence it's the fd that doesn't. */
1276 void unlink_tempfilep(char (*p
)[]) {
1277 /* If the file is created with mkstemp(), it will (almost always)
1278 * change the suffix. Treat this as a sign that the file was
1279 * successfully created. We ignore both the rare case where the
1280 * original suffix is used and unlink failures. */
1281 if (!endswith(*p
, ".XXXXXX"))
1282 (void) unlink_noerrno(*p
);
1285 int unlinkat_deallocate(int fd
, const char *name
, UnlinkDeallocateFlags flags
) {
1286 _cleanup_close_
int truncate_fd
= -1;
1290 assert((flags
& ~(UNLINK_REMOVEDIR
|UNLINK_ERASE
)) == 0);
1292 /* Operates like unlinkat() but also deallocates the file contents if it is a regular file and there's no other
1293 * link to it. This is useful to ensure that other processes that might have the file open for reading won't be
1294 * able to keep the data pinned on disk forever. This call is particular useful whenever we execute clean-up
1295 * jobs ("vacuuming"), where we want to make sure the data is really gone and the disk space released and
1296 * returned to the free pool.
1298 * Deallocation is preferably done by FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE (👊) if supported, which means
1299 * the file won't change size. That's a good thing since we shouldn't needlessly trigger SIGBUS in other
1300 * programs that have mmap()ed the file. (The assumption here is that changing file contents to all zeroes
1301 * underneath those programs is the better choice than simply triggering SIGBUS in them which truncation does.)
1302 * However if hole punching is not implemented in the kernel or file system we'll fall back to normal file
1303 * truncation (🔪), as our goal of deallocating the data space trumps our goal of being nice to readers (💐).
1305 * Note that we attempt deallocation, but failure to succeed with that is not considered fatal, as long as the
1306 * primary job – to delete the file – is accomplished. */
1308 if (!FLAGS_SET(flags
, UNLINK_REMOVEDIR
)) {
1309 truncate_fd
= openat(fd
, name
, O_WRONLY
|O_CLOEXEC
|O_NOCTTY
|O_NOFOLLOW
|O_NONBLOCK
);
1310 if (truncate_fd
< 0) {
1312 /* If this failed because the file doesn't exist propagate the error right-away. Also,
1313 * AT_REMOVEDIR wasn't set, and we tried to open the file for writing, which means EISDIR is
1314 * returned when this is a directory but we are not supposed to delete those, hence propagate
1315 * the error right-away too. */
1316 if (IN_SET(errno
, ENOENT
, EISDIR
))
1319 if (errno
!= ELOOP
) /* don't complain if this is a symlink */
1320 log_debug_errno(errno
, "Failed to open file '%s' for deallocation, ignoring: %m", name
);
1324 if (unlinkat(fd
, name
, FLAGS_SET(flags
, UNLINK_REMOVEDIR
) ? AT_REMOVEDIR
: 0) < 0)
1327 if (truncate_fd
< 0) /* Don't have a file handle, can't do more ☹️ */
1330 if (fstat(truncate_fd
, &st
) < 0) {
1331 log_debug_errno(errno
, "Failed to stat file '%s' for deallocation, ignoring: %m", name
);
1335 if (!S_ISREG(st
.st_mode
))
1338 if (FLAGS_SET(flags
, UNLINK_ERASE
) && st
.st_size
> 0 && st
.st_nlink
== 0) {
1339 uint64_t left
= st
.st_size
;
1340 char buffer
[64 * 1024];
1342 /* If erasing is requested, let's overwrite the file with random data once before deleting
1343 * it. This isn't going to give you shred(1) semantics, but hopefully should be good enough
1344 * for stuff backed by tmpfs at least.
1346 * Note that we only erase like this if the link count of the file is zero. If it is higher it
1347 * is still linked by someone else and we'll leave it to them to remove it securely
1350 random_bytes(buffer
, sizeof(buffer
));
1355 n
= write(truncate_fd
, buffer
, MIN(sizeof(buffer
), left
));
1357 log_debug_errno(errno
, "Failed to erase data in file '%s', ignoring.", name
);
1361 assert(left
>= (size_t) n
);
1365 /* Let's refresh metadata */
1366 if (fstat(truncate_fd
, &st
) < 0) {
1367 log_debug_errno(errno
, "Failed to stat file '%s' for deallocation, ignoring: %m", name
);
1372 /* Don't dallocate if there's nothing to deallocate or if the file is linked elsewhere */
1373 if (st
.st_blocks
== 0 || st
.st_nlink
> 0)
1376 /* If this is a regular file, it actually took up space on disk and there are no other links it's time to
1377 * punch-hole/truncate this to release the disk space. */
1379 bs
= MAX(st
.st_blksize
, 512);
1380 l
= DIV_ROUND_UP(st
.st_size
, bs
) * bs
; /* Round up to next block size */
1382 if (fallocate(truncate_fd
, FALLOC_FL_PUNCH_HOLE
|FALLOC_FL_KEEP_SIZE
, 0, l
) >= 0)
1383 return 0; /* Successfully punched a hole! 😊 */
1385 /* Fall back to truncation */
1386 if (ftruncate(truncate_fd
, 0) < 0) {
1387 log_debug_errno(errno
, "Failed to truncate file to 0, ignoring: %m");
1394 int fsync_directory_of_file(int fd
) {
1395 _cleanup_free_
char *path
= NULL
;
1396 _cleanup_close_
int dfd
= -1;
1399 r
= fd_verify_regular(fd
);
1403 r
= fd_get_path(fd
, &path
);
1405 log_debug_errno(r
, "Failed to query /proc/self/fd/%d%s: %m",
1407 r
== -ENOSYS
? ", ignoring" : "");
1410 /* If /proc is not available, we're most likely running in some
1411 * chroot environment, and syncing the directory is not very
1412 * important in that case. Let's just silently do nothing. */
1418 if (!path_is_absolute(path
))
1421 dfd
= open_parent(path
, O_CLOEXEC
, 0);
1431 int fsync_full(int fd
) {
1434 /* Sync both the file and the directory */
1436 r
= fsync(fd
) < 0 ? -errno
: 0;
1437 q
= fsync_directory_of_file(fd
);
1439 return r
< 0 ? r
: q
;
1442 int fsync_path_at(int at_fd
, const char *path
) {
1443 _cleanup_close_
int opened_fd
= -1;
1446 if (isempty(path
)) {
1447 if (at_fd
== AT_FDCWD
) {
1448 opened_fd
= open(".", O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
);
1457 opened_fd
= openat(at_fd
, path
, O_RDONLY
|O_CLOEXEC
);
1470 int syncfs_path(int atfd
, const char *path
) {
1471 _cleanup_close_
int fd
= -1;
1475 fd
= openat(atfd
, path
, O_CLOEXEC
|O_RDONLY
|O_NONBLOCK
);
1485 int open_parent(const char *path
, int flags
, mode_t mode
) {
1486 _cleanup_free_
char *parent
= NULL
;
1491 if (path_equal(path
, "/")) /* requesting the parent of the root dir is fishy, let's prohibit that */
1494 parent
= dirname_malloc(path
);
1498 /* Let's insist on O_DIRECTORY since the parent of a file or directory is a directory. Except if we open an
1499 * O_TMPFILE file, because in that case we are actually create a regular file below the parent directory. */
1501 if (FLAGS_SET(flags
, O_PATH
))
1502 flags
|= O_DIRECTORY
;
1503 else if (!FLAGS_SET(flags
, O_TMPFILE
))
1504 flags
|= O_DIRECTORY
|O_RDONLY
;
1506 fd
= open(parent
, flags
, mode
);
1513 static int blockdev_is_encrypted(const char *sysfs_path
, unsigned depth_left
) {
1514 _cleanup_free_
char *p
= NULL
, *uuids
= NULL
;
1515 _cleanup_closedir_
DIR *d
= NULL
;
1516 int r
, found_encrypted
= false;
1520 if (depth_left
== 0)
1523 p
= path_join(sysfs_path
, "dm/uuid");
1527 r
= read_one_line_file(p
, &uuids
);
1532 /* The DM device's uuid attribute is prefixed with "CRYPT-" if this is a dm-crypt device. */
1533 if (startswith(uuids
, "CRYPT-"))
1537 /* Not a dm-crypt device itself. But maybe it is on top of one? Follow the links in the "slaves/"
1541 p
= path_join(sysfs_path
, "slaves");
1547 if (errno
== ENOENT
) /* Doesn't have underlying devices */
1554 _cleanup_free_
char *q
= NULL
;
1558 de
= readdir_no_dot(d
);
1563 break; /* No more underlying devices */
1566 q
= path_join(p
, de
->d_name
);
1570 r
= blockdev_is_encrypted(q
, depth_left
- 1);
1573 if (r
== 0) /* we found one that is not encrypted? then propagate that immediately */
1576 found_encrypted
= true;
1579 return found_encrypted
;
1582 int path_is_encrypted(const char *path
) {
1583 char p
[SYS_BLOCK_PATH_MAX(NULL
)];
1587 r
= get_block_device(path
, &devt
);
1590 if (r
== 0) /* doesn't have a block device */
1593 xsprintf_sys_block_path(p
, NULL
, devt
);
1595 return blockdev_is_encrypted(p
, 10 /* safety net: maximum recursion depth */);