1 /* PR rtl-optimization/23560 */
2 
3 struct rtattr
4 {
5   unsigned short rta_len;
6   unsigned short rta_type;
7 };
8 
9 __attribute__ ((noinline))
inet_check_attr(void * r,struct rtattr ** rta)10 int inet_check_attr (void *r, struct rtattr **rta)
11 {
12   int i;
13 
14   for (i = 1; i <= 14; i++)
15     {
16       struct rtattr *attr = rta[i - 1];
17       if (attr)
18 	{
19 	  if (attr->rta_len - sizeof (struct rtattr) < 4)
20 	    return -22;
21 	  if (i != 9 && i != 8)
22 	    rta[i - 1] = attr + 1;
23 	}
24     }
25   return 0;
26 }
27 
28 extern void abort (void);
29 
30 int
main(void)31 main (void)
32 {
33   struct rtattr rt[2];
34   struct rtattr *rta[14];
35   int i;
36 
37   rt[0].rta_len = sizeof (struct rtattr) + 8;
38   rt[0].rta_type = 0;
39   rt[1] = rt[0];
40   for (i = 0; i < 14; i++)
41     rta[i] = &rt[0];
42   if (inet_check_attr (0, rta) != 0)
43     abort ();
44   for (i = 0; i < 14; i++)
45     if (rta[i] != &rt[i != 7 && i != 8])
46       abort ();
47   for (i = 0; i < 14; i++)
48     rta[i] = &rt[0];
49   rta[1] = 0;
50   rt[1].rta_len -= 8;
51   rta[5] = &rt[1];
52   if (inet_check_attr (0, rta) != -22)
53     abort ();
54   for (i = 0; i < 14; i++)
55     if (i == 1 && rta[i] != 0)
56       abort ();
57     else if (i != 1 && i <= 5 && rta[i] != &rt[1])
58       abort ();
59     else if (i > 5 && rta[i] != &rt[0])
60       abort ();
61   return 0;
62 }
63