summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSreerenj Balachandran <sreerenj.balachandran@nokia.com>2011-04-06 22:57:41 +0300
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2011-04-12 12:30:08 +0200
commitfecd4a115405933a2c837ae0e10770c338adbbe6 (patch)
treedcb1a729d835cec61529dbc1cf159548f24d6526
parent3fa0119dc13f8861f68f8b7b108ce137e3508d53 (diff)
rtsptranport: ensure valid int result when parsing ranges
Specifically, make sure that the return value of strtol is falling in between the range of G_MININT and G_MAXINT. Fixes #646952.
-rw-r--r--gst-libs/gst/rtsp/gstrtsptransport.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gst-libs/gst/rtsp/gstrtsptransport.c b/gst-libs/gst/rtsp/gstrtsptransport.c
index ad1b8e21a..de3085ed3 100644
--- a/gst-libs/gst/rtsp/gstrtsptransport.c
+++ b/gst-libs/gst/rtsp/gstrtsptransport.c
@@ -270,6 +270,20 @@ parse_mode (GstRTSPTransport * transport, const gchar * str)
}
static gboolean
+check_range (const gchar * str, gchar ** tmp, gint * range)
+{
+ glong range_val;
+
+ range_val = strtol (str, tmp, 10);
+ if (range_val >= G_MININT && range_val <= G_MAXINT) {
+ *range = range_val;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static gboolean
parse_range (const gchar * str, GstRTSPRange * range)
{
gchar *minus;
@@ -286,16 +300,14 @@ parse_range (const gchar * str, GstRTSPRange * range)
if (g_ascii_isspace (minus[1]) || minus[1] == '+' || minus[1] == '-')
goto invalid_range;
- range->min = strtol (str, &tmp, 10);
- if (str == tmp || tmp != minus)
+ if (!check_range (str, &tmp, &range->min) || str == tmp || tmp != minus)
goto invalid_range;
- range->max = strtol (minus + 1, &tmp, 10);
- if (*tmp && *tmp != ';')
+ if (!check_range (minus + 1, &tmp, &range->max) || (*tmp && *tmp != ';'))
goto invalid_range;
} else {
- range->min = strtol (str, &tmp, 10);
- if (str == tmp || (*tmp && *tmp != ';'))
+ if (!check_range (str, &tmp, &range->min) || str == tmp ||
+ (*tmp && *tmp != ';'))
goto invalid_range;
range->max = -1;