wg: warn if an AllowedIP has a nonzero host part
Signed-off-by: Luis Ressel <aranea@aixah.de> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									7c20ac5ce2
								
							
						
					
					
						commit
						84cf22da0d
					
				
					 1 changed files with 34 additions and 0 deletions
				
			
		
							
								
								
									
										34
									
								
								src/config.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/config.c
									
									
									
									
									
								
							| 
						 | 
					@ -287,6 +287,37 @@ err:
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool validate_netmask(struct wgallowedip *allowedip)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t *ip;
 | 
				
			||||||
 | 
						int last;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (allowedip->family) {
 | 
				
			||||||
 | 
							case AF_INET:
 | 
				
			||||||
 | 
								last = 0;
 | 
				
			||||||
 | 
								ip = (uint32_t *)&allowedip->ip4;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case AF_INET6:
 | 
				
			||||||
 | 
								last = 3;
 | 
				
			||||||
 | 
								ip = (uint32_t *)&allowedip->ip6;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return true; /* We don't know how to validate it, so say 'okay'. */
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (int i = last; i >= 0; --i) {
 | 
				
			||||||
 | 
							uint32_t mask = ~0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (allowedip->cidr >= 32 * (i + 1))
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							if (allowedip->cidr > 32 * i)
 | 
				
			||||||
 | 
								mask >>= (allowedip->cidr - 32 * i);
 | 
				
			||||||
 | 
							if (ntohl(ip[i]) & mask)
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline bool parse_allowedips(struct wgpeer *peer, struct wgallowedip **last_allowedip, const char *value)
 | 
					static inline bool parse_allowedips(struct wgpeer *peer, struct wgallowedip **last_allowedip, const char *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -339,6 +370,9 @@ static inline bool parse_allowedips(struct wgpeer *peer, struct wgallowedip **la
 | 
				
			||||||
			goto err;
 | 
								goto err;
 | 
				
			||||||
		new_allowedip->cidr = cidr;
 | 
							new_allowedip->cidr = cidr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!validate_netmask(new_allowedip))
 | 
				
			||||||
 | 
								fprintf(stderr, "Warning: AllowedIP has nonzero host part: %s/%s\n", ip, mask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (allowedip)
 | 
							if (allowedip)
 | 
				
			||||||
			allowedip->next_allowedip = new_allowedip;
 | 
								allowedip->next_allowedip = new_allowedip;
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue