.. | .. |
---|
| 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) |
---|