lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 7 May 2018 13:49:57 +0800
From:   kbuild test robot <lkp@...el.com>
To:     Roopa Prabhu <roopa@...ulusnetworks.com>
Cc:     kbuild-all@...org, davem@...emloft.net, netdev@...r.kernel.org,
        dsa@...ulusnetworks.com, nikolay@...ulusnetworks.com,
        idosch@...lanox.com
Subject: Re: [PATCH net-next v2 1/3] ipv4: support sport and dport in
 RTM_GETROUTE

Hi Roopa,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Roopa-Prabhu/fib-rule-selftest/20180507-094538
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   net/ipv4/route.c:1271:31: sparse: expression using sizeof(void)
   net/ipv4/route.c:1271:31: sparse: expression using sizeof(void)
   net/ipv4/route.c:1274:16: sparse: expression using sizeof(void)
   net/ipv4/route.c:1274:16: sparse: expression using sizeof(void)
   net/ipv4/route.c:1295:15: sparse: expression using sizeof(void)
   net/ipv4/route.c:688:38: sparse: expression using sizeof(void)
   net/ipv4/route.c:712:38: sparse: expression using sizeof(void)
   net/ipv4/route.c:782:46: sparse: incorrect type in argument 2 (different base types) @@    expected unsigned int [unsigned] [usertype] key @@    got ed int [unsigned] [usertype] key @@
   net/ipv4/route.c:782:46:    expected unsigned int [unsigned] [usertype] key
   net/ipv4/route.c:782:46:    got restricted __be32 [usertype] new_gw
>> net/ipv4/route.c:2695:29: sparse: incorrect type in initializer (different base types) @@    expected int [signed] p @@    got restint [signed] p @@
   net/ipv4/route.c:2695:29:    expected int [signed] p
   net/ipv4/route.c:2695:29:    got restricted __be16
>> net/ipv4/route.c:2700:15: sparse: incorrect type in assignment (different base types) @@    expected restricted __be16 [usertype] <noident> @@    got 6 [usertype] <noident> @@
   net/ipv4/route.c:2700:15:    expected restricted __be16 [usertype] <noident>
   net/ipv4/route.c:2700:15:    got int [signed] p
>> net/ipv4/route.c:2816:27: sparse: incorrect type in assignment (different base types) @@    expected restricted __be16 [usertype] len @@    got 6 [usertype] len @@
   net/ipv4/route.c:2816:27:    expected restricted __be16 [usertype] len
   net/ipv4/route.c:2816:27:    got unsigned long

