Lines Matching +full:button +full:- +full:uid
1 // SPDX-License-Identifier: GPL-2.0-or-later
36 #include <linux/bpf-cgroup.h>
80 return &table->hash[ping_hashfn(net, num, PING_HTABLE_MASK)]; in ping_hashslot()
104 if (isk2->inet_num == result) in ping_get_port()
125 if ((isk2->inet_num == ident) && in ping_get_port()
127 (!sk2->sk_reuse || !sk->sk_reuse)) in ping_get_port()
133 isk->inet_num = ident; in ping_get_port()
138 hlist_nulls_add_head_rcu(&sk->sk_nulls_node, hlist); in ping_get_port()
139 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in ping_get_port()
152 pr_debug("ping_hash(sk->port=%u)\n", inet_sk(sk)->inet_num); in ping_hash()
153 BUG(); /* "Please do not press this button again." */ in ping_hash()
162 pr_debug("ping_unhash(isk=%p,isk->num=%u)\n", isk, isk->inet_num); in ping_unhash()
165 hlist_nulls_del_init_rcu(&sk->sk_nulls_node); in ping_unhash()
167 isk->inet_num = 0; in ping_unhash()
168 isk->inet_sport = 0; in ping_unhash()
169 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in ping_unhash()
184 if (skb->protocol == htons(ETH_P_IP)) { in ping_lookup()
188 (int)ident, &ip_hdr(skb)->daddr, dif); in ping_lookup()
190 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_lookup()
194 (int)ident, &ipv6_hdr(skb)->daddr, dif); in ping_lookup()
204 if (isk->inet_num != ident) in ping_lookup()
207 if (skb->protocol == htons(ETH_P_IP) && in ping_lookup()
208 sk->sk_family == AF_INET) { in ping_lookup()
210 (int) isk->inet_num, &isk->inet_rcv_saddr, in ping_lookup()
211 sk->sk_bound_dev_if); in ping_lookup()
213 if (isk->inet_rcv_saddr && in ping_lookup()
214 isk->inet_rcv_saddr != ip_hdr(skb)->daddr) in ping_lookup()
217 } else if (skb->protocol == htons(ETH_P_IPV6) && in ping_lookup()
218 sk->sk_family == AF_INET6) { in ping_lookup()
221 (int) isk->inet_num, in ping_lookup()
222 &sk->sk_v6_rcv_saddr, in ping_lookup()
223 sk->sk_bound_dev_if); in ping_lookup()
225 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) && in ping_lookup()
226 !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, in ping_lookup()
227 &ipv6_hdr(skb)->daddr)) in ping_lookup()
234 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && in ping_lookup()
235 sk->sk_bound_dev_if != sdif) in ping_lookup()
250 kgid_t *data = net->ipv4.ping_group_range.range; in inet_get_ping_group_range_net()
254 seq = read_seqbegin(&net->ipv4.ping_group_range.lock); in inet_get_ping_group_range_net()
258 } while (read_seqretry(&net->ipv4.ping_group_range.lock, seq)); in inet_get_ping_group_range_net()
271 if (sk->sk_family == AF_INET6) in ping_init_sock()
272 sk->sk_ipv6only = 1; in ping_init_sock()
279 for (i = 0; i < group_info->ngroups; i++) { in ping_init_sock()
280 kgid_t gid = group_info->gid[i]; in ping_init_sock()
286 ret = -EACCES; in ping_init_sock()
296 pr_debug("ping_close(sk=%p,sk->num=%u)\n", in ping_close()
297 inet_sk(sk), inet_sk(sk)->inet_num); in ping_close()
298 pr_debug("isk->refcnt = %d\n", refcount_read(&sk->sk_refcnt)); in ping_close()
312 return -EINVAL; in ping_pre_connect()
317 /* Checks the bind address and possibly modifies sk->sk_bound_dev_if. */
322 if (sk->sk_family == AF_INET) { in ping_check_bind_addr()
328 return -EINVAL; in ping_check_bind_addr()
330 if (addr->sin_family != AF_INET && in ping_check_bind_addr()
331 !(addr->sin_family == AF_UNSPEC && in ping_check_bind_addr()
332 addr->sin_addr.s_addr == htonl(INADDR_ANY))) in ping_check_bind_addr()
333 return -EAFNOSUPPORT; in ping_check_bind_addr()
336 sk, &addr->sin_addr.s_addr, ntohs(addr->sin_port)); in ping_check_bind_addr()
338 if (addr->sin_addr.s_addr == htonl(INADDR_ANY)) in ping_check_bind_addr()
341 tb_id = l3mdev_fib_table_by_index(net, sk->sk_bound_dev_if) ? : tb_id; in ping_check_bind_addr()
342 chk_addr_ret = inet_addr_type_table(net, addr->sin_addr.s_addr, tb_id); in ping_check_bind_addr()
348 return -EADDRNOTAVAIL; in ping_check_bind_addr()
351 } else if (sk->sk_family == AF_INET6) { in ping_check_bind_addr()
357 return -EINVAL; in ping_check_bind_addr()
359 if (addr->sin6_family != AF_INET6) in ping_check_bind_addr()
360 return -EAFNOSUPPORT; in ping_check_bind_addr()
363 sk, addr->sin6_addr.s6_addr, ntohs(addr->sin6_port)); in ping_check_bind_addr()
365 addr_type = ipv6_addr_type(&addr->sin6_addr); in ping_check_bind_addr()
369 (scoped && !addr->sin6_scope_id)) in ping_check_bind_addr()
370 return -EINVAL; in ping_check_bind_addr()
373 if (addr->sin6_scope_id) { in ping_check_bind_addr()
374 dev = dev_get_by_index_rcu(net, addr->sin6_scope_id); in ping_check_bind_addr()
377 return -ENODEV; in ping_check_bind_addr()
381 if (!dev && sk->sk_bound_dev_if) { in ping_check_bind_addr()
382 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); in ping_check_bind_addr()
385 return -ENODEV; in ping_check_bind_addr()
388 has_addr = pingv6_ops.ipv6_chk_addr(net, &addr->sin6_addr, dev, in ping_check_bind_addr()
394 return -EADDRNOTAVAIL; in ping_check_bind_addr()
397 sk->sk_bound_dev_if = addr->sin6_scope_id; in ping_check_bind_addr()
400 return -EAFNOSUPPORT; in ping_check_bind_addr()
407 if (saddr->sa_family == AF_INET) { in ping_set_saddr()
410 isk->inet_rcv_saddr = isk->inet_saddr = addr->sin_addr.s_addr; in ping_set_saddr()
412 } else if (saddr->sa_family == AF_INET6) { in ping_set_saddr()
415 sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr; in ping_set_saddr()
422 * Moreover, we don't allow binding to multi- and broadcast addresses.
430 int dif = sk->sk_bound_dev_if; in ping_bind()
438 err = -EINVAL; in ping_bind()
439 if (isk->inet_num != 0) in ping_bind()
442 err = -EADDRINUSE; in ping_bind()
443 snum = ntohs(((struct sockaddr_in *)uaddr)->sin_port); in ping_bind()
445 /* Restore possibly modified sk->sk_bound_dev_if by ping_check_bind_addr(). */ in ping_bind()
446 sk->sk_bound_dev_if = dif; in ping_bind()
452 isk->inet_num, in ping_bind()
453 sk->sk_bound_dev_if); in ping_bind()
456 if (sk->sk_family == AF_INET && isk->inet_rcv_saddr) in ping_bind()
457 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
459 if (sk->sk_family == AF_INET6 && !ipv6_addr_any(&sk->sk_v6_rcv_saddr)) in ping_bind()
460 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
464 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; in ping_bind()
465 isk->inet_sport = htons(isk->inet_num); in ping_bind()
466 isk->inet_daddr = 0; in ping_bind()
467 isk->inet_dport = 0; in ping_bind()
470 if (sk->sk_family == AF_INET6) in ping_bind()
471 memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); in ping_bind()
477 pr_debug("ping_v4_bind -> %d\n", err); in ping_bind()
506 struct net *net = dev_net(skb->dev); in ping_err()
511 if (skb->protocol == htons(ETH_P_IP)) { in ping_err()
513 type = icmp_hdr(skb)->type; in ping_err()
514 code = icmp_hdr(skb)->code; in ping_err()
515 icmph = (struct icmphdr *)(skb->data + offset); in ping_err()
516 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_err()
518 type = icmp6_hdr(skb)->icmp6_type; in ping_err()
519 code = icmp6_hdr(skb)->icmp6_code; in ping_err()
520 icmph = (struct icmphdr *) (skb->data + offset); in ping_err()
527 if (!ping_supported(family, icmph->type, icmph->code)) in ping_err()
531 skb->protocol, type, code, ntohs(icmph->un.echo.id), in ping_err()
532 ntohs(icmph->un.echo.sequence)); in ping_err()
534 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_err()
545 if (skb->protocol == htons(ETH_P_IP)) { in ping_err()
564 if (inet_sock->pmtudisc != IP_PMTUDISC_DONT) { in ping_err()
584 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_err()
593 if ((family == AF_INET && !inet_sock->recverr) || in ping_err()
594 (family == AF_INET6 && !inet6_sk(sk)->recverr)) { in ping_err()
595 if (!harderr || sk->sk_state != TCP_ESTABLISHED) in ping_err()
608 sk->sk_err = err; in ping_err()
625 if (!csum_and_copy_from_iter_full(to, fraglen, &pfh->wcheck, in ping_getfrag()
626 &pfh->msg->msg_iter)) in ping_getfrag()
627 return -EFAULT; in ping_getfrag()
634 if (pfh->family == AF_INET6) { in ping_getfrag()
635 skb->csum = csum_block_add(skb->csum, pfh->wcheck, odd); in ping_getfrag()
636 skb->ip_summed = CHECKSUM_NONE; in ping_getfrag()
637 pfh->wcheck = 0; in ping_getfrag()
648 struct sk_buff *skb = skb_peek(&sk->sk_write_queue); in ping_v4_push_pending_frames()
652 pfh->wcheck = csum_partial((char *)&pfh->icmph, in ping_v4_push_pending_frames()
653 sizeof(struct icmphdr), pfh->wcheck); in ping_v4_push_pending_frames()
654 pfh->icmph.checksum = csum_fold(pfh->wcheck); in ping_v4_push_pending_frames()
655 memcpy(icmp_hdr(skb), &pfh->icmph, sizeof(struct icmphdr)); in ping_v4_push_pending_frames()
656 skb->ip_summed = CHECKSUM_NONE; in ping_v4_push_pending_frames()
666 return -EMSGSIZE; in ping_common_sendmsg()
670 return -EINVAL; in ping_common_sendmsg()
677 if (msg->msg_flags & MSG_OOB) in ping_common_sendmsg()
678 return -EOPNOTSUPP; in ping_common_sendmsg()
685 return -EFAULT; in ping_common_sendmsg()
688 type = ((struct icmphdr *) user_icmph)->type; in ping_common_sendmsg()
689 code = ((struct icmphdr *) user_icmph)->code; in ping_common_sendmsg()
692 type = ((struct icmp6hdr *) user_icmph)->icmp6_type; in ping_common_sendmsg()
693 code = ((struct icmp6hdr *) user_icmph)->icmp6_code; in ping_common_sendmsg()
700 return -EINVAL; in ping_common_sendmsg()
721 pr_debug("ping_v4_sendmsg(sk=%p,sk->num=%u)\n", inet, inet->inet_num); in ping_v4_sendmsg()
732 if (msg->msg_name) { in ping_v4_sendmsg()
733 DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); in ping_v4_sendmsg()
734 if (msg->msg_namelen < sizeof(*usin)) in ping_v4_sendmsg()
735 return -EINVAL; in ping_v4_sendmsg()
736 if (usin->sin_family != AF_INET) in ping_v4_sendmsg()
737 return -EAFNOSUPPORT; in ping_v4_sendmsg()
738 daddr = usin->sin_addr.s_addr; in ping_v4_sendmsg()
741 if (sk->sk_state != TCP_ESTABLISHED) in ping_v4_sendmsg()
742 return -EDESTADDRREQ; in ping_v4_sendmsg()
743 daddr = inet->inet_daddr; in ping_v4_sendmsg()
749 if (msg->msg_controllen) { in ping_v4_sendmsg()
762 inet_opt = rcu_dereference(inet->inet_opt); in ping_v4_sendmsg()
765 sizeof(*inet_opt) + inet_opt->opt.optlen); in ping_v4_sendmsg()
774 if (ipc.opt && ipc.opt->opt.srr) { in ping_v4_sendmsg()
776 err = -EINVAL; in ping_v4_sendmsg()
779 faddr = ipc.opt->opt.faddr; in ping_v4_sendmsg()
783 (msg->msg_flags & MSG_DONTROUTE) || in ping_v4_sendmsg()
784 (ipc.opt && ipc.opt->opt.is_strictroute)) { in ping_v4_sendmsg()
790 ipc.oif = inet->mc_index; in ping_v4_sendmsg()
792 saddr = inet->mc_addr; in ping_v4_sendmsg()
794 ipc.oif = inet->uc_index; in ping_v4_sendmsg()
797 RT_SCOPE_UNIVERSE, sk->sk_protocol, in ping_v4_sendmsg()
799 sk->sk_uid); in ping_v4_sendmsg()
809 if (err == -ENETUNREACH) in ping_v4_sendmsg()
814 err = -EACCES; in ping_v4_sendmsg()
815 if ((rt->rt_flags & RTCF_BROADCAST) && in ping_v4_sendmsg()
819 if (msg->msg_flags & MSG_CONFIRM) in ping_v4_sendmsg()
831 pfh.icmph.un.echo.id = inet->inet_sport; in ping_v4_sendmsg()
839 msg->msg_flags); in ping_v4_sendmsg()
858 if (msg->msg_flags & MSG_PROBE) in ping_v4_sendmsg()
859 dst_confirm_neigh(&rt->dst, &fl4.daddr); in ping_v4_sendmsg()
860 if (!(msg->msg_flags & MSG_PROBE) || len) in ping_v4_sendmsg()
870 int family = sk->sk_family; in ping_recvmsg()
874 pr_debug("ping_recvmsg(sk=%p,sk->num=%u)\n", isk, isk->inet_num); in ping_recvmsg()
876 err = -EOPNOTSUPP; in ping_recvmsg()
887 copied = skb->len; in ping_recvmsg()
889 msg->msg_flags |= MSG_TRUNC; in ping_recvmsg()
902 DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); in ping_recvmsg()
905 sin->sin_family = AF_INET; in ping_recvmsg()
906 sin->sin_port = 0 /* skb->h.uh->source */; in ping_recvmsg()
907 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; in ping_recvmsg()
908 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); in ping_recvmsg()
912 if (isk->cmsg_flags) in ping_recvmsg()
919 DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); in ping_recvmsg()
922 sin6->sin6_family = AF_INET6; in ping_recvmsg()
923 sin6->sin6_port = 0; in ping_recvmsg()
924 sin6->sin6_addr = ip6->saddr; in ping_recvmsg()
925 sin6->sin6_flowinfo = 0; in ping_recvmsg()
926 if (np->sndflow) in ping_recvmsg()
927 sin6->sin6_flowinfo = ip6_flowinfo(ip6); in ping_recvmsg()
928 sin6->sin6_scope_id = in ping_recvmsg()
929 ipv6_iface_scope_id(&sin6->sin6_addr, in ping_recvmsg()
934 if (inet6_sk(sk)->rxopt.all) in ping_recvmsg()
936 if (skb->protocol == htons(ETH_P_IPV6) && in ping_recvmsg()
937 inet6_sk(sk)->rxopt.all) in ping_recvmsg()
939 else if (skb->protocol == htons(ETH_P_IP) && isk->cmsg_flags) in ping_recvmsg()
951 pr_debug("ping_recvmsg -> %d\n", err); in ping_recvmsg()
961 pr_debug("ping_queue_rcv_skb(sk=%p,sk->num=%d,skb=%p)\n", in __ping_queue_rcv_skb()
962 inet_sk(sk), inet_sk(sk)->inet_num, skb); in __ping_queue_rcv_skb()
965 pr_debug("ping_queue_rcv_skb -> failed\n"); in __ping_queue_rcv_skb()
973 return __ping_queue_rcv_skb(sk, skb) ? -1 : 0; in ping_queue_rcv_skb()
986 struct net *net = dev_net(skb->dev); in ping_rcv()
992 skb, ntohs(icmph->un.echo.id), ntohs(icmph->un.echo.sequence)); in ping_rcv()
995 skb_push(skb, skb->data - (u8 *)icmph); in ping_rcv()
997 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_rcv()
1043 struct ping_iter_state *state = seq->private; in ping_get_first()
1046 for (state->bucket = start; state->bucket < PING_HTABLE_SIZE; in ping_get_first()
1047 ++state->bucket) { in ping_get_first()
1051 hslot = &ping_table.hash[state->bucket]; in ping_get_first()
1058 sk->sk_family == state->family) in ping_get_first()
1069 struct ping_iter_state *state = seq->private; in ping_get_next()
1077 return ping_get_first(seq, state->bucket + 1); in ping_get_next()
1087 --pos; in ping_get_idx()
1094 struct ping_iter_state *state = seq->private; in ping_seq_start()
1095 state->bucket = 0; in ping_seq_start()
1096 state->family = family; in ping_seq_start()
1100 return *pos ? ping_get_idx(seq, *pos-1) : SEQ_START_TOKEN; in ping_seq_start()
1134 __be32 dest = inet->inet_daddr; in ping_v4_format_sock()
1135 __be32 src = inet->inet_rcv_saddr; in ping_v4_format_sock()
1136 __u16 destp = ntohs(inet->inet_dport); in ping_v4_format_sock()
1137 __u16 srcp = ntohs(inet->inet_sport); in ping_v4_format_sock()
1141 bucket, src, srcp, dest, destp, sp->sk_state, in ping_v4_format_sock()
1147 refcount_read(&sp->sk_refcnt), sp, in ping_v4_format_sock()
1148 atomic_read(&sp->sk_drops)); in ping_v4_format_sock()
1156 "rx_queue tr tm->when retrnsmt uid timeout " in ping_v4_seq_show()
1159 struct ping_iter_state *state = seq->private; in ping_v4_seq_show()
1161 ping_v4_format_sock(v, seq, state->bucket); in ping_v4_seq_show()
1176 if (!proc_create_net("icmp", 0444, net->proc_net, &ping_v4_seq_ops, in ping_v4_proc_init_net()
1178 return -ENOMEM; in ping_v4_proc_init_net()
1184 remove_proc_entry("icmp", net->proc_net); in ping_v4_proc_exit_net()