| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* net/atm/common.c - ATM sockets (common part for PVC and SVC) */ |
|---|
| 2 | 3 | |
|---|
| 3 | 4 | /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ |
|---|
| .. | .. |
|---|
| 176 | 177 | |
|---|
| 177 | 178 | set_bit(ATM_VF_CLOSE, &vcc->flags); |
|---|
| 178 | 179 | clear_bit(ATM_VF_READY, &vcc->flags); |
|---|
| 179 | | - if (vcc->dev) { |
|---|
| 180 | | - if (vcc->dev->ops->close) |
|---|
| 181 | | - vcc->dev->ops->close(vcc); |
|---|
| 182 | | - if (vcc->push) |
|---|
| 183 | | - vcc->push(vcc, NULL); /* atmarpd has no push */ |
|---|
| 184 | | - module_put(vcc->owner); |
|---|
| 180 | + if (vcc->dev && vcc->dev->ops->close) |
|---|
| 181 | + vcc->dev->ops->close(vcc); |
|---|
| 182 | + if (vcc->push) |
|---|
| 183 | + vcc->push(vcc, NULL); /* atmarpd has no push */ |
|---|
| 184 | + module_put(vcc->owner); |
|---|
| 185 | 185 | |
|---|
| 186 | | - while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { |
|---|
| 187 | | - atm_return(vcc, skb->truesize); |
|---|
| 188 | | - kfree_skb(skb); |
|---|
| 189 | | - } |
|---|
| 186 | + while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { |
|---|
| 187 | + atm_return(vcc, skb->truesize); |
|---|
| 188 | + kfree_skb(skb); |
|---|
| 189 | + } |
|---|
| 190 | 190 | |
|---|
| 191 | + if (vcc->dev && vcc->dev->ops->owner) { |
|---|
| 191 | 192 | module_put(vcc->dev->ops->owner); |
|---|
| 192 | 193 | atm_dev_put(vcc->dev); |
|---|
| 193 | 194 | } |
|---|
| .. | .. |
|---|
| 296 | 297 | break; |
|---|
| 297 | 298 | default: |
|---|
| 298 | 299 | pr_warn("AAL problems ... (%d)\n", aal); |
|---|
| 299 | | - /* fall through */ |
|---|
| 300 | + fallthrough; |
|---|
| 300 | 301 | case ATM_AAL5: |
|---|
| 301 | 302 | max_sdu = ATM_MAX_AAL5_PDU; |
|---|
| 302 | 303 | } |
|---|
| .. | .. |
|---|
| 416 | 417 | case ATM_NO_AAL: |
|---|
| 417 | 418 | /* ATM_AAL5 is also used in the "0 for default" case */ |
|---|
| 418 | 419 | vcc->qos.aal = ATM_AAL5; |
|---|
| 419 | | - /* fall through */ |
|---|
| 420 | + fallthrough; |
|---|
| 420 | 421 | case ATM_AAL5: |
|---|
| 421 | 422 | error = atm_init_aal5(vcc); |
|---|
| 422 | 423 | vcc->stats = &dev->stats.aal5; |
|---|
| .. | .. |
|---|
| 744 | 745 | } |
|---|
| 745 | 746 | |
|---|
| 746 | 747 | int vcc_setsockopt(struct socket *sock, int level, int optname, |
|---|
| 747 | | - char __user *optval, unsigned int optlen) |
|---|
| 748 | + sockptr_t optval, unsigned int optlen) |
|---|
| 748 | 749 | { |
|---|
| 749 | 750 | struct atm_vcc *vcc; |
|---|
| 750 | 751 | unsigned long value; |
|---|
| .. | .. |
|---|
| 759 | 760 | { |
|---|
| 760 | 761 | struct atm_qos qos; |
|---|
| 761 | 762 | |
|---|
| 762 | | - if (copy_from_user(&qos, optval, sizeof(qos))) |
|---|
| 763 | + if (copy_from_sockptr(&qos, optval, sizeof(qos))) |
|---|
| 763 | 764 | return -EFAULT; |
|---|
| 764 | 765 | error = check_qos(&qos); |
|---|
| 765 | 766 | if (error) |
|---|
| .. | .. |
|---|
| 773 | 774 | return 0; |
|---|
| 774 | 775 | } |
|---|
| 775 | 776 | case SO_SETCLP: |
|---|
| 776 | | - if (get_user(value, (unsigned long __user *)optval)) |
|---|
| 777 | + if (copy_from_sockptr(&value, optval, sizeof(value))) |
|---|
| 777 | 778 | return -EFAULT; |
|---|
| 778 | 779 | if (value) |
|---|
| 779 | 780 | vcc->atm_options |= ATM_ATMOPT_CLP; |
|---|
| .. | .. |
|---|
| 781 | 782 | vcc->atm_options &= ~ATM_ATMOPT_CLP; |
|---|
| 782 | 783 | return 0; |
|---|
| 783 | 784 | default: |
|---|
| 784 | | - if (level == SOL_SOCKET) |
|---|
| 785 | | - return -EINVAL; |
|---|
| 786 | | - break; |
|---|
| 787 | | - } |
|---|
| 788 | | - if (!vcc->dev || !vcc->dev->ops->setsockopt) |
|---|
| 789 | 785 | return -EINVAL; |
|---|
| 790 | | - return vcc->dev->ops->setsockopt(vcc, level, optname, optval, optlen); |
|---|
| 786 | + } |
|---|
| 791 | 787 | } |
|---|
| 792 | 788 | |
|---|
| 793 | 789 | int vcc_getsockopt(struct socket *sock, int level, int optname, |
|---|
| .. | .. |
|---|
| 825 | 821 | return copy_to_user(optval, &pvc, sizeof(pvc)) ? -EFAULT : 0; |
|---|
| 826 | 822 | } |
|---|
| 827 | 823 | default: |
|---|
| 828 | | - if (level == SOL_SOCKET) |
|---|
| 829 | | - return -EINVAL; |
|---|
| 830 | | - break; |
|---|
| 831 | | - } |
|---|
| 832 | | - if (!vcc->dev || !vcc->dev->ops->getsockopt) |
|---|
| 833 | 824 | return -EINVAL; |
|---|
| 834 | | - return vcc->dev->ops->getsockopt(vcc, level, optname, optval, len); |
|---|
| 825 | + } |
|---|
| 835 | 826 | } |
|---|
| 836 | 827 | |
|---|
| 837 | 828 | int register_atmdevice_notifier(struct notifier_block *nb) |
|---|