summaryrefslogtreecommitdiff
blob: 3bd1d95ae42d479bb9f371a02988036ae26bd1e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
From 051c73a9a7ffe9e525f6f0a1b8f5198ff8cc6752 Mon Sep 17 00:00:00 2001
From: Dominic Cleal <dcleal@redhat.com>
Date: Sat, 11 Aug 2012 20:39:14 +0100
Subject: [PATCH] Fix regression in permissions of created files

Commit 16387744 changed temporary file creation to use mkstemp, resulting in
new files being created with 0600 permissions.  For brand new files created
through Augeas, their permissions stayed at 0600 rather than being set by the
umask as before.

  * src/transform.c (transform_save): chmod after creating new files to
    permissions implied by the umask
---
 src/transform.c        | 10 ++++++++++
 tests/test-preserve.sh | 15 ++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/transform.c b/src/transform.c
index a3acd10..1ca3d5f 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -1096,6 +1096,16 @@ int transform_save(struct augeas *aug, struct tree *xfm,
             err_status = "xfer_attrs";
             goto done;
         }
+    } else {
+        /* Since mkstemp is used, the temp file will have secure permissions
+         * instead of those implied by umask, so change them for new files */
+        mode_t curumsk = umask(022);
+        umask(curumsk);
+
+        if (fchmod(fileno(fp), 0666 - curumsk) < 0) {
+            err_status = "create_chmod";
+            return -1;
+        }
     }
 
     if (tree != NULL)
diff --git a/tests/test-preserve.sh b/tests/test-preserve.sh
index 042dab9..9719ac6 100755
--- a/tests/test-preserve.sh
+++ b/tests/test-preserve.sh
@@ -59,9 +59,12 @@ if [ $selinux = yes -a xetc_t != "x$act_con" ] ; then
     exit 1
 fi
 
-# Check that we create new files without error
+# Check that we create new files without error and with permissions implied
+# from the umask
 init_dirs
 
+oldumask=$(umask)
+umask 0002
 $AUGTOOL > /dev/null <<EOF
 set /files/etc/hosts/1/ipaddr 127.0.0.1
 set /files/etc/hosts/1/canonical host.example.com
@@ -71,6 +74,16 @@ if [ $? != 0 ] ; then
     echo "augtool failed on new file"
     exit 1
 fi
+if [ ! -e $hosts ]; then
+    echo "augtool didn't create new /etc/hosts file"
+    exit 1
+fi
+act_mode=$(ls -l $hosts | cut -b 1-10)
+if [ x-rw-rw-r-- != "x$act_mode" ] ; then
+    echo "Expected mode 0664 due to $(umask) umask but got $act_mode"
+    exit 1
+fi
+umask $oldumask
 
 # Check that we create new files without error when backups are requested
 init_dirs
-- 
1.8.5.1