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)10int 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)31main (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