Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: Fix get_ifidx and callers in nettest.c

Dan reported:

The patch acda655fefae: "selftests: Add nettest" from Aug 1, 2019,
leads to the following static checker warning:

./tools/testing/selftests/net/nettest.c:1690 main()
warn: unsigned 'tmp' is never less than zero.

./tools/testing/selftests/net/nettest.c
1680 case '1':
1681 args.has_expected_raddr = 1;
1682 if (convert_addr(&args, optarg,
1683 ADDR_TYPE_EXPECTED_REMOTE))
1684 return 1;
1685
1686 break;
1687 case '2':
1688 if (str_to_uint(optarg, 0, 0x7ffffff, &tmp) != 0) {
1689 tmp = get_ifidx(optarg);
1690 if (tmp < 0) {

"tmp" is unsigned so it can't be negative. Also all the callers assume
that get_ifidx() returns negatives on error but it looks like it really
returns zero on error so it's a bit unclear to me.

Update get_ifidx to return -1 on errors and cleanup callers of it.

Fixes: acda655fefae ("selftests: Add nettest")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

David Ahern and committed by
David S. Miller
87caaaf2 927441ad

+13 -12
+13 -12
tools/testing/selftests/net/nettest.c
··· 266 266 int sd, rc; 267 267 268 268 if (!ifname || *ifname == '\0') 269 - return 0; 269 + return -1; 270 270 271 271 memset(&ifdata, 0, sizeof(ifdata)); 272 272 ··· 275 275 sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 276 276 if (sd < 0) { 277 277 log_err_errno("socket failed"); 278 - return 0; 278 + return -1; 279 279 } 280 280 281 281 rc = ioctl(sd, SIOCGIFINDEX, (char *)&ifdata); 282 282 close(sd); 283 283 if (rc != 0) { 284 284 log_err_errno("ioctl(SIOCGIFINDEX) failed"); 285 - return 0; 285 + return -1; 286 286 } 287 287 288 288 return ifdata.ifr_ifindex; ··· 419 419 return rc; 420 420 } 421 421 422 - static int set_membership(int sd, uint32_t grp, uint32_t addr, const char *dev) 422 + static int set_membership(int sd, uint32_t grp, uint32_t addr, int ifindex) 423 423 { 424 424 uint32_t if_addr = addr; 425 425 struct ip_mreqn mreq; 426 426 int rc; 427 427 428 - if (addr == htonl(INADDR_ANY) && !dev) { 428 + if (addr == htonl(INADDR_ANY) && !ifindex) { 429 429 log_error("Either local address or device needs to be given for multicast membership\n"); 430 430 return -1; 431 431 } 432 432 433 433 mreq.imr_multiaddr.s_addr = grp; 434 434 mreq.imr_address.s_addr = if_addr; 435 - mreq.imr_ifindex = dev ? get_ifidx(dev) : 0; 435 + mreq.imr_ifindex = ifindex; 436 436 437 437 rc = setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 438 438 if (rc < 0) { ··· 1048 1048 1049 1049 if (server && 1050 1050 set_membership(sd, args->grp.s_addr, 1051 - args->local_addr.in.s_addr, args->dev)) 1051 + args->local_addr.in.s_addr, args->ifindex)) 1052 1052 goto out_err; 1053 1053 1054 1054 return sd; ··· 1685 1685 1686 1686 break; 1687 1687 case '2': 1688 - if (str_to_uint(optarg, 0, 0x7ffffff, &tmp) != 0) { 1689 - tmp = get_ifidx(optarg); 1690 - if (tmp < 0) { 1688 + if (str_to_uint(optarg, 0, INT_MAX, &tmp) == 0) { 1689 + args.expected_ifindex = (int)tmp; 1690 + } else { 1691 + args.expected_ifindex = get_ifidx(optarg); 1692 + if (args.expected_ifindex < 0) { 1691 1693 fprintf(stderr, 1692 - "Invalid device index\n"); 1694 + "Invalid expected device\n"); 1693 1695 return 1; 1694 1696 } 1695 1697 } 1696 - args.expected_ifindex = (int)tmp; 1697 1698 break; 1698 1699 case 'q': 1699 1700 quiet = 1;