Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: SIOCGIFCONF ioctl family problems under compat netbsd32



Your example code looks incorrect.  Does it work OK on NetBSD/i386?

  cur = cnf.ifc_req; l = cnf.ifc_len;
  while (l) {
    adr = (struct sockaddr *)&cur->ifr_addr;
    printf("%s %d\n", cur->ifr_name, (int)adr->sa_family);
    cur++; l -= sizeof(struct ifreq); }

The problem is that in OSIOCGIFCONF, the rule is that the new structure
offset is sizeof(struct ifreq) if adr.sa_len <= sizeof(cnf.ifru), and
adr.sa_len if it's >=.  In SIOCGIFCONF, the same rule works, but
adr.sa_len < sizeof(cnf.ifru) always, because ifru holds struct
sockaddr_storage ifru_space.  This case comes up with AF_INET6
sockaddrs, which are bigger than struct sockaddr, and I think also with
AF_LINK.

As a first step, try printing adr->sa_len, sizeof(struct ifreq) and
sizeof (cnf.ifru).  I think you'll find that with OSIOCGIFCONF on i386
or amd64, sa_len exceeds sizeof(cnf.ifru) and then the next entry is
garbage.






Home | Main Index | Thread Index | Old Index