<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/14905">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Catch unsigned integer MGCP parsing errors with strtoul<br><br>Checks to find if strotul failed are taken both from:<br>man strtoul<br>man strtol<br><br>Change-Id: Ifba1c1e3151d6f92f9da3d4ca2569a5908455ca8<br>---<br>M src/libosmo-mgcp-client/mgcp_client.c<br>M src/libosmo-mgcp/mgcp_sdp.c<br>2 files changed, 16 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/05/14905/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp-client/mgcp_client.c b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>index fd188c3..910289e 100644</span><br><span>--- a/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>+++ b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>@@ -36,6 +36,8 @@</span><br><span> #include <unistd.h></span><br><span> #include <string.h></span><br><span> #include <ctype.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> </span><br><span> #ifndef OSMUX_CID_MAX</span><br><span> #define OSMUX_CID_MAX 255 /* FIXME: use OSMUX_CID_MAX from libosmo-netif? */</span><br><span>@@ -265,6 +267,7 @@</span><br><span> static int mgcp_parse_audio_port_pt(struct mgcp_response *r, char *line)</span><br><span> {</span><br><span>     char *pt_str;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pt_end;</span><br><span>        unsigned int pt;</span><br><span>     unsigned int count = 0;</span><br><span>      unsigned int i;</span><br><span>@@ -289,7 +292,11 @@</span><br><span>               pt_str = strtok(NULL, " ");</span><br><span>                if (!pt_str)</span><br><span>                         break;</span><br><span style="color: hsl(0, 100%, 40%);">-          pt = atoi(pt_str);</span><br><span style="color: hsl(120, 100%, 40%);">+            errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            pt = strtoul(pt_str, &pt_end, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         if ((errno == ERANGE && pt == ULONG_MAX) || (errno && !pt) ||</span><br><span style="color: hsl(120, 100%, 40%);">+             pt_str == pt_end)</span><br><span style="color: hsl(120, 100%, 40%);">+                 goto response_parse_failure_pt;</span><br><span> </span><br><span>          /* Do not allow duplicate payload types */</span><br><span>           for (i = 0; i < count; i++)</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_sdp.c b/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>index 99e764b..70072c2 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>@@ -29,6 +29,8 @@</span><br><span> #include <osmocom/mgcp/mgcp_sdp.h></span><br><span> </span><br><span> #include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> </span><br><span> /* Two structs to store intermediate parsing results. The function</span><br><span>  * mgcp_parse_sdp_data() is using the following two structs as temporary</span><br><span>@@ -129,6 +131,7 @@</span><br><span>    char *str;</span><br><span>   char *str_ptr;</span><br><span>       char *pt_str;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pt_end;</span><br><span>        unsigned int pt;</span><br><span>     unsigned int count = 0;</span><br><span>      unsigned int i;</span><br><span>@@ -154,7 +157,11 @@</span><br><span>               if (!pt_str)</span><br><span>                         break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              pt = atoi(pt_str);</span><br><span style="color: hsl(120, 100%, 40%);">+            errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            pt = strtoul(pt_str, &pt_end, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         if ((errno == ERANGE && pt == ULONG_MAX) || (errno && !pt) ||</span><br><span style="color: hsl(120, 100%, 40%);">+             pt_str == pt_end)</span><br><span style="color: hsl(120, 100%, 40%);">+                 goto error;</span><br><span> </span><br><span>              /* Do not allow duplicate payload types */</span><br><span>           for (i = 0; i < count; i++)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/14905">change 14905</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/+/14905"/><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: Ifba1c1e3151d6f92f9da3d4ca2569a5908455ca8 </div>
<div style="display:none"> Gerrit-Change-Number: 14905 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>