<p> Attention is currently required from: Robert Cripps. </p>
<p><a href="https://gerrit.asterisk.org/c/asterisk/+/15230">View Change</a></p><p>1 comment:</p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0;"><p><a href="null">File res/res_pjsip_session.c:</a></p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/15230/comment/73dcd761_24b3dcda">Patch Set #1, Line 533:</a> <code style="font-family:monospace,monospace"> if (!session_media) {</code></p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;"><p style="white-space: pre-wrap; word-wrap: break-word;">To dive a bit deeper I've done some tracing of the path that fails my patch condition and indeed it uses the session_media from the if statement below ie the active state so - Given that it's an error to return a non matching "type" from the first if statement how exactly does it leak and how to prevent a leak?</p></blockquote><p style="white-space: pre-wrap; word-wrap: break-word;">Before your patch, if there's an existing session_media we just return it and there's no reference counting issues. If there's no existing session_media, we either grab the one from the active state or we create a new one and call AST_VECTOR_REPLACE which would replace a NULL with the active or new one. Again, no reference counting issues.</p><p style="white-space: pre-wrap; word-wrap: break-word;">With your patch, if there's an existing session_media and the type doesn't match, we continue on and, in your case, grab the one from the active state using the same "session_media" variable. When we call AST_VECTOR_REPLACE, we're overwriting the pointer to the non-matching session_media in that slot in the vector with a pointer to the active one. Now, the original, non-matching one is orphaned and never has its reference count decremented. If you compile Asterisk using the leak sanitizer (LEAK_SANITIZER under Compiler Flags), run your test with Asterisk in a foreground window, then stop Asterisk, you may see that object show up when the leak sanitizer dumps the orphaned memory allocations.</p><p style="white-space: pre-wrap; word-wrap: break-word;">The fix is really easy... Add a new variable "current_session_media" initialized to NULL and use _that_ to retrieve the existing one. If it exists and the type matches, great. That's what you return. If not, you continue on. After the AST_VECTOR_REPLACE returns successfully, just call ao2_cleanup(current_session_media) which tests for NULL and decrements the reference if it's not NULL.</p></li></ul></li></ul><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/15230">change 15230</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/+/15230"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-Change-Id: I6f6efa9b821ebe8881bb4c8c957f8802ddcb4b5d </div>
<div style="display:none"> Gerrit-Change-Number: 15230 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Robert Cripps <rcripps@voxbone.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: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Attention: Robert Cripps <rcripps@voxbone.com> </div>
<div style="display:none"> Gerrit-Comment-Date: Thu, 07 Jan 2021 15:15:50 +0000 </div>
<div style="display:none"> Gerrit-HasComments: Yes </div>
<div style="display:none"> Gerrit-Has-Labels: No </div>
<div style="display:none"> Comment-In-Reply-To: Robert Cripps <rcripps@voxbone.com> </div>
<div style="display:none"> Comment-In-Reply-To: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: comment </div>