From bf043208cd268bac675b7bb71aada199b1fd3a6f Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 16 Apr 2014 15:17:03 +0200 Subject: [PATCH] dvbsrc: Don't try to access NULL string And refactor the pid setting code to be in its own function for clarity CID #206374 --- sys/dvb/gstdvbsrc.c | 98 ++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index 9cfbbad..4fa577f 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -691,6 +691,52 @@ gst_dvbsrc_init (GstDvbSrc * object) object->timeout = DEFAULT_TIMEOUT; } +static void +gst_dvbsrc_set_pids (GstDvbSrc * dvbsrc, const gchar * pid_string) +{ + if (!strcmp (pid_string, "8192")) { + /* get the whole ts */ + int pid_count = 1; + dvbsrc->pids[0] = 8192; + while (pid_count < MAX_FILTERS) { + dvbsrc->pids[pid_count++] = G_MAXUINT16; + } + } else { + int pid = 0; + int pid_count; + gchar **pids; + char **tmp; + + tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS); + + /* always add the PAT and CAT pids */ + dvbsrc->pids[0] = 0; + dvbsrc->pids[1] = 1; + + pid_count = 2; + while (*pids != NULL && pid_count < MAX_FILTERS) { + pid = strtol (*pids, NULL, 0); + if (pid > 1 && pid <= 8192) { + GST_INFO_OBJECT (dvbsrc, "\tParsed Pid: %d", pid); + dvbsrc->pids[pid_count] = pid; + pid_count++; + } + pids++; + } + while (pid_count < MAX_FILTERS) { + dvbsrc->pids[pid_count++] = G_MAXUINT16; + } + + g_strfreev (tmp); + } + /* if we are in playing or paused, then set filters now */ + GST_INFO_OBJECT (dvbsrc, "checking if playing for setting pes filters"); + if (GST_ELEMENT (dvbsrc)->current_state == GST_STATE_PLAYING || + GST_ELEMENT (dvbsrc)->current_state == GST_STATE_PAUSED) { + GST_INFO_OBJECT (dvbsrc, "Setting pes filters now"); + gst_dvbsrc_set_pes_filters (dvbsrc); + } +} static void gst_dvbsrc_set_property (GObject * _object, guint prop_id, @@ -735,56 +781,14 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, } case ARG_DVBSRC_PIDS: { - gchar *pid_string; + const gchar *pid_string; - pid_string = g_value_dup_string (value); + pid_string = g_value_get_string (value); GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_PIDS %s", pid_string); - if (!strcmp (pid_string, "8192")) { - /* get the whole ts */ - int pid_count = 1; - object->pids[0] = 8192; - while (pid_count < MAX_FILTERS) { - object->pids[pid_count++] = G_MAXUINT16; - } - } else { - int pid = 0; - int pid_count; - gchar **pids; - char **tmp; - - tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS); - if (pid_string) - g_free (pid_string); - - /* always add the PAT and CAT pids */ - object->pids[0] = 0; - object->pids[1] = 1; - - pid_count = 2; - while (*pids != NULL && pid_count < MAX_FILTERS) { - pid = strtol (*pids, NULL, 0); - if (pid > 1 && pid <= 8192) { - GST_INFO_OBJECT (object, "\tParsed Pid: %d", pid); - object->pids[pid_count] = pid; - pid_count++; - } - pids++; - } - while (pid_count < MAX_FILTERS) { - object->pids[pid_count++] = G_MAXUINT16; - } - - g_strfreev (tmp); - } - /* if we are in playing or paused, then set filters now */ - GST_INFO_OBJECT (object, "checking if playing for setting pes filters"); - if (GST_ELEMENT (object)->current_state == GST_STATE_PLAYING || - GST_ELEMENT (object)->current_state == GST_STATE_PAUSED) { - GST_INFO_OBJECT (object, "Setting pes filters now"); - gst_dvbsrc_set_pes_filters (object); - } - } + if (pid_string) + gst_dvbsrc_set_pids (object, pid_string); break; + } case ARG_DVBSRC_SYM_RATE: object->sym_rate = g_value_get_uint (value); GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_SYM_RATE to value %d", -- 2.7.4