57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From f8c77edbdffb8ada7753ea9fa104f0f6da70cfe3 Mon Sep 17 00:00:00 2001
 | |
| From: Simon Kelley <simon@thekelleys.org.uk>
 | |
| Date: Thu, 10 Jan 2019 21:58:18 +0000
 | |
| Subject: [PATCH] Fix removal of DHCP_CLIENT_MAC options from DHCPv6 relay
 | |
|  replies.
 | |
| 
 | |
| ---
 | |
|  src/rfc3315.c | 30 +++++++++++++++++-------------
 | |
|  1 file changed, 17 insertions(+), 13 deletions(-)
 | |
| 
 | |
| diff --git a/src/rfc3315.c b/src/rfc3315.c
 | |
| index d3c1722..79b2a86 100644
 | |
| --- a/src/rfc3315.c
 | |
| +++ b/src/rfc3315.c
 | |
| @@ -219,21 +219,25 @@ static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz,
 | |
|        if (opt6_ptr(opt, 0) + opt6_len(opt) > end) 
 | |
|          return 0;
 | |
|       
 | |
| -      int o = new_opt6(opt6_type(opt));
 | |
| -      if (opt6_type(opt) == OPTION6_RELAY_MSG)
 | |
| +      /* Don't copy MAC address into reply. */
 | |
| +      if (opt6_type(opt) != OPTION6_CLIENT_MAC)
 | |
|  	{
 | |
| -	  struct in6_addr align;
 | |
| -	  /* the packet data is unaligned, copy to aligned storage */
 | |
| -	  memcpy(&align, inbuff + 2, IN6ADDRSZ); 
 | |
| -	  state->link_address = &align;
 | |
| -	  /* zero is_unicast since that is now known to refer to the 
 | |
| -	     relayed packet, not the original sent by the client */
 | |
| -	  if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
 | |
| -	    return 0;
 | |
| +	  int o = new_opt6(opt6_type(opt));
 | |
| +	  if (opt6_type(opt) == OPTION6_RELAY_MSG)
 | |
| +	    {
 | |
| +	      struct in6_addr align;
 | |
| +	      /* the packet data is unaligned, copy to aligned storage */
 | |
| +	      memcpy(&align, inbuff + 2, IN6ADDRSZ); 
 | |
| +	      state->link_address = &align;
 | |
| +	      /* zero is_unicast since that is now known to refer to the 
 | |
| +		 relayed packet, not the original sent by the client */
 | |
| +	      if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
 | |
| +		return 0;
 | |
| +	    }
 | |
| +	  else
 | |
| +	    put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
 | |
| +	  end_opt6(o);
 | |
|  	}
 | |
| -      else if (opt6_type(opt) != OPTION6_CLIENT_MAC)
 | |
| -	put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
 | |
| -      end_opt6(o);	    
 | |
|      }
 | |
|    
 | |
|    return 1;
 | |
| -- 
 | |
| 2.39.1
 | |
| 
 |