<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:\5B8B\4F53;
        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:"\@\5B8B\4F53";
        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;}
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;}
--></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">DHCPv6 has the same problem.<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 9c03568ab6e35408e7833b0621246b1e91812503 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: Fri, 2 Aug 2024 17:08:59 +0800<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Subject: [PATCH] DCHPv6:Fix a coredump and UAF caused by trying to free<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">non-heap objects as DHCPv4 did.<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">src/rfc3315.c | 22 +++++++---------------<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">1 file changed, 7 insertions(+), 15 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/rfc3315.c b/src/rfc3315.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 400d939..770e4ff 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/src/rfc3315.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/src/rfc3315.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -266,7 +266,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_opt *opt_cfg;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_netid *tagif;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_config *config = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  struct dhcp_netid known_id, iface_id, v6_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+  struct dhcp_netid known_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   unsigned char outmsgtype;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_vendor *vendor;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   struct dhcp_context *context_tmp;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -287,14 +287,10 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   state->fqdn_flags = 0x01; /* default to send if we receive no FQDN option */<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 = state->iface_name;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  iface_id.next = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  state->tags = &iface_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+  state->tags = dhcp_netid_create(state->iface_name, state->tags);<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 "dhcpv6" */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  v6_id.net = "dhcpv6";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  v6_id.next = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-  state->tags = &v6_id;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+  state->tags = dhcp_netid_create("dhcpv6", state->tags);<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">   start_msg = save_counter(-1);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   /* copy over transaction-id */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -406,8 +402,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            for (i = 0; i <= (opt6_user_vendor_len(enc_opt) - vendor->len); i++)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">              if (memcmp(vendor->data, opt6_user_vendor_ptr(enc_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 = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                 state->tags = &vendor->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                 state->tags = dhcp_netid_create(vendor->netid.net, state->tags);<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">@@ -452,8 +447,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<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">-         opt_cfg->netid->next = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-         state->tags = opt_cfg->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+         state->tags = dhcp_netid_create(opt_cfg->netid->net, state->tags);<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">@@ -470,8 +464,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            ((unsigned)mac_opt->hwaddr_type == state->mac_type || mac_opt->hwaddr_type == 0) &&<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            memcmp_masked(mac_opt->hwaddr, state->mac, state->mac_len, mac_opt->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_opt->netid.next = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-           state->tags = &mac_opt->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+           state->tags = dhcp_netid_create(mac_opt->netid.net, state->tags);<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">   else if (option_bool(OPT_LOG_OPTS))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -534,8 +527,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                   if (hostname_isequal(state->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 = state->tags;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-                      state->tags = m->netid;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                      state->tags = dhcp_netid_create(m->netid->net, state->tags);<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">--<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>