diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-26 17:02:54 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-26 17:02:54 -0400 |
commit | e5f699d443192001613df21f123c5c3483e55888 (patch) | |
tree | 4d4e8211ddf0c82c8bf124343715d1817ac6ebf6 | |
parent | 8b9e04f282c76786fad1a031b38e279bfababd9c (diff) |
ipmi: get rid of field-by-field __get_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | drivers/char/ipmi/ipmi_devintf.c | 87 |
1 files changed, 37 insertions, 50 deletions
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c index 7007beba918b..2ffca4232686 100644 --- a/drivers/char/ipmi/ipmi_devintf.c +++ b/drivers/char/ipmi/ipmi_devintf.c | |||
@@ -704,62 +704,41 @@ struct compat_ipmi_req_settime { | |||
704 | /* | 704 | /* |
705 | * Define some helper functions for copying IPMI data | 705 | * Define some helper functions for copying IPMI data |
706 | */ | 706 | */ |
707 | static long get_compat_ipmi_msg(struct ipmi_msg *p64, | 707 | static void get_compat_ipmi_msg(struct ipmi_msg *p64, |
708 | struct compat_ipmi_msg __user *p32) | 708 | struct compat_ipmi_msg *p32) |
709 | { | 709 | { |
710 | compat_uptr_t tmp; | 710 | p64->netfn = p32->netfn; |
711 | 711 | p64->cmd = p32->cmd; | |
712 | if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || | 712 | p64->data_len = p32->data_len; |
713 | __get_user(p64->netfn, &p32->netfn) || | 713 | p64->data = compat_ptr(p32->data); |
714 | __get_user(p64->cmd, &p32->cmd) || | ||
715 | __get_user(p64->data_len, &p32->data_len) || | ||
716 | __get_user(tmp, &p32->data)) | ||
717 | return -EFAULT; | ||
718 | p64->data = compat_ptr(tmp); | ||
719 | return 0; | ||
720 | } | 714 | } |
721 | 715 | ||
722 | static long get_compat_ipmi_req(struct ipmi_req *p64, | 716 | static void get_compat_ipmi_req(struct ipmi_req *p64, |
723 | struct compat_ipmi_req __user *p32) | 717 | struct compat_ipmi_req *p32) |
724 | { | 718 | { |
725 | 719 | p64->addr = compat_ptr(p32->addr); | |
726 | compat_uptr_t tmp; | 720 | p64->addr_len = p32->addr_len; |
727 | 721 | p64->msgid = p32->msgid; | |
728 | if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || | 722 | get_compat_ipmi_msg(&p64->msg, &p32->msg); |
729 | __get_user(tmp, &p32->addr) || | ||
730 | __get_user(p64->addr_len, &p32->addr_len) || | ||
731 | __get_user(p64->msgid, &p32->msgid) || | ||
732 | get_compat_ipmi_msg(&p64->msg, &p32->msg)) | ||
733 | return -EFAULT; | ||
734 | p64->addr = compat_ptr(tmp); | ||
735 | return 0; | ||
736 | } | 723 | } |
737 | 724 | ||
738 | static long get_compat_ipmi_req_settime(struct ipmi_req_settime *p64, | 725 | static void get_compat_ipmi_req_settime(struct ipmi_req_settime *p64, |
739 | struct compat_ipmi_req_settime __user *p32) | 726 | struct compat_ipmi_req_settime *p32) |
740 | { | 727 | { |
741 | if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || | 728 | get_compat_ipmi_req(&p64->req, &p32->req); |
742 | get_compat_ipmi_req(&p64->req, &p32->req) || | 729 | p64->retries = p32->retries; |
743 | __get_user(p64->retries, &p32->retries) || | 730 | p64->retry_time_ms = p32->retry_time_ms; |
744 | __get_user(p64->retry_time_ms, &p32->retry_time_ms)) | ||
745 | return -EFAULT; | ||
746 | return 0; | ||
747 | } | 731 | } |
748 | 732 | ||
749 | static long get_compat_ipmi_recv(struct ipmi_recv *p64, | 733 | static void get_compat_ipmi_recv(struct ipmi_recv *p64, |
750 | struct compat_ipmi_recv __user *p32) | 734 | struct compat_ipmi_recv *p32) |
751 | { | 735 | { |
752 | compat_uptr_t tmp; | 736 | memset(p64, 0, sizeof(struct ipmi_recv)); |
753 | 737 | p64->recv_type = p32->recv_type; | |
754 | if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || | 738 | p64->addr = compat_ptr(p32->addr); |
755 | __get_user(p64->recv_type, &p32->recv_type) || | 739 | p64->addr_len = p32->addr_len; |
756 | __get_user(tmp, &p32->addr) || | 740 | p64->msgid = p32->msgid; |
757 | __get_user(p64->addr_len, &p32->addr_len) || | 741 | get_compat_ipmi_msg(&p64->msg, &p32->msg); |
758 | __get_user(p64->msgid, &p32->msgid) || | ||
759 | get_compat_ipmi_msg(&p64->msg, &p32->msg)) | ||
760 | return -EFAULT; | ||
761 | p64->addr = compat_ptr(tmp); | ||
762 | return 0; | ||
763 | } | 742 | } |
764 | 743 | ||
765 | static int copyout_recv32(struct ipmi_recv *p64, void __user *to) | 744 | static int copyout_recv32(struct ipmi_recv *p64, void __user *to) |
@@ -789,10 +768,13 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, | |||
789 | case COMPAT_IPMICTL_SEND_COMMAND: | 768 | case COMPAT_IPMICTL_SEND_COMMAND: |
790 | { | 769 | { |
791 | struct ipmi_req rp; | 770 | struct ipmi_req rp; |
771 | struct compat_ipmi_req r32; | ||
792 | 772 | ||
793 | if (get_compat_ipmi_req(&rp, compat_ptr(arg))) | 773 | if (copy_from_user(&r32, compat_ptr(arg), sizeof(r32))) |
794 | return -EFAULT; | 774 | return -EFAULT; |
795 | 775 | ||
776 | get_compat_ipmi_req(&rp, &r32); | ||
777 | |||
796 | return handle_send_req(priv->user, &rp, | 778 | return handle_send_req(priv->user, &rp, |
797 | priv->default_retries, | 779 | priv->default_retries, |
798 | priv->default_retry_time_ms); | 780 | priv->default_retry_time_ms); |
@@ -800,10 +782,13 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, | |||
800 | case COMPAT_IPMICTL_SEND_COMMAND_SETTIME: | 782 | case COMPAT_IPMICTL_SEND_COMMAND_SETTIME: |
801 | { | 783 | { |
802 | struct ipmi_req_settime sp; | 784 | struct ipmi_req_settime sp; |
785 | struct compat_ipmi_req_settime sp32; | ||
803 | 786 | ||
804 | if (get_compat_ipmi_req_settime(&sp, compat_ptr(arg))) | 787 | if (copy_from_user(&sp32, compat_ptr(arg), sizeof(sp32))) |
805 | return -EFAULT; | 788 | return -EFAULT; |
806 | 789 | ||
790 | get_compat_ipmi_req_settime(&sp, &sp32); | ||
791 | |||
807 | return handle_send_req(priv->user, &sp.req, | 792 | return handle_send_req(priv->user, &sp.req, |
808 | sp.retries, sp.retry_time_ms); | 793 | sp.retries, sp.retry_time_ms); |
809 | } | 794 | } |
@@ -811,11 +796,13 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, | |||
811 | case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: | 796 | case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: |
812 | { | 797 | { |
813 | struct ipmi_recv recv64; | 798 | struct ipmi_recv recv64; |
799 | struct compat_ipmi_recv recv32; | ||
814 | 800 | ||
815 | memset(&recv64, 0, sizeof(recv64)); | 801 | if (copy_from_user(&recv32, compat_ptr(arg), sizeof(recv32))) |
816 | if (get_compat_ipmi_recv(&recv64, compat_ptr(arg))) | ||
817 | return -EFAULT; | 802 | return -EFAULT; |
818 | 803 | ||
804 | get_compat_ipmi_recv(&recv64, &recv32); | ||
805 | |||
819 | return handle_recv(priv, | 806 | return handle_recv(priv, |
820 | cmd == COMPAT_IPMICTL_RECEIVE_MSG_TRUNC, | 807 | cmd == COMPAT_IPMICTL_RECEIVE_MSG_TRUNC, |
821 | &recv64, copyout_recv32, compat_ptr(arg)); | 808 | &recv64, copyout_recv32, compat_ptr(arg)); |