Loading net/ipv4/devinet.c +34 −15 Original line number Diff line number Diff line Loading @@ -1713,6 +1713,32 @@ static int inet_valid_dump_ifaddr_req(const struct nlmsghdr *nlh, return 0; } static int in_dev_dump_addr(struct in_device *in_dev, struct sk_buff *skb, struct netlink_callback *cb, int s_ip_idx, struct inet_fill_args *fillargs) { struct in_ifaddr *ifa; int ip_idx = 0; int err; for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next, ip_idx++) { if (ip_idx < s_ip_idx) continue; err = inet_fill_ifaddr(skb, ifa, fillargs); if (err < 0) goto done; nl_dump_check_consistent(cb, nlmsg_hdr(skb)); } err = 0; done: cb->args[2] = ip_idx; return err; } static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) { const struct nlmsghdr *nlh = cb->nlh; Loading @@ -1727,19 +1753,17 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) struct net *tgt_net = net; int h, s_h; int idx, s_idx; int ip_idx, s_ip_idx; int s_ip_idx; struct net_device *dev; struct in_device *in_dev; struct in_ifaddr *ifa; struct hlist_head *head; int err; s_h = cb->args[0]; s_idx = idx = cb->args[1]; s_ip_idx = ip_idx = cb->args[2]; s_ip_idx = cb->args[2]; if (cb->strict_check) { int err; err = inet_valid_dump_ifaddr_req(nlh, &fillargs, &tgt_net, skb->sk, cb->extack); if (err < 0) Loading @@ -1761,16 +1785,12 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) if (!in_dev) goto cont; for (ifa = in_dev->ifa_list, ip_idx = 0; ifa; ifa = ifa->ifa_next, ip_idx++) { if (ip_idx < s_ip_idx) continue; if (inet_fill_ifaddr(skb, ifa, &fillargs) < 0) { err = in_dev_dump_addr(in_dev, skb, cb, s_ip_idx, &fillargs); if (err < 0) { rcu_read_unlock(); goto done; } nl_dump_check_consistent(cb, nlmsg_hdr(skb)); } cont: idx++; } Loading @@ -1780,7 +1800,6 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) done: cb->args[0] = h; cb->args[1] = idx; cb->args[2] = ip_idx; if (fillargs.netnsid >= 0) put_net(tgt_net); Loading Loading
net/ipv4/devinet.c +34 −15 Original line number Diff line number Diff line Loading @@ -1713,6 +1713,32 @@ static int inet_valid_dump_ifaddr_req(const struct nlmsghdr *nlh, return 0; } static int in_dev_dump_addr(struct in_device *in_dev, struct sk_buff *skb, struct netlink_callback *cb, int s_ip_idx, struct inet_fill_args *fillargs) { struct in_ifaddr *ifa; int ip_idx = 0; int err; for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next, ip_idx++) { if (ip_idx < s_ip_idx) continue; err = inet_fill_ifaddr(skb, ifa, fillargs); if (err < 0) goto done; nl_dump_check_consistent(cb, nlmsg_hdr(skb)); } err = 0; done: cb->args[2] = ip_idx; return err; } static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) { const struct nlmsghdr *nlh = cb->nlh; Loading @@ -1727,19 +1753,17 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) struct net *tgt_net = net; int h, s_h; int idx, s_idx; int ip_idx, s_ip_idx; int s_ip_idx; struct net_device *dev; struct in_device *in_dev; struct in_ifaddr *ifa; struct hlist_head *head; int err; s_h = cb->args[0]; s_idx = idx = cb->args[1]; s_ip_idx = ip_idx = cb->args[2]; s_ip_idx = cb->args[2]; if (cb->strict_check) { int err; err = inet_valid_dump_ifaddr_req(nlh, &fillargs, &tgt_net, skb->sk, cb->extack); if (err < 0) Loading @@ -1761,16 +1785,12 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) if (!in_dev) goto cont; for (ifa = in_dev->ifa_list, ip_idx = 0; ifa; ifa = ifa->ifa_next, ip_idx++) { if (ip_idx < s_ip_idx) continue; if (inet_fill_ifaddr(skb, ifa, &fillargs) < 0) { err = in_dev_dump_addr(in_dev, skb, cb, s_ip_idx, &fillargs); if (err < 0) { rcu_read_unlock(); goto done; } nl_dump_check_consistent(cb, nlmsg_hdr(skb)); } cont: idx++; } Loading @@ -1780,7 +1800,6 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) done: cb->args[0] = h; cb->args[1] = idx; cb->args[2] = ip_idx; if (fillargs.netnsid >= 0) put_net(tgt_net); Loading