diff options
| author | James Morris <jmorris@namei.org> | 2006-03-22 03:09:20 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-22 10:54:07 -0500 |
| commit | edb20fb5be2ff6943920aca4ccab0f4fdacddb9c (patch) | |
| tree | 6961017d5b02a6320b85826c33ccc81017c2e58f | |
| parent | d6aafa65354cd2dbb089ab9e7dc618f22230fe32 (diff) | |
[PATCH] SELinux: fix hard link count for selinuxfs root directory
A further fix is needed for selinuxfs link count management, to ensure that
the count is correct for the parent directory when a subdirectory is
created. This is only required for the root directory currently, but the
code has been updated for the general case.
Signed-off-by: James Morris <jmorris@namei.org>
Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | security/selinux/selinuxfs.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index f321c0c49f46..f5d78365488f 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
| @@ -1166,12 +1166,12 @@ out: | |||
| 1166 | return ret; | 1166 | return ret; |
| 1167 | } | 1167 | } |
| 1168 | 1168 | ||
| 1169 | static int sel_make_dir(struct super_block *sb, struct dentry *dentry) | 1169 | static int sel_make_dir(struct inode *dir, struct dentry *dentry) |
| 1170 | { | 1170 | { |
| 1171 | int ret = 0; | 1171 | int ret = 0; |
| 1172 | struct inode *inode; | 1172 | struct inode *inode; |
| 1173 | 1173 | ||
| 1174 | inode = sel_make_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); | 1174 | inode = sel_make_inode(dir->i_sb, S_IFDIR | S_IRUGO | S_IXUGO); |
| 1175 | if (!inode) { | 1175 | if (!inode) { |
| 1176 | ret = -ENOMEM; | 1176 | ret = -ENOMEM; |
| 1177 | goto out; | 1177 | goto out; |
| @@ -1181,6 +1181,8 @@ static int sel_make_dir(struct super_block *sb, struct dentry *dentry) | |||
| 1181 | /* directory inodes start off with i_nlink == 2 (for "." entry) */ | 1181 | /* directory inodes start off with i_nlink == 2 (for "." entry) */ |
| 1182 | inode->i_nlink++; | 1182 | inode->i_nlink++; |
| 1183 | d_add(dentry, inode); | 1183 | d_add(dentry, inode); |
| 1184 | /* bump link count on parent directory, too */ | ||
| 1185 | dir->i_nlink++; | ||
| 1184 | out: | 1186 | out: |
| 1185 | return ret; | 1187 | return ret; |
| 1186 | } | 1188 | } |
| @@ -1189,7 +1191,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) | |||
| 1189 | { | 1191 | { |
| 1190 | int ret; | 1192 | int ret; |
| 1191 | struct dentry *dentry; | 1193 | struct dentry *dentry; |
| 1192 | struct inode *inode; | 1194 | struct inode *inode, *root_inode; |
| 1193 | struct inode_security_struct *isec; | 1195 | struct inode_security_struct *isec; |
| 1194 | 1196 | ||
| 1195 | static struct tree_descr selinux_files[] = { | 1197 | static struct tree_descr selinux_files[] = { |
| @@ -1212,13 +1214,15 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) | |||
| 1212 | if (ret) | 1214 | if (ret) |
| 1213 | goto err; | 1215 | goto err; |
| 1214 | 1216 | ||
| 1217 | root_inode = sb->s_root->d_inode; | ||
| 1218 | |||
| 1215 | dentry = d_alloc_name(sb->s_root, BOOL_DIR_NAME); | 1219 | dentry = d_alloc_name(sb->s_root, BOOL_DIR_NAME); |
| 1216 | if (!dentry) { | 1220 | if (!dentry) { |
| 1217 | ret = -ENOMEM; | 1221 | ret = -ENOMEM; |
| 1218 | goto err; | 1222 | goto err; |
| 1219 | } | 1223 | } |
| 1220 | 1224 | ||
| 1221 | ret = sel_make_dir(sb, dentry); | 1225 | ret = sel_make_dir(root_inode, dentry); |
| 1222 | if (ret) | 1226 | if (ret) |
| 1223 | goto err; | 1227 | goto err; |
| 1224 | 1228 | ||
| @@ -1250,7 +1254,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) | |||
| 1250 | goto err; | 1254 | goto err; |
| 1251 | } | 1255 | } |
| 1252 | 1256 | ||
| 1253 | ret = sel_make_dir(sb, dentry); | 1257 | ret = sel_make_dir(root_inode, dentry); |
| 1254 | if (ret) | 1258 | if (ret) |
| 1255 | goto err; | 1259 | goto err; |
| 1256 | 1260 | ||
