diff options
Diffstat (limited to 'drivers/net/ppp/ppp_generic.c')
-rw-r--r-- | drivers/net/ppp/ppp_generic.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 91d6c1272fcf..d5b77ef3a210 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c | |||
@@ -539,7 +539,7 @@ static int get_filter(void __user *arg, struct sock_filter **p) | |||
539 | { | 539 | { |
540 | struct sock_fprog uprog; | 540 | struct sock_fprog uprog; |
541 | struct sock_filter *code = NULL; | 541 | struct sock_filter *code = NULL; |
542 | int len, err; | 542 | int len; |
543 | 543 | ||
544 | if (copy_from_user(&uprog, arg, sizeof(uprog))) | 544 | if (copy_from_user(&uprog, arg, sizeof(uprog))) |
545 | return -EFAULT; | 545 | return -EFAULT; |
@@ -554,12 +554,6 @@ static int get_filter(void __user *arg, struct sock_filter **p) | |||
554 | if (IS_ERR(code)) | 554 | if (IS_ERR(code)) |
555 | return PTR_ERR(code); | 555 | return PTR_ERR(code); |
556 | 556 | ||
557 | err = sk_chk_filter(code, uprog.len); | ||
558 | if (err) { | ||
559 | kfree(code); | ||
560 | return err; | ||
561 | } | ||
562 | |||
563 | *p = code; | 557 | *p = code; |
564 | return uprog.len; | 558 | return uprog.len; |
565 | } | 559 | } |
@@ -763,10 +757,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
763 | }; | 757 | }; |
764 | 758 | ||
765 | ppp_lock(ppp); | 759 | ppp_lock(ppp); |
766 | if (ppp->pass_filter) | 760 | if (ppp->pass_filter) { |
767 | sk_unattached_filter_destroy(ppp->pass_filter); | 761 | sk_unattached_filter_destroy(ppp->pass_filter); |
768 | err = sk_unattached_filter_create(&ppp->pass_filter, | 762 | ppp->pass_filter = NULL; |
769 | &fprog); | 763 | } |
764 | if (fprog.filter != NULL) | ||
765 | err = sk_unattached_filter_create(&ppp->pass_filter, | ||
766 | &fprog); | ||
767 | else | ||
768 | err = 0; | ||
770 | kfree(code); | 769 | kfree(code); |
771 | ppp_unlock(ppp); | 770 | ppp_unlock(ppp); |
772 | } | 771 | } |
@@ -784,10 +783,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
784 | }; | 783 | }; |
785 | 784 | ||
786 | ppp_lock(ppp); | 785 | ppp_lock(ppp); |
787 | if (ppp->active_filter) | 786 | if (ppp->active_filter) { |
788 | sk_unattached_filter_destroy(ppp->active_filter); | 787 | sk_unattached_filter_destroy(ppp->active_filter); |
789 | err = sk_unattached_filter_create(&ppp->active_filter, | 788 | ppp->active_filter = NULL; |
790 | &fprog); | 789 | } |
790 | if (fprog.filter != NULL) | ||
791 | err = sk_unattached_filter_create(&ppp->active_filter, | ||
792 | &fprog); | ||
793 | else | ||
794 | err = 0; | ||
791 | kfree(code); | 795 | kfree(code); |
792 | ppp_unlock(ppp); | 796 | ppp_unlock(ppp); |
793 | } | 797 | } |