• Home
  • Raw
  • Download

Lines Matching +full:button +full:- +full:uid

1 // SPDX-License-Identifier: GPL-2.0-or-later
74 return &table->hash[ping_hashfn(net, num, PING_HTABLE_MASK)]; in ping_hashslot()
98 if (isk2->inet_num == result) in ping_get_port()
119 if ((isk2->inet_num == ident) && in ping_get_port()
121 (!sk2->sk_reuse || !sk->sk_reuse)) in ping_get_port()
127 isk->inet_num = ident; in ping_get_port()
131 hlist_nulls_add_head(&sk->sk_nulls_node, hlist); in ping_get_port()
132 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in ping_get_port()
145 pr_debug("ping_hash(sk->port=%u)\n", inet_sk(sk)->inet_num); in ping_hash()
146 BUG(); /* "Please do not press this button again." */ in ping_hash()
155 pr_debug("ping_unhash(isk=%p,isk->num=%u)\n", isk, isk->inet_num); in ping_unhash()
158 hlist_nulls_del(&sk->sk_nulls_node); in ping_unhash()
159 sk_nulls_node_init(&sk->sk_nulls_node); in ping_unhash()
161 isk->inet_num = 0; in ping_unhash()
162 isk->inet_sport = 0; in ping_unhash()
163 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in ping_unhash()
177 if (skb->protocol == htons(ETH_P_IP)) { in ping_lookup()
181 (int)ident, &ip_hdr(skb)->daddr, dif); in ping_lookup()
183 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_lookup()
187 (int)ident, &ipv6_hdr(skb)->daddr, dif); in ping_lookup()
199 if (isk->inet_num != ident) in ping_lookup()
202 if (skb->protocol == htons(ETH_P_IP) && in ping_lookup()
203 sk->sk_family == AF_INET) { in ping_lookup()
205 (int) isk->inet_num, &isk->inet_rcv_saddr, in ping_lookup()
206 sk->sk_bound_dev_if); in ping_lookup()
208 if (isk->inet_rcv_saddr && in ping_lookup()
209 isk->inet_rcv_saddr != ip_hdr(skb)->daddr) in ping_lookup()
212 } else if (skb->protocol == htons(ETH_P_IPV6) && in ping_lookup()
213 sk->sk_family == AF_INET6) { in ping_lookup()
216 (int) isk->inet_num, in ping_lookup()
217 &sk->sk_v6_rcv_saddr, in ping_lookup()
218 sk->sk_bound_dev_if); in ping_lookup()
220 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) && in ping_lookup()
221 !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, in ping_lookup()
222 &ipv6_hdr(skb)->daddr)) in ping_lookup()
229 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && in ping_lookup()
230 sk->sk_bound_dev_if != sdif) in ping_lookup()
247 kgid_t *data = net->ipv4.ping_group_range.range; in inet_get_ping_group_range_net()
251 seq = read_seqbegin(&net->ipv4.ping_group_range.lock); in inet_get_ping_group_range_net()
255 } while (read_seqretry(&net->ipv4.ping_group_range.lock, seq)); in inet_get_ping_group_range_net()
268 if (sk->sk_family == AF_INET6) in ping_init_sock()
269 sk->sk_ipv6only = 1; in ping_init_sock()
276 for (i = 0; i < group_info->ngroups; i++) { in ping_init_sock()
277 kgid_t gid = group_info->gid[i]; in ping_init_sock()
283 ret = -EACCES; in ping_init_sock()
293 pr_debug("ping_close(sk=%p,sk->num=%u)\n", in ping_close()
294 inet_sk(sk), inet_sk(sk)->inet_num); in ping_close()
295 pr_debug("isk->refcnt = %d\n", refcount_read(&sk->sk_refcnt)); in ping_close()
301 /* Checks the bind address and possibly modifies sk->sk_bound_dev_if. */
306 if (sk->sk_family == AF_INET) { in ping_check_bind_addr()
312 return -EINVAL; in ping_check_bind_addr()
314 if (addr->sin_family != AF_INET && in ping_check_bind_addr()
315 !(addr->sin_family == AF_UNSPEC && in ping_check_bind_addr()
316 addr->sin_addr.s_addr == htonl(INADDR_ANY))) in ping_check_bind_addr()
317 return -EAFNOSUPPORT; in ping_check_bind_addr()
320 sk, &addr->sin_addr.s_addr, ntohs(addr->sin_port)); in ping_check_bind_addr()
322 if (addr->sin_addr.s_addr == htonl(INADDR_ANY)) in ping_check_bind_addr()
325 tb_id = l3mdev_fib_table_by_index(net, sk->sk_bound_dev_if) ? : tb_id; in ping_check_bind_addr()
326 chk_addr_ret = inet_addr_type_table(net, addr->sin_addr.s_addr, tb_id); in ping_check_bind_addr()
333 return -EADDRNOTAVAIL; in ping_check_bind_addr()
336 } else if (sk->sk_family == AF_INET6) { in ping_check_bind_addr()
342 return -EINVAL; in ping_check_bind_addr()
344 if (addr->sin6_family != AF_INET6) in ping_check_bind_addr()
345 return -EAFNOSUPPORT; in ping_check_bind_addr()
348 sk, addr->sin6_addr.s6_addr, ntohs(addr->sin6_port)); in ping_check_bind_addr()
350 addr_type = ipv6_addr_type(&addr->sin6_addr); in ping_check_bind_addr()
354 (scoped && !addr->sin6_scope_id)) in ping_check_bind_addr()
355 return -EINVAL; in ping_check_bind_addr()
358 if (addr->sin6_scope_id) { in ping_check_bind_addr()
359 dev = dev_get_by_index_rcu(net, addr->sin6_scope_id); in ping_check_bind_addr()
362 return -ENODEV; in ping_check_bind_addr()
366 if (!dev && sk->sk_bound_dev_if) { in ping_check_bind_addr()
367 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); in ping_check_bind_addr()
370 return -ENODEV; in ping_check_bind_addr()
373 has_addr = pingv6_ops.ipv6_chk_addr(net, &addr->sin6_addr, dev, in ping_check_bind_addr()
379 return -EADDRNOTAVAIL; in ping_check_bind_addr()
382 sk->sk_bound_dev_if = addr->sin6_scope_id; in ping_check_bind_addr()
385 return -EAFNOSUPPORT; in ping_check_bind_addr()
392 if (saddr->sa_family == AF_INET) { in ping_set_saddr()
395 isk->inet_rcv_saddr = isk->inet_saddr = addr->sin_addr.s_addr; in ping_set_saddr()
397 } else if (saddr->sa_family == AF_INET6) { in ping_set_saddr()
400 sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr; in ping_set_saddr()
407 * Moreover, we don't allow binding to multi- and broadcast addresses.
415 int dif = sk->sk_bound_dev_if; in ping_bind()
423 err = -EINVAL; in ping_bind()
424 if (isk->inet_num != 0) in ping_bind()
427 err = -EADDRINUSE; in ping_bind()
428 snum = ntohs(((struct sockaddr_in *)uaddr)->sin_port); in ping_bind()
430 /* Restore possibly modified sk->sk_bound_dev_if by ping_check_bind_addr(). */ in ping_bind()
431 sk->sk_bound_dev_if = dif; in ping_bind()
437 isk->inet_num, in ping_bind()
438 sk->sk_bound_dev_if); in ping_bind()
441 if (sk->sk_family == AF_INET && isk->inet_rcv_saddr) in ping_bind()
442 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
444 if (sk->sk_family == AF_INET6 && !ipv6_addr_any(&sk->sk_v6_rcv_saddr)) in ping_bind()
445 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
449 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; in ping_bind()
450 isk->inet_sport = htons(isk->inet_num); in ping_bind()
451 isk->inet_daddr = 0; in ping_bind()
452 isk->inet_dport = 0; in ping_bind()
455 if (sk->sk_family == AF_INET6) in ping_bind()
456 memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); in ping_bind()
462 pr_debug("ping_v4_bind -> %d\n", err); in ping_bind()
489 struct net *net = dev_net(skb->dev); in ping_err()
494 if (skb->protocol == htons(ETH_P_IP)) { in ping_err()
496 type = icmp_hdr(skb)->type; in ping_err()
497 code = icmp_hdr(skb)->code; in ping_err()
498 icmph = (struct icmphdr *)(skb->data + offset); in ping_err()
499 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_err()
501 type = icmp6_hdr(skb)->icmp6_type; in ping_err()
502 code = icmp6_hdr(skb)->icmp6_code; in ping_err()
503 icmph = (struct icmphdr *) (skb->data + offset); in ping_err()
510 if (!ping_supported(family, icmph->type, icmph->code)) in ping_err()
514 skb->protocol, type, code, ntohs(icmph->un.echo.id), in ping_err()
515 ntohs(icmph->un.echo.sequence)); in ping_err()
517 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_err()
528 if (skb->protocol == htons(ETH_P_IP)) { in ping_err()
547 if (inet_sock->pmtudisc != IP_PMTUDISC_DONT) { in ping_err()
567 } else if (skb->protocol == htons(ETH_P_IPV6)) { in ping_err()
576 if ((family == AF_INET && !inet_sock->recverr) || in ping_err()
577 (family == AF_INET6 && !inet6_sk(sk)->recverr)) { in ping_err()
578 if (!harderr || sk->sk_state != TCP_ESTABLISHED) in ping_err()
591 sk->sk_err = err; in ping_err()
592 sk->sk_error_report(sk); in ping_err()
609 fraglen -= sizeof(struct icmphdr); in ping_getfrag()
613 fraglen, &pfh->wcheck, in ping_getfrag()
614 &pfh->msg->msg_iter)) in ping_getfrag()
615 return -EFAULT; in ping_getfrag()
619 if (!csum_and_copy_from_iter_full(to, fraglen, &pfh->wcheck, in ping_getfrag()
620 &pfh->msg->msg_iter)) in ping_getfrag()
621 return -EFAULT; in ping_getfrag()
629 if (pfh->family == AF_INET6) { in ping_getfrag()
630 skb->csum = pfh->wcheck; in ping_getfrag()
631 skb->ip_summed = CHECKSUM_NONE; in ping_getfrag()
632 pfh->wcheck = 0; in ping_getfrag()
643 struct sk_buff *skb = skb_peek(&sk->sk_write_queue); in ping_v4_push_pending_frames()
647 pfh->wcheck = csum_partial((char *)&pfh->icmph, in ping_v4_push_pending_frames()
648 sizeof(struct icmphdr), pfh->wcheck); in ping_v4_push_pending_frames()
649 pfh->icmph.checksum = csum_fold(pfh->wcheck); in ping_v4_push_pending_frames()
650 memcpy(icmp_hdr(skb), &pfh->icmph, sizeof(struct icmphdr)); in ping_v4_push_pending_frames()
651 skb->ip_summed = CHECKSUM_NONE; in ping_v4_push_pending_frames()
661 return -EMSGSIZE; in ping_common_sendmsg()
665 return -EINVAL; in ping_common_sendmsg()
672 if (msg->msg_flags & MSG_OOB) in ping_common_sendmsg()
673 return -EOPNOTSUPP; in ping_common_sendmsg()
680 return -EFAULT; in ping_common_sendmsg()
683 type = ((struct icmphdr *) user_icmph)->type; in ping_common_sendmsg()
684 code = ((struct icmphdr *) user_icmph)->code; in ping_common_sendmsg()
687 type = ((struct icmp6hdr *) user_icmph)->icmp6_type; in ping_common_sendmsg()
688 code = ((struct icmp6hdr *) user_icmph)->icmp6_code; in ping_common_sendmsg()
695 return -EINVAL; in ping_common_sendmsg()
716 pr_debug("ping_v4_sendmsg(sk=%p,sk->num=%u)\n", inet, inet->inet_num); in ping_v4_sendmsg()
727 if (msg->msg_name) { in ping_v4_sendmsg()
728 DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); in ping_v4_sendmsg()
729 if (msg->msg_namelen < sizeof(*usin)) in ping_v4_sendmsg()
730 return -EINVAL; in ping_v4_sendmsg()
731 if (usin->sin_family != AF_INET) in ping_v4_sendmsg()
732 return -EAFNOSUPPORT; in ping_v4_sendmsg()
733 daddr = usin->sin_addr.s_addr; in ping_v4_sendmsg()
736 if (sk->sk_state != TCP_ESTABLISHED) in ping_v4_sendmsg()
737 return -EDESTADDRREQ; in ping_v4_sendmsg()
738 daddr = inet->inet_daddr; in ping_v4_sendmsg()
744 if (msg->msg_controllen) { in ping_v4_sendmsg()
757 inet_opt = rcu_dereference(inet->inet_opt); in ping_v4_sendmsg()
760 sizeof(*inet_opt) + inet_opt->opt.optlen); in ping_v4_sendmsg()
769 if (ipc.opt && ipc.opt->opt.srr) { in ping_v4_sendmsg()
771 err = -EINVAL; in ping_v4_sendmsg()
774 faddr = ipc.opt->opt.faddr; in ping_v4_sendmsg()
778 (msg->msg_flags & MSG_DONTROUTE) || in ping_v4_sendmsg()
779 (ipc.opt && ipc.opt->opt.is_strictroute)) { in ping_v4_sendmsg()
785 ipc.oif = inet->mc_index; in ping_v4_sendmsg()
787 saddr = inet->mc_addr; in ping_v4_sendmsg()
789 ipc.oif = inet->uc_index; in ping_v4_sendmsg()
792 RT_SCOPE_UNIVERSE, sk->sk_protocol, in ping_v4_sendmsg()
794 sk->sk_uid); in ping_v4_sendmsg()
804 if (err == -ENETUNREACH) in ping_v4_sendmsg()
809 err = -EACCES; in ping_v4_sendmsg()
810 if ((rt->rt_flags & RTCF_BROADCAST) && in ping_v4_sendmsg()
814 if (msg->msg_flags & MSG_CONFIRM) in ping_v4_sendmsg()
826 pfh.icmph.un.echo.id = inet->inet_sport; in ping_v4_sendmsg()
833 0, &ipc, &rt, msg->msg_flags); in ping_v4_sendmsg()
852 if (msg->msg_flags & MSG_PROBE) in ping_v4_sendmsg()
853 dst_confirm_neigh(&rt->dst, &fl4.daddr); in ping_v4_sendmsg()
854 if (!(msg->msg_flags & MSG_PROBE) || len) in ping_v4_sendmsg()
864 int family = sk->sk_family; in ping_recvmsg()
868 pr_debug("ping_recvmsg(sk=%p,sk->num=%u)\n", isk, isk->inet_num); in ping_recvmsg()
870 err = -EOPNOTSUPP; in ping_recvmsg()
881 copied = skb->len; in ping_recvmsg()
883 msg->msg_flags |= MSG_TRUNC; in ping_recvmsg()
896 DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); in ping_recvmsg()
899 sin->sin_family = AF_INET; in ping_recvmsg()
900 sin->sin_port = 0 /* skb->h.uh->source */; in ping_recvmsg()
901 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; in ping_recvmsg()
902 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); in ping_recvmsg()
906 if (isk->cmsg_flags) in ping_recvmsg()
913 DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); in ping_recvmsg()
916 sin6->sin6_family = AF_INET6; in ping_recvmsg()
917 sin6->sin6_port = 0; in ping_recvmsg()
918 sin6->sin6_addr = ip6->saddr; in ping_recvmsg()
919 sin6->sin6_flowinfo = 0; in ping_recvmsg()
920 if (np->sndflow) in ping_recvmsg()
921 sin6->sin6_flowinfo = ip6_flowinfo(ip6); in ping_recvmsg()
922 sin6->sin6_scope_id = in ping_recvmsg()
923 ipv6_iface_scope_id(&sin6->sin6_addr, in ping_recvmsg()
928 if (inet6_sk(sk)->rxopt.all) in ping_recvmsg()
930 if (skb->protocol == htons(ETH_P_IPV6) && in ping_recvmsg()
931 inet6_sk(sk)->rxopt.all) in ping_recvmsg()
933 else if (skb->protocol == htons(ETH_P_IP) && isk->cmsg_flags) in ping_recvmsg()
945 pr_debug("ping_recvmsg -> %d\n", err); in ping_recvmsg()
952 pr_debug("ping_queue_rcv_skb(sk=%p,sk->num=%d,skb=%p)\n", in ping_queue_rcv_skb()
953 inet_sk(sk), inet_sk(sk)->inet_num, skb); in ping_queue_rcv_skb()
956 pr_debug("ping_queue_rcv_skb -> failed\n"); in ping_queue_rcv_skb()
957 return -1; in ping_queue_rcv_skb()
971 struct net *net = dev_net(skb->dev); in ping_rcv()
978 skb, ntohs(icmph->un.echo.id), ntohs(icmph->un.echo.sequence)); in ping_rcv()
981 skb_push(skb, skb->data - (u8 *)icmph); in ping_rcv()
983 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_rcv()
1026 struct ping_iter_state *state = seq->private; in ping_get_first()
1029 for (state->bucket = start; state->bucket < PING_HTABLE_SIZE; in ping_get_first()
1030 ++state->bucket) { in ping_get_first()
1034 hslot = &ping_table.hash[state->bucket]; in ping_get_first()
1041 sk->sk_family == state->family) in ping_get_first()
1052 struct ping_iter_state *state = seq->private; in ping_get_next()
1060 return ping_get_first(seq, state->bucket + 1); in ping_get_next()
1070 --pos; in ping_get_idx()
1077 struct ping_iter_state *state = seq->private; in ping_seq_start()
1078 state->bucket = 0; in ping_seq_start()
1079 state->family = family; in ping_seq_start()
1083 return *pos ? ping_get_idx(seq, *pos-1) : SEQ_START_TOKEN; in ping_seq_start()
1117 __be32 dest = inet->inet_daddr; in ping_v4_format_sock()
1118 __be32 src = inet->inet_rcv_saddr; in ping_v4_format_sock()
1119 __u16 destp = ntohs(inet->inet_dport); in ping_v4_format_sock()
1120 __u16 srcp = ntohs(inet->inet_sport); in ping_v4_format_sock()
1124 bucket, src, srcp, dest, destp, sp->sk_state, in ping_v4_format_sock()
1130 refcount_read(&sp->sk_refcnt), sp, in ping_v4_format_sock()
1131 atomic_read(&sp->sk_drops)); in ping_v4_format_sock()
1139 "rx_queue tr tm->when retrnsmt uid timeout " in ping_v4_seq_show()
1142 struct ping_iter_state *state = seq->private; in ping_v4_seq_show()
1144 ping_v4_format_sock(v, seq, state->bucket); in ping_v4_seq_show()
1159 if (!proc_create_net("icmp", 0444, net->proc_net, &ping_v4_seq_ops, in ping_v4_proc_init_net()
1161 return -ENOMEM; in ping_v4_proc_init_net()
1167 remove_proc_entry("icmp", net->proc_net); in ping_v4_proc_exit_net()