Commit e4b27553 authored by Al Viro's avatar Al Viro

getcwd(2): clean up error handling

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent cf4febc1
...@@ -390,9 +390,11 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size) ...@@ -390,9 +390,11 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
rcu_read_lock(); rcu_read_lock();
get_fs_root_and_pwd_rcu(current->fs, &root, &pwd); get_fs_root_and_pwd_rcu(current->fs, &root, &pwd);
if (unlikely(d_unlinked(pwd.dentry))) {
rcu_read_unlock();
error = -ENOENT; error = -ENOENT;
if (!d_unlinked(pwd.dentry)) { } else {
unsigned long len; unsigned len;
DECLARE_BUFFER(b, page, PATH_MAX); DECLARE_BUFFER(b, page, PATH_MAX);
prepend(&b, "", 1); prepend(&b, "", 1);
...@@ -400,23 +402,16 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size) ...@@ -400,23 +402,16 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
prepend(&b, "(unreachable)", 13); prepend(&b, "(unreachable)", 13);
rcu_read_unlock(); rcu_read_unlock();
if (b.len < 0) { len = PATH_MAX - b.len;
if (unlikely(len > PATH_MAX))
error = -ENAMETOOLONG; error = -ENAMETOOLONG;
goto out; else if (unlikely(len > size))
}
error = -ERANGE; error = -ERANGE;
len = PATH_MAX - b.len; else if (copy_to_user(buf, b.buf, len))
if (len <= size) {
error = len;
if (copy_to_user(buf, b.buf, len))
error = -EFAULT; error = -EFAULT;
else
error = len;
} }
} else {
rcu_read_unlock();
}
out:
__putname(page); __putname(page);
return error; return error;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment