<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>