summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/pr53703.c
blob: c9e10abf594fccf3338cea58a07823103305e4c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* 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) );
		    }
		}
	    }
	}
    }
}