Imported Upstream version 1.9.0
[platform/upstream/augeas.git] / tests / test-put-mount-augsave.sh
1 #!/bin/sh
2
3 # Test that we don't follow bind mounts when writing to .augsave.
4 # This requires that EXDEV or EBUSY is returned from rename(2) to activate the
5 # code path, so set up a bind mount on Linux.
6
7 if [ "$UID" != 0 -o "$(uname -s)" != "Linux" ]; then
8     echo "Test can only be run as root on Linux to create bind mounts"
9     exit 77
10 fi
11
12 actual() {
13     (augtool --nostdinc -I $LENSES -r $ROOT --backup | grep ^/augeas) <<EOF
14     set /augeas/save/copy_if_rename_fails 1
15     set /files/etc/hosts/1/alias myhost
16     save
17     print /augeas//error
18 EOF
19 }
20
21 expected() {
22     cat <<EOF
23 /augeas/files/etc/hosts/error = "clone_unlink_dst_augsave"
24 /augeas/files/etc/hosts/error/message = "Device or resource busy"
25 EOF
26 }
27
28 ROOT=$abs_top_builddir/build/test-put-mount-augsave
29 LENSES=$abs_top_srcdir/lenses
30
31 HOSTS=$ROOT/etc/hosts
32 HOSTS_AUGSAVE=${HOSTS}.augsave
33
34 ATTACK_FILE=$ROOT/other/attack
35
36 rm -rf $ROOT
37 mkdir -p $(dirname $HOSTS)
38 mkdir -p $(dirname $ATTACK_FILE)
39
40 echo 127.0.0.1 localhost > $HOSTS
41 touch $ATTACK_FILE $HOSTS_AUGSAVE
42
43 mount --bind $ATTACK_FILE $HOSTS_AUGSAVE
44 Exit() {
45     umount $HOSTS_AUGSAVE
46     exit $1
47 }
48
49 ACTUAL=$(actual)
50 EXPECTED=$(expected)
51 if [ "$ACTUAL" != "$EXPECTED" ]; then
52     echo "No error when trying to unlink augsave (a bind mount):"
53     echo "$ACTUAL"
54     exit 1
55 fi
56
57 if [ -s $ATTACK_FILE ]; then
58     echo "/other/attack now contains data, should be blank"
59     Exit 1
60 fi
61
62 Exit 0