Skip to contentSkip to conversation

dhcp: Add domain name option handler

PATCH In review Tim Kourt 2 participants 2 messages Oct 18, 2019 – Oct 21, 2019

lore
Share & tools
lore

Tim Kourt

author
#0 lore raw

PATCH 1/1 dhcp: Add domain name option handler

Add parser and accessor for domain name lease option.

---
 ell/dhcp-lease.c   | 16 +++++++++++++++-
 ell/dhcp-private.h |  1 +
 ell/dhcp.h         |  1 +
 3 files changed, 17 insertions(+), 1 deletion(-)
ell/dhcp-lease.c +15 -1
index a48cfa4..ba57322 100644
@@ -45,6 +45,8 @@ void _dhcp_lease_free(struct l_dhcp_lease *lease)
 		return;
 
 	l_free(lease->dns);
+	l_free(lease->domain_name);
+
 	l_free(lease);
 }
 
@@ -99,6 +101,10 @@ struct l_dhcp_lease *_dhcp_lease_parse_options(struct dhcp_message_iter *iter)
 				}
 			}
 			break;
+		case L_DHCP_OPTION_DOMAIN_NAME:
+			if (l >= 1)
+				lease->domain_name = l_strdup(v);
+			break;
 		default:
 			break;
 		}
@@ -124,7 +130,7 @@ struct l_dhcp_lease *_dhcp_lease_parse_options(struct dhcp_message_iter *iter)
 
 	return lease;
 error:
-	l_free(lease);
+	_dhcp_lease_free(lease);
 	return NULL;
 }
 
@@ -201,6 +207,14 @@ LIB_EXPORT char **l_dhcp_lease_get_dns(const struct l_dhcp_lease *lease)
 	return dns_list;
 }
 
+LIB_EXPORT char *l_dhcp_lease_get_domain_name(const struct l_dhcp_lease *lease)
+{
+	if (unlikely(!lease))
+		return NULL;
+
+	return l_strdup(lease->domain_name);
+}
+
 LIB_EXPORT uint32_t l_dhcp_lease_get_t1(const struct l_dhcp_lease *lease)
 {
 	if (unlikely(!lease))
ell/dhcp-private.h +1 -0
index 6554fc6..a75bb8b 100644
@@ -120,6 +120,7 @@ struct l_dhcp_lease {
 	uint32_t t2;
 	uint32_t router;
 	uint32_t *dns;
+	char *domain_name;
 };
 
 struct l_dhcp_lease *_dhcp_lease_new(void);
ell/dhcp.h +1 -0
index c3a4988..b8a5b41 100644
@@ -95,6 +95,7 @@ char *l_dhcp_lease_get_netmask(const struct l_dhcp_lease *lease);
 char *l_dhcp_lease_get_broadcast(const struct l_dhcp_lease *lease);
 char *l_dhcp_lease_get_server_id(const struct l_dhcp_lease *lease);
 char **l_dhcp_lease_get_dns(const struct l_dhcp_lease *lease);
+char *l_dhcp_lease_get_domain_name(const struct l_dhcp_lease *lease);
 
 uint32_t l_dhcp_lease_get_t1(const struct l_dhcp_lease *lease);
 uint32_t l_dhcp_lease_get_t2(const struct l_dhcp_lease *lease);
Signature · 1 line
2.13.6
#1 lore raw

Hi Tim,

Quoted 21 lines · Tim Kourt

Add parser and accessor for domain name lease option.

---
  ell/dhcp-lease.c   | 16 +++++++++++++++-
  ell/dhcp-private.h |  1 +
  ell/dhcp.h         |  1 +
  3 files changed, 17 insertions(+), 1 deletion(-)
ell/dhcp-lease.c +2 -0
index a48cfa4..ba57322 100644
@@ -45,6 +45,8 @@ void _dhcp_lease_free(struct l_dhcp_lease *lease)
  		return;
 
  	l_free(lease->dns);
+	l_free(lease->domain_name);
+
  	l_free(lease);
  }
 

ell/dhcp-lease.c struct l_dhcp_lease *_dhcp_lease_parse_options(struct dhcp_message_iter *iter) · line 107

Quoted 7 lines
ell/dhcp-lease.c +4 -0
@@ -99,6 +101,10 @@ struct l_dhcp_lease *_dhcp_lease_parse_options(struct dhcp_message_iter *iter)
  				}
  			}
  			break;
+		case L_DHCP_OPTION_DOMAIN_NAME:
+			if (l >= 1)
+				lease->domain_name = l_strdup(v);
+			break;

No. You cannot assume that v is null terminated. Nobody will guarantee that the packets coming from the 'dhcp server' aren't fuzzed or are not from dhcp server at all.

Quoted 13 lines
ell/dhcp-lease.c +1 -1
  		default:
  			break;
  		}
@@ -124,7 +130,7 @@ struct l_dhcp_lease *_dhcp_lease_parse_options(struct dhcp_message_iter *iter)
 
  	return lease;
  error:
-	l_free(lease);
+	_dhcp_lease_free(lease);
  	return NULL;
  }
 

ell/dhcp-lease.c LIB_EXPORT char **l_dhcp_lease_get_dns(const struct l_dhcp_lease *lease) · line 215

Quoted 9 lines
ell/dhcp-lease.c +6 -0
@@ -201,6 +207,14 @@ LIB_EXPORT char **l_dhcp_lease_get_dns(const struct l_dhcp_lease *lease)
  	return dns_list;
  }
 
+LIB_EXPORT char *l_dhcp_lease_get_domain_name(const struct l_dhcp_lease *lease)
+{
+	if (unlikely(!lease))
+		return NULL;
+
+	return l_strdup(lease->domain_name);

Strictly speaking this can be const char *, but okay.

Quoted 23 lines
ell/dhcp-lease.c +2 -0
+}
+
  LIB_EXPORT uint32_t l_dhcp_lease_get_t1(const struct l_dhcp_lease *lease)
  {
  	if (unlikely(!lease))
ell/dhcp-private.h +1 -0
index 6554fc6..a75bb8b 100644
@@ -120,6 +120,7 @@ struct l_dhcp_lease {
  	uint32_t t2;
  	uint32_t router;
  	uint32_t *dns;
+	char *domain_name;
  };
 
  struct l_dhcp_lease *_dhcp_lease_new(void);
ell/dhcp.h +0 -0
index c3a4988..b8a5b41 100644

ell/dhcp.h char *l_dhcp_lease_get_netmask(const struct l_dhcp_lease *lease); · line 101

Quoted 7 lines
ell/dhcp.h +1 -0
@@ -95,6 +95,7 @@ char *l_dhcp_lease_get_netmask(const struct l_dhcp_lease *lease);
  char *l_dhcp_lease_get_broadcast(const struct l_dhcp_lease *lease);
  char *l_dhcp_lease_get_server_id(const struct l_dhcp_lease *lease);
  char **l_dhcp_lease_get_dns(const struct l_dhcp_lease *lease);
+char *l_dhcp_lease_get_domain_name(const struct l_dhcp_lease *lease);
 
  uint32_t l_dhcp_lease_get_t1(const struct l_dhcp_lease *lease);
  uint32_t l_dhcp_lease_get_t2(const struct l_dhcp_lease *lease);

Regards,
-Denis