aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sysctl_binary.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sysctl_binary.c')
-rw-r--r--kernel/sysctl_binary.c22
1 files changed, 2 insertions, 20 deletions
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 1357c5786064..3b8e028b9601 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -136,7 +136,6 @@ static const struct bin_table bin_kern_table[] = {
136 { CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" }, 136 { CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" },
137 { CTL_INT, KERN_COMPAT_LOG, "compat-log" }, 137 { CTL_INT, KERN_COMPAT_LOG, "compat-log" },
138 { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" }, 138 { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" },
139 { CTL_INT, KERN_NMI_WATCHDOG, "nmi_watchdog" },
140 { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" }, 139 { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
141 {} 140 {}
142}; 141};
@@ -1193,7 +1192,7 @@ static ssize_t bin_dn_node_address(struct file *file,
1193 1192
1194 buf[result] = '\0'; 1193 buf[result] = '\0';
1195 1194
1196 /* Convert the decnet addresss to binary */ 1195 /* Convert the decnet address to binary */
1197 result = -EIO; 1196 result = -EIO;
1198 nodep = strchr(buf, '.') + 1; 1197 nodep = strchr(buf, '.') + 1;
1199 if (!nodep) 1198 if (!nodep)
@@ -1322,13 +1321,11 @@ static ssize_t binary_sysctl(const int *name, int nlen,
1322 void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) 1321 void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
1323{ 1322{
1324 const struct bin_table *table = NULL; 1323 const struct bin_table *table = NULL;
1325 struct nameidata nd;
1326 struct vfsmount *mnt; 1324 struct vfsmount *mnt;
1327 struct file *file; 1325 struct file *file;
1328 ssize_t result; 1326 ssize_t result;
1329 char *pathname; 1327 char *pathname;
1330 int flags; 1328 int flags;
1331 int acc_mode;
1332 1329
1333 pathname = sysctl_getname(name, nlen, &table); 1330 pathname = sysctl_getname(name, nlen, &table);
1334 result = PTR_ERR(pathname); 1331 result = PTR_ERR(pathname);
@@ -1338,28 +1335,17 @@ static ssize_t binary_sysctl(const int *name, int nlen,
1338 /* How should the sysctl be accessed? */ 1335 /* How should the sysctl be accessed? */
1339 if (oldval && oldlen && newval && newlen) { 1336 if (oldval && oldlen && newval && newlen) {
1340 flags = O_RDWR; 1337 flags = O_RDWR;
1341 acc_mode = MAY_READ | MAY_WRITE;
1342 } else if (newval && newlen) { 1338 } else if (newval && newlen) {
1343 flags = O_WRONLY; 1339 flags = O_WRONLY;
1344 acc_mode = MAY_WRITE;
1345 } else if (oldval && oldlen) { 1340 } else if (oldval && oldlen) {
1346 flags = O_RDONLY; 1341 flags = O_RDONLY;
1347 acc_mode = MAY_READ;
1348 } else { 1342 } else {
1349 result = 0; 1343 result = 0;
1350 goto out_putname; 1344 goto out_putname;
1351 } 1345 }
1352 1346
1353 mnt = current->nsproxy->pid_ns->proc_mnt; 1347 mnt = current->nsproxy->pid_ns->proc_mnt;
1354 result = vfs_path_lookup(mnt->mnt_root, mnt, pathname, 0, &nd); 1348 file = file_open_root(mnt->mnt_root, mnt, pathname, flags);
1355 if (result)
1356 goto out_putname;
1357
1358 result = may_open(&nd.path, acc_mode, flags);
1359 if (result)
1360 goto out_putpath;
1361
1362 file = dentry_open(nd.path.dentry, nd.path.mnt, flags, current_cred());
1363 result = PTR_ERR(file); 1349 result = PTR_ERR(file);
1364 if (IS_ERR(file)) 1350 if (IS_ERR(file))
1365 goto out_putname; 1351 goto out_putname;
@@ -1371,10 +1357,6 @@ out_putname:
1371 putname(pathname); 1357 putname(pathname);
1372out: 1358out:
1373 return result; 1359 return result;
1374
1375out_putpath:
1376 path_put(&nd.path);
1377 goto out_putname;
1378} 1360}
1379 1361
1380 1362