summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-07-10 18:46:26 +0200
committerLennart Poettering <lennart@poettering.net>2012-07-10 18:46:26 +0200
commit825c6fe5eb362437aa46faa52b683a62eede9a13 (patch)
tree32bb7c65a549b5c3aa60a0f0e61011d5379980d3 /src
parent36fcd77e02cedf300e2f45f2449e7e091ef5a7ab (diff)
util: add extra safety check to in_initrd()
initrds can only be on tmpfs or ramfs, so check for that
Diffstat (limited to 'src')
-rw-r--r--src/shared/util.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index 41505b2ca7..8caac7b597 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -54,6 +54,8 @@
#include <glob.h>
#include <grp.h>
#include <sys/mman.h>
+#include <sys/vfs.h>
+#include <linux/magic.h>
#include "macro.h"
#include "util.h"
@@ -5738,9 +5740,24 @@ bool is_valid_documentation_url(const char *url) {
bool in_initrd(void) {
static int saved = -1;
+ struct statfs s;
- if (saved < 0)
- saved = access("/etc/initrd-release", F_OK) >= 0;
+ if (saved >= 0)
+ return saved;
+
+ /* We make two checks here:
+ *
+ * 1. the flag file /etc/initrd-release must exist
+ * 2. the root file system must be a memory file system
+ *
+ * The second check is extra paranoia, since misdetecting an
+ * initrd can have bad bad consequences due the initrd
+ * emptying when transititioning to the main systemd.
+ */
+
+ saved = access("/etc/initrd-release", F_OK) >= 0 &&
+ statfs("/", &s) >= 0 &&
+ (s.f_type == TMPFS_MAGIC || s.f_type == RAMFS_MAGIC);
return saved;
}