<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/23982">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo_ss7: Truncate route 'mask' to point code bit length<br><br>Otherwise we run into the problem that a route with mask 0xffffff<br>differs from one with a mask of 0x3fff despite having only 14 bit<br>point code length and them being logically equal.<br><br>Change-Id: I5d5c828de45724d93a0461bb0dd7858fd8378acd<br>Related: SYS#5422<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/osmo_ss7.c<br>2 files changed, 21 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>index b717d53..a278b59 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -114,6 +114,7 @@</span><br><span> struct osmo_sccp_instance *osmo_ss7_ensure_sccp(struct osmo_ss7_instance *inst);</span><br><span> </span><br><span> uint8_t osmo_ss7_pc_width(const struct osmo_ss7_pc_fmt *pc_fmt);</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t osmo_ss7_pc_normalize(const struct osmo_ss7_pc_fmt *pc_fmt, uint32_t pc);</span><br><span> </span><br><span> /***********************************************************************</span><br><span>  * MTP Users (Users of MTP, such as SCCP or ISUP)</span><br><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index 98dfc0c..de072b4 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -196,6 +196,15 @@</span><br><span>  return pc_fmt->component_len[0] + pc_fmt->component_len[1] + pc_fmt->component_len[2];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* truncate pc or mask to maximum permitted length. This solves</span><br><span style="color: hsl(120, 100%, 40%);">+ * callers specifying arbitrary large masks which then evade duplicate</span><br><span style="color: hsl(120, 100%, 40%);">+ * detection with longer mask lengths */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t osmo_ss7_pc_normalize(const struct osmo_ss7_pc_fmt *pc_fmt, uint32_t pc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t mask = (1 << osmo_ss7_pc_width(pc_fmt))-1;</span><br><span style="color: hsl(120, 100%, 40%);">+     return pc & mask;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* get the number of bits we must shift the given component of a point</span><br><span>  * code in this ss7_instance */</span><br><span> static unsigned int get_pc_comp_shift(const struct osmo_ss7_pc_fmt *pc_fmt,</span><br><span>@@ -702,6 +711,9 @@</span><br><span>         struct osmo_ss7_route *rt;</span><br><span> </span><br><span>       OSMO_ASSERT(ss7_initialized);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       dpc = osmo_ss7_pc_normalize(&rtbl->inst->cfg.pc_fmt, dpc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /* we assume the routes are sorted by mask length, i.e. more</span><br><span>          * specific routes first, and less specific routes with shorter</span><br><span>       * mask later */</span><br><span>@@ -720,6 +732,9 @@</span><br><span>       struct osmo_ss7_route *rt;</span><br><span> </span><br><span>       OSMO_ASSERT(ss7_initialized);</span><br><span style="color: hsl(120, 100%, 40%);">+ mask = osmo_ss7_pc_normalize(&rtbl->inst->cfg.pc_fmt, mask);</span><br><span style="color: hsl(120, 100%, 40%);">+        dpc = osmo_ss7_pc_normalize(&rtbl->inst->cfg.pc_fmt, dpc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /* we assume the routes are sorted by mask length, i.e. more</span><br><span>          * specific routes first, and less specific routes with shorter</span><br><span>       * mask later */</span><br><span>@@ -775,6 +790,11 @@</span><br><span>      struct osmo_ss7_linkset *lset;</span><br><span>       struct osmo_ss7_as *as = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* truncate mask to maximum.  Let's avoid callers specifying arbitrary large</span><br><span style="color: hsl(120, 100%, 40%);">+       * masks to ensure we don't fail duplicate detection with longer mask lengths */</span><br><span style="color: hsl(120, 100%, 40%);">+  mask = osmo_ss7_pc_normalize(&rtbl->inst->cfg.pc_fmt, mask);</span><br><span style="color: hsl(120, 100%, 40%);">+        pc = osmo_ss7_pc_normalize(&rtbl->inst->cfg.pc_fmt, pc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         OSMO_ASSERT(ss7_initialized);</span><br><span>        lset = osmo_ss7_linkset_find_by_name(rtbl->inst, linkset_name);</span><br><span>   if (!lset) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/23982">change 23982</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmo-sccp/+/23982"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I5d5c828de45724d93a0461bb0dd7858fd8378acd </div>
<div style="display:none"> Gerrit-Change-Number: 23982 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>