<p>Friendly Automation <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/14609">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Kevin Harwell: Looks good to me, approved
George Joseph: Looks good to me, but someone else must approve
Friendly Automation: Approved for Submit
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">menuselect: Resolve infinite loop in dependency scenario.<br><br>Given a scenario where a module has a dependency on both<br>an external library and a module if the external library was<br>available and the module was not an infinite loop would<br>occur. This happened due to the code changing the dependecy<br>status to no failure on each dependency checking loop<br>iteration, resulting in the code thinking that it had<br>gone from no failure to failure each time triggering another<br>dependency check.<br><br>This change makes it so that the old dependency status is<br>preserved throughout the dependency checking allowing it to<br>determine that after the first iteration the dependency<br>status does not transition from no failure to failure.<br><br>ASTERISK-28930<br><br>Change-Id: Iea06d45d9fd6d8bfd068882a0bb7e23a53ec3e84<br>---<br>M menuselect/menuselect.c<br>M menuselect/menuselect.h<br>2 files changed, 8 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/menuselect/menuselect.c b/menuselect/menuselect.c</span><br><span>index 908b2ea..2eea3f0 100644</span><br><span>--- a/menuselect/menuselect.c</span><br><span>+++ b/menuselect/menuselect.c</span><br><span>@@ -630,14 +630,14 @@</span><br><span> struct member *mem;</span><br><span> struct reference *dep;</span><br><span> struct dep_file *dep_file;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int changed, old_failure;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int changed;</span><br><span> </span><br><span> AST_LIST_TRAVERSE(&categories, cat, list) {</span><br><span> AST_LIST_TRAVERSE(&cat->members, mem, list) {</span><br><span> if (mem->is_separator) {</span><br><span> continue;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- old_failure = mem->depsfailed;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem->depsfailedold = mem->depsfailed;</span><br><span> AST_LIST_TRAVERSE(&mem->deps, dep, list) {</span><br><span> if (dep->member)</span><br><span> continue;</span><br><span>@@ -655,7 +655,7 @@</span><br><span> break; /* This dependency is not met, so we can stop now */</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (old_failure == SOFT_FAILURE && mem->depsfailed != HARD_FAILURE)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mem->depsfailedold == SOFT_FAILURE && mem->depsfailed != HARD_FAILURE)</span><br><span> mem->depsfailed = SOFT_FAILURE;</span><br><span> }</span><br><span> }</span><br><span>@@ -673,8 +673,6 @@</span><br><span> continue;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- old_failure = mem->depsfailed;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> if (mem->depsfailed == HARD_FAILURE)</span><br><span> continue;</span><br><span> </span><br><span>@@ -693,7 +691,7 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (mem->depsfailed != old_failure) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mem->depsfailed != mem->depsfailedold) {</span><br><span> if ((mem->depsfailed == NO_FAILURE) && mem->was_defaulted) {</span><br><span> mem->enabled = !strcasecmp(mem->defaultenabled, "yes");</span><br><span> print_debug("Just set %s enabled to %d\n", mem->name, mem->enabled);</span><br><span>@@ -702,6 +700,8 @@</span><br><span> print_debug("Just set %s enabled to %d\n", mem->name, mem->enabled);</span><br><span> }</span><br><span> changed = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We need to update the old failed deps for the next loop of this */</span><br><span style="color: hsl(120, 100%, 40%);">+ mem->depsfailedold = mem->depsfailed;</span><br><span> break; /* This dependency is not met, so we can stop now */</span><br><span> }</span><br><span> }</span><br><span>diff --git a/menuselect/menuselect.h b/menuselect/menuselect.h</span><br><span>index 78ae8ef..d41859e 100644</span><br><span>--- a/menuselect/menuselect.h</span><br><span>+++ b/menuselect/menuselect.h</span><br><span>@@ -78,6 +78,8 @@</span><br><span> unsigned int was_enabled:1;</span><br><span> /*! This module has failed dependencies */</span><br><span> unsigned int depsfailed:2;</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Previous failed dependencies when calculating */</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int depsfailedold:2;</span><br><span> /*! This module has failed conflicts */</span><br><span> unsigned int conflictsfailed:2;</span><br><span> /*! This module's 'enabled' flag was changed by a default only */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/14609">change 14609</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.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.asterisk.org/c/asterisk/+/14609"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iea06d45d9fd6d8bfd068882a0bb7e23a53ec3e84 </div>
<div style="display:none"> Gerrit-Change-Number: 14609 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-CC: Jaco Kroon <jaco@uls.co.za> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>