d743bb5bcc
This reverts commits3fb4a15096
and0e8350ca14
. Either building with meson or other upstream changes was causing issues with booting, and I didn't have time to debug this properly.
30 lines
1.3 KiB
Diff
30 lines
1.3 KiB
Diff
From 677a50e8e931741a174f45d9cae981253dfae3ff Mon Sep 17 00:00:00 2001
|
|
From: Jan Synacek <jan.synacek@gmail.com>
|
|
Date: Wed, 29 Mar 2017 08:25:52 +0200
|
|
Subject: [PATCH] basic: forbid rm_rf() to remove paths ending with ".."
|
|
(#5653)
|
|
|
|
Fixes: #5644(cherry picked from commit ab883125704b9310dcdfcf7451a27e85609da76c)
|
|
---
|
|
src/basic/rm-rf.c | 7 +++++++
|
|
1 file changed, 7 insertions(+)
|
|
|
|
diff --git a/src/basic/rm-rf.c b/src/basic/rm-rf.c
|
|
index 08497af729..bdaca264ff 100644
|
|
--- a/src/basic/rm-rf.c
|
|
+++ b/src/basic/rm-rf.c
|
|
@@ -187,6 +187,13 @@ int rm_rf(const char *path, RemoveFlags flags) {
|
|
return -EPERM;
|
|
}
|
|
|
|
+ /* Another safe-check. Removing "/path/.." could easily remove entire root as well.
|
|
+ * It's especially easy to do using globs in tmpfiles, like "/path/.*", which the glob()
|
|
+ * function expands to both "/path/." and "/path/..".
|
|
+ * Return -EINVAL to be consistent with rmdir("/path/."). */
|
|
+ if (endswith(path, "/..") || endswith(path, "/../"))
|
|
+ return -EINVAL;
|
|
+
|
|
if ((flags & (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) == (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) {
|
|
/* Try to remove as subvolume first */
|
|
r = btrfs_subvol_remove(path, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA);
|