check_acl: do full_inet_pton() only once per ip
if there's a long list of acl's, doing full_inet_pton() over and over with the same IP isn't really efficient.
This commit is contained in:
		
							parent
							
								
									88153e944f
								
							
						
					
					
						commit
						efa5892011
					
				
							
								
								
									
										18
									
								
								src/acl.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/acl.c
									
									
									
									
									
								
							| @ -305,16 +305,12 @@ STRING_TEST: | |||||||
|  *   0  IP address is denied |  *   0  IP address is denied | ||||||
|  *  -1  neither allowed nor denied. |  *  -1  neither allowed nor denied. | ||||||
|  */ |  */ | ||||||
| static int check_numeric_acl (const struct acl_s *acl, const char *ip) | static int check_numeric_acl (const struct acl_s *acl, uint8_t addr[IPV6_LEN]) | ||||||
| { | { | ||||||
|         uint8_t addr[IPV6_LEN], x, y; |         uint8_t x, y; | ||||||
|         int i; |         int i; | ||||||
| 
 | 
 | ||||||
|         assert (acl && acl->type == ACL_NUMERIC); |         assert (acl && acl->type == ACL_NUMERIC); | ||||||
|         assert (ip && strlen (ip) > 0); |  | ||||||
| 
 |  | ||||||
|         if (full_inet_pton (ip, &addr) <= 0) |  | ||||||
|                 return -1; |  | ||||||
| 
 | 
 | ||||||
|         for (i = 0; i != IPV6_LEN; ++i) { |         for (i = 0; i != IPV6_LEN; ++i) { | ||||||
|                 x = addr[i] & acl->address.ip.mask[i]; |                 x = addr[i] & acl->address.ip.mask[i]; | ||||||
| @ -339,9 +335,10 @@ static int check_numeric_acl (const struct acl_s *acl, const char *ip) | |||||||
| int check_acl (const char *ip, union sockaddr_union *addr, vector_t access_list) | int check_acl (const char *ip, union sockaddr_union *addr, vector_t access_list) | ||||||
| { | { | ||||||
|         struct acl_s *acl; |         struct acl_s *acl; | ||||||
|         int perm = 0; |         int perm = 0, is_numeric_addr; | ||||||
|         size_t i; |         size_t i; | ||||||
|         char string_addr[HOSTNAME_LENGTH]; |         char string_addr[HOSTNAME_LENGTH]; | ||||||
|  |         uint8_t numeric_addr[IPV6_LEN]; | ||||||
| 
 | 
 | ||||||
|         assert (ip != NULL); |         assert (ip != NULL); | ||||||
|         assert (addr != NULL); |         assert (addr != NULL); | ||||||
| @ -354,6 +351,8 @@ int check_acl (const char *ip, union sockaddr_union *addr, vector_t access_list) | |||||||
|         if (!access_list) |         if (!access_list) | ||||||
|                 return 1; |                 return 1; | ||||||
| 
 | 
 | ||||||
|  |         is_numeric_addr = (full_inet_pton (ip, &numeric_addr) > 0); | ||||||
|  | 
 | ||||||
|         for (i = 0; i != (size_t) vector_length (access_list); ++i) { |         for (i = 0; i != (size_t) vector_length (access_list); ++i) { | ||||||
|                 acl = (struct acl_s *) vector_getentry (access_list, i, NULL); |                 acl = (struct acl_s *) vector_getentry (access_list, i, NULL); | ||||||
|                 switch (acl->type) { |                 switch (acl->type) { | ||||||
| @ -364,7 +363,10 @@ int check_acl (const char *ip, union sockaddr_union *addr, vector_t access_list) | |||||||
|                 case ACL_NUMERIC: |                 case ACL_NUMERIC: | ||||||
|                         if (ip[0] == '\0') |                         if (ip[0] == '\0') | ||||||
|                                 continue; |                                 continue; | ||||||
|                         perm = check_numeric_acl (acl, ip); | 
 | ||||||
|  |                         perm = is_numeric_addr | ||||||
|  |                                ? check_numeric_acl (acl, numeric_addr) | ||||||
|  |                                : -1; | ||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 rofl0r
						rofl0r