Commit e4b27553 authored by Al Viro's avatar Al Viro
Browse files

getcwd(2): clean up error handling



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent cf4febc1
Loading
Loading
Loading
Loading
+12 −17
Original line number Diff line number Diff line
@@ -390,9 +390,11 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
	rcu_read_lock();
	get_fs_root_and_pwd_rcu(current->fs, &root, &pwd);

	if (unlikely(d_unlinked(pwd.dentry))) {
		rcu_read_unlock();
		error = -ENOENT;
	if (!d_unlinked(pwd.dentry)) {
		unsigned long len;
	} else {
		unsigned len;
		DECLARE_BUFFER(b, page, PATH_MAX);

		prepend(&b, "", 1);
@@ -400,23 +402,16 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
			prepend(&b, "(unreachable)", 13);
		rcu_read_unlock();

		if (b.len < 0) {
		len = PATH_MAX - b.len;
		if (unlikely(len > PATH_MAX))
			error = -ENAMETOOLONG;
			goto out;
		}

		else if (unlikely(len > size))
			error = -ERANGE;
		len = PATH_MAX - b.len;
		if (len <= size) {
			error = len;
			if (copy_to_user(buf, b.buf, len))
		else if (copy_to_user(buf, b.buf, len))
			error = -EFAULT;
		else
			error = len;
	}
	} else {
		rcu_read_unlock();
	}

out:
	__putname(page);
	return error;
}