https://bugs.kde.org/show_bug.cgi?id=457094

            Bug ID: 457094
           Summary: Unititialized memory false positive -
                    ioctl(SIOCSIFADDR) with IPv6
           Product: valgrind
           Version: 3.19.0
          Platform: Other
                OS: Linux
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: memcheck
          Assignee: jsew...@acm.org
          Reporter: arequip...@gmail.com
  Target Milestone: ---

It seems that Valgrind does not know about struct in6_ifreq, which is used when
manipulating IPv6 addresses with ioctl().  (See netdevice(7).)  Thus, the
following code causes Valgrind to incorrectly detect use of unitialized memory:

static void ipou_set_tun_ip6(void)
{
        struct in6_ifreq ifr6;

        memset(&ifr6, 0, sizeof ifr6);
        ifr6.ifr6_addr = ipou_tun_addr6;
        ifr6.ifr6_prefixlen = ipou_tun_pfx6;
        ifr6.ifr6_ifindex = ipou_tun_index;

        if (ioctl(ipou_socket_fd, SIOCSIFADDR, &ifr6) < 0)
                IPOU_FATAL("ioctl failed: SIOCSIFADDR: %m");
}

(ipou_socket_fd is an AF_INET6 socket.)

The error reported is:

==12298== Syscall param ioctl(SIOCSIF*ADDR) points to uninitialised byte(s)
==12298==    at 0x499776F: ioctl (in /usr/lib64/libc.so.6)
==12298==    by 0x4082C1: ipou_set_tun_ip6 (tun.c:70)
==12298==    by 0x4085EF: ipou_tun_setup (tun.c:123)
==12298==    by 0x402991: ipou_client_hello (client.c:99)
==12298==    by 0x4029CF: ipou_client_setup (client.c:110)
==12298==    by 0x405765: main (main.c:51)
==12298==  Address 0x1fff000298 is on thread 1's stack
==12298==  in frame #1, created by ipou_set_tun_ip6 (tun.c:62)
==12298==

The error can be suppressed by ensuring that the initialized block passed to
ioctl() is at least as large as a struct ifreq.

static void ipou_set_tun_ip6(void)
{
        union { struct in6_ifreq ifr6; struct ifreq ifr; } req;

        memset(&req, 0, sizeof req);
        req.ifr6.ifr6_addr = ipou_tun_addr6;
        req.ifr6.ifr6_prefixlen = ipou_tun_pfx6;
        req.ifr6.ifr6_ifindex = ipou_tun_index;

        if (ioctl(ipou_socket_fd, SIOCSIFADDR, &req.ifr6) < 0)
                IPOU_FATAL("ioctl failed: SIOCSIFADDR: %m");
}

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to