blob: c9e10abf594fccf3338cea58a07823103305e4c4 [file] [log] [blame]
/* 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) );
}
}
}
}
}
}