vim +2695 net/ipv4/route.c

  2692	
  2693	static int nla_get_port(struct nlattr *attr, __be16 *port)
  2694	{
> 2695		int p = nla_get_be16(attr);
  2696	
  2697		if (p <= 0 || p >= 0xffff)
  2698			return -EINVAL;
  2699	
> 2700		*port = p;
  2701		return 0;
  2702	}
  2703	
  2704	static int inet_rtm_getroute_reply(struct sk_buff *in_skb, struct nlmsghdr *nlh,
  2705					   __be32 dst, __be32 src, struct flowi4 *fl4,
  2706					   struct rtable *rt, struct fib_result *res)
  2707	{
  2708		struct net *net = sock_net(in_skb->sk);
  2709		struct rtmsg *rtm = nlmsg_data(nlh);
  2710		u32 table_id = RT_TABLE_MAIN;
  2711		struct sk_buff *skb;
  2712		int err = 0;
  2713	
  2714		skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  2715		if (!skb) {
  2716			err = -ENOMEM;
  2717			return err;
  2718		}
  2719	
  2720		if (rtm->rtm_flags & RTM_F_LOOKUP_TABLE)
  2721			table_id = res->table ? res->table->tb_id : 0;
  2722	
  2723		if (rtm->rtm_flags & RTM_F_FIB_MATCH)
  2724			err = fib_dump_info(skb, NETLINK_CB(in_skb).portid,
  2725					    nlh->nlmsg_seq, RTM_NEWROUTE, table_id,
  2726					    rt->rt_type, res->prefix, res->prefixlen,
  2727					    fl4->flowi4_tos, res->fi, 0);
  2728		else
  2729			err = rt_fill_info(net, dst, src, rt, table_id,
  2730					   fl4, skb, NETLINK_CB(in_skb).portid,
  2731					   nlh->nlmsg_seq);
  2732		if (err < 0)
  2733			goto errout;
  2734	
  2735		return rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
  2736	
  2737	errout:
  2738		kfree_skb(skb);
  2739		return err;
  2740	}
  2741	
  2742	static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
  2743				     struct netlink_ext_ack *extack)
  2744	{
  2745		struct net *net = sock_net(in_skb->sk);
  2746		struct nlattr *tb[RTA_MAX+1];
  2747		__be16 sport = 0, dport = 0;
  2748		struct fib_result res = {};
  2749		struct rtable *rt = NULL;
  2750		struct sk_buff *skb;
  2751		struct rtmsg *rtm;
  2752		struct flowi4 fl4;
  2753		struct iphdr *iph;
  2754		struct udphdr *udph;
  2755		__be32 dst = 0;
  2756		__be32 src = 0;
  2757		kuid_t uid;
  2758		u32 iif;
  2759		int err;
  2760		int mark;
  2761	
  2762		err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv4_policy,
  2763				  extack);
  2764		if (err < 0)
  2765			return err;
  2766	
  2767		rtm = nlmsg_data(nlh);
  2768	
  2769		skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
  2770		if (!skb) {
  2771			err = -ENOBUFS;
  2772			return err;
  2773		}
  2774	
  2775		/* Reserve room for dummy headers, this skb can pass
  2776		   through good chunk of routing engine.
  2777		 */
  2778		skb_reset_mac_header(skb);
  2779		skb_reset_network_header(skb);
  2780	
  2781		src = tb[RTA_SRC] ? nla_get_in_addr(tb[RTA_SRC]) : 0;
  2782		dst = tb[RTA_DST] ? nla_get_in_addr(tb[RTA_DST]) : 0;
  2783		iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 0;
  2784		mark = tb[RTA_MARK] ? nla_get_u32(tb[RTA_MARK]) : 0;
  2785		if (tb[RTA_UID])
  2786			uid = make_kuid(current_user_ns(), nla_get_u32(tb[RTA_UID]));
  2787		else
  2788			uid = (iif ? INVALID_UID : current_uid());
  2789		if (tb[RTA_SPORT]) {
  2790			err = nla_get_port(tb[RTA_SPORT], &sport);
  2791			if (err)
  2792				goto errout_free;
  2793		}
  2794	
  2795		if (tb[RTA_DPORT]) {
  2796			err = nla_get_port(tb[RTA_DPORT], &dport);
  2797			if (err)
  2798				goto errout_free;
  2799		}
  2800	
  2801		skb->protocol = htons(ETH_P_IP);
  2802		iph = skb_put(skb, sizeof(struct iphdr));
  2803		iph->protocol = IPPROTO_UDP;
  2804		iph->saddr = src;
  2805		iph->daddr = dst;
  2806		iph->version = 0x4;
  2807		iph->frag_off = 0;
  2808	
  2809		if (sport || dport) {
  2810			iph->ihl = 0x5;
  2811			skb_set_transport_header(skb, skb->len);
  2812	
  2813			udph = skb_put(skb, sizeof(struct udphdr));
  2814			udph->dest = dport;
  2815			udph->source = sport;
> 2816			udph->len = sizeof(struct udphdr);
  2817			udph->check = 0;
  2818		}
  2819	
  2820		memset(&fl4, 0, sizeof(fl4));
  2821		fl4.daddr = dst;
  2822		fl4.saddr = src;
  2823		fl4.flowi4_tos = rtm->rtm_tos;
  2824		fl4.flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0;
  2825		fl4.flowi4_mark = mark;
  2826		fl4.flowi4_uid = uid;
  2827		if (sport)
  2828			fl4.fl4_sport = sport;
  2829		if (dport)
  2830			fl4.fl4_dport = dport;
  2831		fl4.flowi4_proto = IPPROTO_UDP;
  2832	
  2833		rcu_read_lock();
  2834	
  2835		if (iif) {
  2836			struct net_device *dev;
  2837	
  2838			dev = dev_get_by_index_rcu(net, iif);
  2839			if (!dev) {
  2840				err = -ENODEV;
  2841				goto errout_rcu;
  2842			}
  2843	
  2844			fl4.flowi4_iif = iif; /* for rt_fill_info */
  2845			skb->protocol	= htons(ETH_P_IP);
  2846			skb->dev	= dev;
  2847			skb->mark	= mark;
  2848			err = ip_route_input_rcu(skb, dst, src, rtm->rtm_tos,
  2849						 dev, &res);
  2850	
  2851			rt = skb_rtable(skb);
  2852			if (err == 0 && rt->dst.error)
  2853				err = -rt->dst.error;
  2854		} else {
  2855			fl4.flowi4_iif = LOOPBACK_IFINDEX;
  2856			rt = ip_route_output_key_hash_rcu(net, &fl4, &res, skb);
  2857			err = 0;
  2858			if (IS_ERR(rt))
  2859				err = PTR_ERR(rt);
  2860			else
  2861				skb_dst_set(skb, &rt->dst);
  2862		}
  2863	
  2864		if (err)
  2865			goto errout_rcu;
  2866	
  2867		if (rtm->rtm_flags & RTM_F_NOTIFY)
  2868			rt->rt_flags |= RTCF_NOTIFY;
  2869	
  2870		if (rtm->rtm_flags & RTM_F_FIB_MATCH) {
  2871			if (!res.fi) {
  2872				err = fib_props[res.type].error;
  2873				if (!err)
  2874					err = -EHOSTUNREACH;
  2875				goto errout_rcu;
  2876			}
  2877		}
  2878	
  2879		err = inet_rtm_getroute_reply(in_skb, nlh, dst, src, &fl4, rt, &res);
  2880		if (err < 0)
  2881			goto errout_rcu;
  2882	
  2883		rcu_read_unlock();
  2884	
  2885	errout_free:
  2886		kfree_skb(skb);
  2887		return err;
  2888	errout_rcu:
  2889		rcu_read_unlock();
  2890		goto errout_free;
  2891	}
  2892	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Powered by blists - more mailing lists