summaryrefslogtreecommitdiff
blob: d90b8d1815d439349686c32ec43331f3cd5e0cd1 (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
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/07/02 18:48:26-07:00 chrisw@osdl.org 
#   [PATCH] check attr updates in /proc
#   
#   Any proc entry with default proc_file_inode_operations allow unauthorized
#   attribute updates.  This is very dangerous for proc entries that rely
#   solely on file permissions for open/read/write.
#   
#   Signed-off-by: Chris Wright <chrisw@osdl.org>
#   Signed-off-by: Linus Torvalds <torvalds@osdl.org>
# 
# fs/proc/generic.c
#   2004/07/02 15:47:55-07:00 chrisw@osdl.org +14 -7
#   check attr updates in /proc
# 
diff -Nru a/fs/proc/generic.c b/fs/proc/generic.c
--- a/fs/proc/generic.c	2004-07-08 17:03:20 -07:00
+++ b/fs/proc/generic.c	2004-07-08 17:03:20 -07:00
@@ -231,14 +231,21 @@
 static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
 {
 	struct inode *inode = dentry->d_inode;
-	int error = inode_setattr(inode, iattr);
-	if (!error) {
-		struct proc_dir_entry *de = PDE(inode);
-		de->uid = inode->i_uid;
-		de->gid = inode->i_gid;
-		de->mode = inode->i_mode;
-	}
+	struct proc_dir_entry *de = PDE(inode);
+	int error;
 
+	error = inode_change_ok(inode, iattr);
+	if (error)
+		goto out;
+
+	error = inode_setattr(inode, iattr);
+	if (error)
+		goto out;
+	
+	de->uid = inode->i_uid;
+	de->gid = inode->i_gid;
+	de->mode = inode->i_mode;
+out:
 	return error;
 }