diff options
-rw-r--r-- | fs/binfmt_misc.c | 20 |
1 files changed, 3 insertions, 17 deletions
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index 7191306367c5..756205314c24 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/namei.h> | 27 | #include <linux/namei.h> |
28 | #include <linux/mount.h> | 28 | #include <linux/mount.h> |
29 | #include <linux/syscalls.h> | 29 | #include <linux/syscalls.h> |
30 | #include <linux/fs.h> | ||
30 | 31 | ||
31 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
32 | 33 | ||
@@ -535,31 +536,16 @@ static ssize_t | |||
535 | bm_entry_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) | 536 | bm_entry_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) |
536 | { | 537 | { |
537 | Node *e = file->f_path.dentry->d_inode->i_private; | 538 | Node *e = file->f_path.dentry->d_inode->i_private; |
538 | loff_t pos = *ppos; | ||
539 | ssize_t res; | 539 | ssize_t res; |
540 | char *page; | 540 | char *page; |
541 | int len; | ||
542 | 541 | ||
543 | if (!(page = (char*) __get_free_page(GFP_KERNEL))) | 542 | if (!(page = (char*) __get_free_page(GFP_KERNEL))) |
544 | return -ENOMEM; | 543 | return -ENOMEM; |
545 | 544 | ||
546 | entry_status(e, page); | 545 | entry_status(e, page); |
547 | len = strlen(page); | ||
548 | 546 | ||
549 | res = -EINVAL; | 547 | res = simple_read_from_buffer(buf, nbytes, ppos, page, strlen(page)); |
550 | if (pos < 0) | 548 | |
551 | goto out; | ||
552 | res = 0; | ||
553 | if (pos >= len) | ||
554 | goto out; | ||
555 | if (len < pos + nbytes) | ||
556 | nbytes = len - pos; | ||
557 | res = -EFAULT; | ||
558 | if (copy_to_user(buf, page + pos, nbytes)) | ||
559 | goto out; | ||
560 | *ppos = pos + nbytes; | ||
561 | res = nbytes; | ||
562 | out: | ||
563 | free_page((unsigned long) page); | 549 | free_page((unsigned long) page); |
564 | return res; | 550 | return res; |
565 | } | 551 | } |