/* Reduced test case from PR53703. Used to ICE. */ /* { dg-do compile } */ /* { dg-options "-w" } */ typedef long unsigned int size_t; typedef unsigned short int sa_family_t; struct sockaddr {}; typedef unsigned char __u8; typedef unsigned short __u16; typedef unsigned int __u32; struct nlmsghdr { __u32 nlmsg_len; __u16 nlmsg_type; }; struct ifaddrmsg { __u8 ifa_family; }; enum { IFA_ADDRESS, IFA_LOCAL, }; enum { RTM_NEWLINK = 16, RTM_NEWADDR = 20, }; struct rtattr { unsigned short rta_len; unsigned short rta_type; }; struct ifaddrs { struct ifaddrs *ifa_next; unsigned short ifa_flags; }; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; struct nlmsg_list { struct nlmsg_list *nlm_next; int size; }; struct rtmaddr_ifamap { void *address; void *local; int address_len; int local_len; }; int usagi_getifaddrs (struct ifaddrs **ifap) { struct nlmsg_list *nlmsg_list, *nlmsg_end, *nlm; size_t dlen, xlen, nlen; int build; for (build = 0; build <= 1; build++) { struct ifaddrs *ifl = ((void *)0), *ifa = ((void *)0); struct nlmsghdr *nlh, *nlh0; uint16_t *ifflist = ((void *)0); struct rtmaddr_ifamap ifamap; for (nlm = nlmsg_list; nlm; nlm = nlm->nlm_next) { int nlmlen = nlm->size; for (nlh = nlh0; ((nlmlen) >= (int)sizeof(struct nlmsghdr) && (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && (nlh)->nlmsg_len <= (nlmlen)); nlh = ((nlmlen) -= ( (((nlh)->nlmsg_len)+4U -1) & ~(4U -1) ), (struct nlmsghdr*)(((char*)(nlh)) + ( (((nlh)->nlmsg_len)+4U -1) & ~(4U -1) )))) { struct ifinfomsg *ifim = ((void *)0); struct ifaddrmsg *ifam = ((void *)0); struct rtattr *rta; sa_family_t nlm_family = 0; uint32_t nlm_scope = 0, nlm_index = 0; memset (&ifamap, 0, sizeof (ifamap)); switch (nlh->nlmsg_type) { case RTM_NEWLINK: ifim = (struct ifinfomsg *) ((void*)(((char*)nlh) + ((0)+( ((((int) ( ((sizeof(struct nlmsghdr))+4U -1) & ~(4U -1) )))+4U -1) & ~(4U -1) )))); case RTM_NEWADDR: ifam = (struct ifaddrmsg *) ((void*)(((char*)nlh) + ((0)+( ((((int) ( ((sizeof(struct nlmsghdr))+4U -1) & ~(4U -1) )))+4U -1) & ~(4U -1) )))); nlm_family = ifam->ifa_family; if (build) ifa->ifa_flags = ifflist[nlm_index]; break; default: continue; } if (!build) { void *rtadata = ((void*)(((char*)(rta)) + (( ((sizeof(struct rtattr))+4 -1) & ~(4 -1) ) + (0)))); size_t rtapayload = ((int)((rta)->rta_len) - (( ((sizeof(struct rtattr))+4 -1) & ~(4 -1) ) + (0))); switch (nlh->nlmsg_type) { case RTM_NEWLINK: break; case RTM_NEWADDR: if (nlm_family == 17) break; switch (rta->rta_type) { case IFA_ADDRESS: ifamap.address = rtadata; ifamap.address_len = rtapayload; case IFA_LOCAL: ifamap.local = rtadata; } } } if (nlh->nlmsg_type == RTM_NEWADDR && nlm_family != 17) { if (!ifamap.local) { ifamap.local = ifamap.address; ifamap.local_len = ifamap.address_len; } if (!ifamap.address) { ifamap.address = ifamap.local; } if (ifamap.address_len != ifamap.local_len || (ifamap.address != ((void *)0) && memcmp (ifamap.address, ifamap.local, ifamap.address_len))) { if (!build) dlen += (((ifa_sa_len (nlm_family, ifamap.address_len))+4U -1) & ~(4U -1) ); } } } } } }