aboutsummaryrefslogtreecommitdiff
path: root/sh
diff options
context:
space:
mode:
authorWilliam Hubbs <williamh@gentoo.org>2011-03-24 18:27:35 -0500
committerWilliam Hubbs <williamh@gentoo.org>2011-03-24 19:14:16 -0500
commit1d63e85794ad850752eec95fa077e5895295f3b7 (patch)
tree0ee4d9210c5be13783ddd957e56f1cb4eaf75c07 /sh
parent25049d3e80aeb17d4d62a653cfa8223fae56ddd0 (diff)
rework test for mounted /proc
The previous test assumed that we could always rely on the minor fault counter to change between reads of /proc/self/stat, but we found that this is not the case. The new test compares two reads of /proc/self/environ for which we have set the same environment variable to two different values. If the comparison shows the two reads have the same contents, we know that /proc is not working. I would like to thank Robin Johnson and Mike Frysinger for their input for this patch. X-Gentoo-Bug: 348416 X-Gentoo-Bug-URL: http://bugs.gentoo.org/show_bug.cgi?id=348416
Diffstat (limited to 'sh')
-rw-r--r--sh/init.sh.Linux.in20
1 files changed, 7 insertions, 13 deletions
diff --git a/sh/init.sh.Linux.in b/sh/init.sh.Linux.in
index 9b045570..361de0bc 100644
--- a/sh/init.sh.Linux.in
+++ b/sh/init.sh.Linux.in
@@ -65,27 +65,21 @@ mount_svcdir()
# By default VServer already has /proc mounted, but OpenVZ does not!
# However, some of our users have an old proc image in /proc
# NFC how they managed that, but the end result means we have to test if
-# /proc actually works or not. We to this by comparing two reads of
-# /proc/self/stat. They will not match, because at least the minor fault count
-# field (field 10) should have changed.
-#
-# We can use any file here that fills the following requirements:
-# - changes between sequential reads
-# - is world-readable (not blocked in hardened kernel)
-# - Is only a single line (ergo entire check is doable with no forks)
+# /proc actually works or not. We do this by comparing two reads of
+# /proc/self/environ for which we have set the variable VAR to two
+# different values. If the comparison comes back equal, we know that
+# /proc is not working.
mountproc=true
-f=/proc/self/stat
+f=/proc/self/environ
if [ -e $f ]; then
- exec 9<$f ; read a <&9 ; exec 9<&-
- exec 9<$f ; read b <&9 ; exec 9<&-
- if [ "$a" = "$b" ]; then
+ if [ "$(VAR=a cat $f)" = "$(VAR=b cat $f)" ]; then
eerror "You have cruft in /proc that should be deleted"
else
einfo "/proc is already mounted, skipping"
mountproc=false
fi
fi
-unset a b f
+unset f
if $mountproc; then
procfs="proc"