<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        text-indent:21.0pt;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:934439398;
        mso-list-type:hybrid;
        mso-list-template-ids:-1669835476 -836590608 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:18.0pt;
        text-indent:-18.0pt;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%2\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:42.0pt;
        text-indent:-21.0pt;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:63.0pt;
        text-indent:-21.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%5\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:126.0pt;
        text-indent:-21.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%8\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:189.0pt;
        text-indent:-21.0pt;}
@list l1
        {mso-list-id:1090271911;
        mso-list-type:hybrid;
        mso-list-template-ids:1222658804 1493462294 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:18.0pt;
        text-indent:-18.0pt;}
@list l1:level2
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%2\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:42.0pt;
        text-indent:-21.0pt;}
@list l1:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:63.0pt;
        text-indent:-21.0pt;}
@list l1:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;}
@list l1:level5
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%5\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;}
@list l1:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:126.0pt;
        text-indent:-21.0pt;}
@list l1:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;}
@list l1:level8
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%8\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;}
@list l1:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:189.0pt;
        text-indent:-21.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="#0563C1" vlink="#954F72" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">This issue is caused by dnsmasq incorrectly handling the client's tag information. It is not related to adding the opts item.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">This is a necessary issue, and the steps to reproduce it are as follows:<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">Run dnsmasq with --dhcp-hostsfile<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># dnsmasq --dhcp-hostsfile=/var/run/test_dhcp/host --dhcp-range=192.168.0.0,192.168.0.240,infinite<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># cat /var/run/test_dhcp/host<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:0cm"><span lang="EN-US">d0:c0:c4:66:25:81,host-192-168-0-159.dhcp-test, 192.168.0.159,set:port-cfc5b9f7-2760-42d6-899b-6817fe405721<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">Request a dynamic address for the client that comply with the host rule<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># dhclient -cf /etc/dhcp/dhclient.conf -pf /tmp/eth1.pid -lf /tmp/eth1.lease eth1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># cat /etc/dhcp/dhclient.conf<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">send dhcp-client-identifier " host-192-168-0-159.dhcp-test";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># ip link show eth1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:21.0pt"><span lang="EN-US">link/ether d0:c0:c4:66:25:81 brd ff:ff:ff:ff:ff:ff<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:21.0pt"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">Send SIGHUP to dnsmasq<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># kill -1 446255<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In addition to the above issue, dnsmasq may also be related to a UAF problem. Here is the patch I provided for fixing these issues.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">From 31b883b2bcaf70b74549128ded853f4942e5f6ae Mon Sep 17 00:00:00 2001<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">From: renmingshuai <renmingshuai@huawei.com><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Date: Thu, 1 Aug 2024 19:56:47 +0800<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Subject: [PATCH] Fix a coredump and UAF caused by trying to free non-heap<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">objects.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">There is an issue with the process of adding a netid in dhcp_deply for dnsmasq, which will trigger coredump and UAF.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">When processing DHCP requests, dnsmasq uses local variables such as known_id, iface_id and cpewan_id, to store the client's tag information and add them to the netid list.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Afterwards, dnsmasq will call find_config() to find a dhcp config and add the netid list to the global daemon->dhcp_conf->netid list.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In addition, dnsmasq will also add the netid from other global variables to the config->netid list, such as daemon->dhcp_match->netid<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">When dnsmasq receives the hup signal, it will call clear_dynamic_conf() to free the netid in the config's netid list, which will trigger at least the following three issues:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">1. config->netid->list may point to a stack address (such as the address of the local variable "known_id" mentioned above), and the content of this address may be assigned other values.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Attempting to free this illegal address value will trigger coredump.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2. config->netid->list->net may point to a string constant (such as known_id.net="knwon"), and attempting to free this address will also trigger coredump.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3. The address pointed to by config->netid->list may be also added to other global lists, such as daemon->dhcp_match->netid.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">After the address is freed, it still exists in the daemon->dhcp_match list, which may trigger UAF issues.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Calling dhcp_netid_creat() to allocate new memory for the client's tag information can solve the above issues. These memories will be fully freed in clear_rynamic_comf().<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Signed-off-by: renmingshuai <renmingshuai@huawei.com><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">src/dnsmasq.h |  1 +<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">src/option.c  |  2 +-<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">src/rfc2131.c | 48 ++++++++++++++----------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3 files changed, 16 insertions(+), 35 deletions(-)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/src/dnsmasq.h b/src/dnsmasq.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index e455c3f..3376655 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/src/dnsmasq.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/src/dnsmasq.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1519,6 +1519,7 @@ char *parse_server(char *arg, struct server_details *sdetails);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">char *parse_server_addr(struct server_details *sdetails);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int parse_server_next(struct server_details *sdetails);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int option_read_dynfile(char *file, int flags);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+struct dhcp_netid *dhcp_netid_create(const char *net, struct dhcp_netid *next);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/* forward.c */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">void reply_query(int fd, time_t now);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/src/option.c b/src/option.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index f4ff7c0..480ef5f 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/src/option.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/src/option.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1314,7 +1314,7 @@ static char *set_prefix(char *arg)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    return arg;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-static struct dhcp_netid *dhcp_netid_create(const char *net, struct dhcp_netid *next)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+struct dhcp_netid *dhcp_netid_create(const char *net, struct dhcp_netid *next)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_netid *tt;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   tt = opt_malloc(sizeof (struct dhcp_netid));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/src/rfc2131.c b/src/rfc2131.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 68834ea..050d610 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/src/rfc2131.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/src/rfc2131.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -96,7 +96,6 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   unsigned char *agent_id = NULL, *uuid = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   unsigned char *emac = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   int vendor_class_len = 0, emac_len = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  struct dhcp_netid known_id, iface_id, cpewan_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_opt *o;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   unsigned char pxe_uuid[17];<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   unsigned char *oui = NULL, *serial = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -107,9 +106,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   subnet_addr.s_addr = override.s_addr = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   /* set tag with name == interface */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  iface_id.net = iface_name;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  iface_id.next = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  netid = &iface_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+  netid = dhcp_netid_create(iface_name, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   if (mess->op != BOOTREQUEST || mess->hlen > DHCP_CHADDR_MAX)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -173,9 +170,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                     the gateway id back. Note that the device class is optional */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  if (oui && serial)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                    {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                     cpewan_id.net = "cpewan-id";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                     cpewan_id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                     netid = &cpewan_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                     netid = dhcp_netid_create("cpewan-id", netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                    }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">               }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -226,8 +221,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  vendor->len == option_len(sopt) &&<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  memcmp(option_ptr(sopt, 0), vendor->data, vendor->len) == 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 vendor->netid.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 netid = &vendor->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                 netid = dhcp_netid_create(vendor->netid.net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -263,8 +257,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        (mac->hwaddr_type == mess->htype || mac->hwaddr_type == 0) &&<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        memcmp_masked(mac->hwaddr, mess->chaddr, mess->hlen, mac->mask))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-       mac->netid.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-       netid = &mac->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       netid = dhcp_netid_create(mac->netid.net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   /* Determine network for this packet. Our caller will have already linked all the<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -453,8 +446,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       if (match)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         o->netid->next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         netid = o->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+         netid = dhcp_netid_create(o->netid->net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -499,8 +491,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          for (i = 0; i <= (option_len(opt) - vendor->len); i++)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            if (memcmp(vendor->data, option_ptr(opt, i), vendor->len) == 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">             {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-               vendor->netid.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-               netid = &vendor->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+               netid = dhcp_netid_create(vendor->netid.net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">              }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -531,16 +522,12 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   /* set "known" tag for known hosts */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   if (config)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      known_id.net = "known";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      known_id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      netid = &known_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+      netid = dhcp_netid_create("known", netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   else if (find_config(daemon->dhcp_conf, NULL, clid, clid_len,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                       mess->chaddr, mess->hlen, mess->htype, NULL, run_tag_if(netid)))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      known_id.net = "known-othernet";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      known_id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      netid = &known_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+      netid = dhcp_netid_create("known-othernet", netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   if (mess_type == 0 && !pxe)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -580,16 +567,12 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          memcpy(daemon->dhcp_buff2, mess->file, sizeof(mess->file));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          daemon->dhcp_buff2[sizeof(mess->file) + 1] = 0; /* ensure zero term. */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         id.net = (char *)daemon->dhcp_buff2;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         netid = &id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+         netid = dhcp_netid_create((char *)daemon->dhcp_buff2, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       /* Add "bootp" as a tag to allow different options, address ranges etc<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">         for BOOTP clients */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      bootp_id.net = "bootp";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      bootp_id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-      netid = &bootp_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+      netid = dhcp_netid_create("bootp", netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       tagif_netid = run_tag_if(netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -634,8 +617,8 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            message = _("wrong network");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          else if (context->netid.net)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-             context->netid.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-             tagif_netid = run_tag_if(&context->netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+             netid = dhcp_netid_create(context->netid.net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+             tagif_netid = run_tag_if(netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          log_tags(tagif_netid, ntohl(mess->xid));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -770,8 +753,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          if (hostname_isequal(client_hostname, m->name) &&<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">              (save == 0 || m->wildcard))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-             m->netid->next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-             netid = m->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+             netid = dhcp_netid_create(m->netid->net, netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">          if (save != 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -808,9 +790,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  config = new;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  /* set "known" tag for known hosts */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 known_id.net = "known";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 known_id.next = netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 netid = &known_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                 netid = dhcp_netid_create("known", netid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2.33.0<o:p></o:p></span></p>
</div>
</body>
</html>