[BB#90]: Fix bug in ACL netmask generation
Thanks to John Horne who diagnosed this issue and found the problem.
This commit is contained in:
		
							parent
							
								
									95a6f8259c
								
							
						
					
					
						commit
						1db982793d
					
				
							
								
								
									
										25
									
								
								src/acl.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/acl.c
									
									
									
									
									
								
							| @ -66,8 +66,8 @@ struct acl_s { | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| static int | static int | ||||||
| fill_netmask_array (char *bitmask_string, unsigned char array[], | fill_netmask_array (char *bitmask_string, int v6, | ||||||
|                     size_t len) |                     unsigned char array[], size_t len) | ||||||
| { | { | ||||||
|         unsigned int i; |         unsigned int i; | ||||||
|         unsigned long int mask; |         unsigned long int mask; | ||||||
| @ -81,7 +81,14 @@ fill_netmask_array (char *bitmask_string, unsigned char array[], | |||||||
|             || (errno != 0 && mask == 0) || (endptr == bitmask_string)) |             || (errno != 0 && mask == 0) || (endptr == bitmask_string)) | ||||||
|                 return -1; |                 return -1; | ||||||
| 
 | 
 | ||||||
|         /* valid range for a bit mask */ |         if (v6 == 0) { | ||||||
|  |                 /* The mask comparison is done as an IPv6 address, so
 | ||||||
|  |                  * convert to a longer mask in the case of IPv4 | ||||||
|  |                  * addresses. */ | ||||||
|  |                 mask += 12 * 8; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /* check valid range for a bit mask */ | ||||||
|         if (mask > (8 * len)) |         if (mask > (8 * len)) | ||||||
|                 return -1; |                 return -1; | ||||||
| 
 | 
 | ||||||
| @ -160,6 +167,9 @@ int insert_acl (char *location, acl_access_t access_type, vector_t *access_list) | |||||||
|                  */ |                  */ | ||||||
|                 p = strchr (location, '/'); |                 p = strchr (location, '/'); | ||||||
|                 if (p != NULL) { |                 if (p != NULL) { | ||||||
|  |                         char dst[sizeof(struct in6_addr)]; | ||||||
|  |                         int v6; | ||||||
|  | 
 | ||||||
|                         /*
 |                         /*
 | ||||||
|                          * We have a slash, so it's intended to be an |                          * We have a slash, so it's intended to be an | ||||||
|                          * IP address with mask |                          * IP address with mask | ||||||
| @ -171,8 +181,15 @@ int insert_acl (char *location, acl_access_t access_type, vector_t *access_list) | |||||||
|                         acl.type = ACL_NUMERIC; |                         acl.type = ACL_NUMERIC; | ||||||
|                         memcpy (acl.address.ip.octet, ip_dst, IPV6_LEN); |                         memcpy (acl.address.ip.octet, ip_dst, IPV6_LEN); | ||||||
| 
 | 
 | ||||||
|  |                         /* Check if the IP address before the netmask is
 | ||||||
|  |                          * an IPv6 address */ | ||||||
|  |                         if (inet_pton(AF_INET6, location, dst) > 0) | ||||||
|  |                                 v6 = 1; | ||||||
|  |                         else | ||||||
|  |                                 v6 = 0; | ||||||
|  | 
 | ||||||
|                         if (fill_netmask_array |                         if (fill_netmask_array | ||||||
|                             (p + 1, &(acl.address.ip.mask[0]), IPV6_LEN) |                             (p + 1, v6, &(acl.address.ip.mask[0]), IPV6_LEN) | ||||||
|                             < 0) |                             < 0) | ||||||
|                                 return -1; |                                 return -1; | ||||||
|                 } else { |                 } else { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Mukund Sivaraman
						Mukund Sivaraman