|
@@ -3049,7 +3049,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
|
|
|
{
|
|
|
int error;
|
|
|
struct path pwd, root;
|
|
|
- char *page = (char *) __get_free_page(GFP_USER);
|
|
|
+ char *page = __getname();
|
|
|
|
|
|
if (!page)
|
|
|
return -ENOMEM;
|
|
@@ -3061,8 +3061,8 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
|
|
|
br_read_lock(&vfsmount_lock);
|
|
|
if (!d_unlinked(pwd.dentry)) {
|
|
|
unsigned long len;
|
|
|
- char *cwd = page + PAGE_SIZE;
|
|
|
- int buflen = PAGE_SIZE;
|
|
|
+ char *cwd = page + PATH_MAX;
|
|
|
+ int buflen = PATH_MAX;
|
|
|
|
|
|
prepend(&cwd, &buflen, "\0", 1);
|
|
|
error = prepend_path(&pwd, &root, &cwd, &buflen);
|
|
@@ -3080,7 +3080,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
|
|
|
}
|
|
|
|
|
|
error = -ERANGE;
|
|
|
- len = PAGE_SIZE + page - cwd;
|
|
|
+ len = PATH_MAX + page - cwd;
|
|
|
if (len <= size) {
|
|
|
error = len;
|
|
|
if (copy_to_user(buf, cwd, len))
|
|
@@ -3092,7 +3092,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- free_page((unsigned long) page);
|
|
|
+ __putname(page);
|
|
|
return error;
|
|
|
}
|
|
|
|