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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_codec: split codec_free() off of codec_init()<br><br>Both are used only in the same .c file, so make them static.<br><br>Move codec_set() guts into codec_add(): codec_set is only called by codec_add.<br>If codec_set were left separate, it'd look like the codec_init() is a bug and<br>lacks a codec_free() first. When looking at the entire context in codec_add(),<br>it becomes obvious that codec_init() should be called, not codec_free(),<br>because it is populating a previously unused entry.<br><br>Preparation to fix a memleak in a conn's codec list.<br><br>Change-Id: I120cab0a352a1e7b31c8f9c720c47b2c291311d7<br>---<br>M src/libosmo-mgcp/mgcp_codec.c<br>1 file changed, 35 insertions(+), 39 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_codec.c b/src/libosmo-mgcp/mgcp_codec.c</span><br><span>index d5b99e8..30c185c 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_codec.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_codec.c</span><br><span>@@ -76,18 +76,24 @@</span><br><span> }</span><br><span> </span><br><span> /* Initalize or reset codec information with default data. */</span><br><span style="color: hsl(0, 100%, 40%);">-void codec_init(struct mgcp_rtp_codec *codec)</span><br><span style="color: hsl(120, 100%, 40%);">+static void codec_init(struct mgcp_rtp_codec *codec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   *codec = (struct mgcp_rtp_codec){</span><br><span style="color: hsl(120, 100%, 40%);">+             .payload_type = -1,</span><br><span style="color: hsl(120, 100%, 40%);">+           .frame_duration_num = DEFAULT_RTP_AUDIO_FRAME_DUR_NUM,</span><br><span style="color: hsl(120, 100%, 40%);">+                .frame_duration_den = DEFAULT_RTP_AUDIO_FRAME_DUR_DEN,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rate = DEFAULT_RTP_AUDIO_DEFAULT_RATE,</span><br><span style="color: hsl(120, 100%, 40%);">+               .channels = DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS,</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void codec_free(struct mgcp_rtp_codec *codec)</span><br><span> {</span><br><span>   if (codec->subtype_name)</span><br><span>          talloc_free(codec->subtype_name);</span><br><span>         if (codec->audio_name)</span><br><span>            talloc_free(codec->audio_name);</span><br><span style="color: hsl(0, 100%, 40%);">-      memset(codec, 0, sizeof(*codec));</span><br><span style="color: hsl(0, 100%, 40%);">-       codec->payload_type = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-    codec->frame_duration_num = DEFAULT_RTP_AUDIO_FRAME_DUR_NUM;</span><br><span style="color: hsl(0, 100%, 40%);">- codec->frame_duration_den = DEFAULT_RTP_AUDIO_FRAME_DUR_DEN;</span><br><span style="color: hsl(0, 100%, 40%);">- codec->rate = DEFAULT_RTP_AUDIO_DEFAULT_RATE;</span><br><span style="color: hsl(0, 100%, 40%);">-        codec->channels = DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS;</span><br><span style="color: hsl(120, 100%, 40%);">+      *codec = (struct mgcp_rtp_codec){};</span><br><span> }</span><br><span> </span><br><span> /*! Initalize or reset codec information with default data.</span><br><span>@@ -99,13 +105,30 @@</span><br><span>   conn->end.codec = NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Set members of struct mgcp_rtp_codec, extrapolate in missing information. Param audio_name is expected in uppercase. */</span><br><span style="color: hsl(0, 100%, 40%);">-static int codec_set(void *ctx, struct mgcp_rtp_codec *codec, int payload_type, const char *audio_name,</span><br><span style="color: hsl(0, 100%, 40%);">-                 unsigned int pt_offset, const struct mgcp_codec_param *param)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Add codec configuration depending on payload type and/or codec name. This</span><br><span style="color: hsl(120, 100%, 40%);">+ *  function uses the input parameters to extrapolate the full codec information.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] codec configuration (caller provided memory).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] conn related rtp-connection.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] payload_type codec type id (e.g. 3 for GSM, -1 when undefined).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] audio_name audio codec name, in uppercase (e.g. "GSM/8000/1").</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] param optional codec parameters (set to NULL when unused).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success, -EINVAL on failure. */</span><br><span style="color: hsl(120, 100%, 40%);">+int mgcp_codec_add(struct mgcp_conn_rtp *conn, int payload_type, const char *audio_name, const struct mgcp_codec_param *param)</span><br><span> {</span><br><span>        int rate;</span><br><span>    int channels;</span><br><span>        char audio_codec[64];</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_rtp_codec *codec;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int pt_offset = conn->end.codecs_assigned;</span><br><span style="color: hsl(120, 100%, 40%);">+        void *ctx = conn->conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* The amount of codecs we can store is limited, make sure we do not</span><br><span style="color: hsl(120, 100%, 40%);">+   * overrun this limit. */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (conn->end.codecs_assigned >= MGCP_MAX_CODECS)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* First unused entry */</span><br><span style="color: hsl(120, 100%, 40%);">+      codec = &conn->end.codecs[conn->end.codecs_assigned];</span><br><span> </span><br><span>  /* Initalize the codec struct with some default data to begin with */</span><br><span>        codec_init(codec);</span><br><span>@@ -226,41 +249,14 @@</span><br><span>   } else</span><br><span>               codec->param_present = false;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  conn->end.codecs_assigned++;</span><br><span>      return 0;</span><br><span> error:</span><br><span>  /* Make sure we leave a clean codec entry on error. */</span><br><span style="color: hsl(0, 100%, 40%);">-  codec_init(codec);</span><br><span style="color: hsl(0, 100%, 40%);">-      memset(codec, 0, sizeof(*codec));</span><br><span style="color: hsl(120, 100%, 40%);">+     codec_free(codec);</span><br><span>   return -EINVAL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Add codec configuration depending on payload type and/or codec name. This</span><br><span style="color: hsl(0, 100%, 40%);">- *  function uses the input parameters to extrapolate the full codec information.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[out] codec configuration (caller provided memory).</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[out] conn related rtp-connection.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] payload_type codec type id (e.g. 3 for GSM, -1 when undefined).</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] audio_name audio codec name, in uppercase (e.g. "GSM/8000/1").</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] param optional codec parameters (set to NULL when unused).</span><br><span style="color: hsl(0, 100%, 40%);">- *  \returns 0 on success, -EINVAL on failure. */</span><br><span style="color: hsl(0, 100%, 40%);">-int mgcp_codec_add(struct mgcp_conn_rtp *conn, int payload_type, const char *audio_name, const struct mgcp_codec_param *param)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The amount of codecs we can store is limited, make sure we do not</span><br><span style="color: hsl(0, 100%, 40%);">-     * overrun this limit. */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (conn->end.codecs_assigned >= MGCP_MAX_CODECS)</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = codec_set(conn->conn, &conn->end.codecs[conn->end.codecs_assigned], payload_type, audio_name,</span><br><span style="color: hsl(0, 100%, 40%);">-                conn->end.codecs_assigned, param);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- conn->end.codecs_assigned++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Check if the given codec is applicable on the specified endpoint</span><br><span>  * Helper function for mgcp_codec_decide() */</span><br><span> static bool is_codec_compatible(const struct mgcp_endpoint *endp, const struct mgcp_rtp_codec *codec)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/15132">change 15132</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/osmo-mgw/+/15132"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I120cab0a352a1e7b31c8f9c720c47b2c291311d7 </div>
<div style="display:none"> Gerrit-Change-Number: 15132 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>