Fix crash 08/239108/2 accepted/tizen/unified/20200723.161243 submit/tizen/20200722.045405
authorSangchul Lee <sc11.lee@samsung.com>
Tue, 21 Jul 2020 08:37:10 +0000 (17:37 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 22 Jul 2020 02:12:00 +0000 (11:12 +0900)
Add null check before strdup().
Getting the ini instance codes are changed.

[Version] 0.1.100
[Issue Type] Bug Fix

Change-Id: I4806d33c257bfc669523f970e1bd579b0e9fa745
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-streamer.spec
src/media_streamer_node.c
src/media_streamer_util.c

index a8dee9b..368d96b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.99
+Version:    0.1.100
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index d536448..cb048a9 100644 (file)
@@ -1958,11 +1958,16 @@ int ms_node_get_param_value(media_streamer_node_s *node, param_s *param, char **
                                !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_FLIP) ||
                                !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD)) {
                string_val = g_strdup_printf("%d", g_value_get_enum(&value));
+       } else {
+               ms_error("should not be reached here, could not find the param name[%s] of the node[%s]", param->param_name, node->name);
+               ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+               goto end;
        }
 
-       *string_value = strdup(string_val);
+       *string_value = string_val ? strdup(string_val) : NULL;
        g_free(string_val);
 
+end:
        g_value_reset(&value);
        g_value_unset(&value);
 
index 6c76fcd..273c607 100644 (file)
@@ -104,27 +104,28 @@ static const format_s container_format_table[] = {
        {MEDIA_FORMAT_MAX, NULL}
 };
 
+static dictionary *g_ini_instance = NULL;
+
 static dictionary *__ms_get_ini_instance(void)
 {
-       static dictionary *instance = NULL;
-       dictionary *ms_dict = NULL;
-
-       ms_debug_fenter();
-
-       if (!instance) {
-               /* loading existing ini file */
-               ms_dict = iniparser_load(MEDIA_STREAMER_INI_PATH);
-
-               if (!ms_dict)
+       if (!g_ini_instance) {
+               g_ini_instance = iniparser_load(MEDIA_STREAMER_INI_PATH);
+               if (!g_ini_instance)
                        ms_warning("Could not open ini [%s]. Media-streamer will use default values.", MEDIA_STREAMER_INI_PATH);
                else
-                       ms_debug("Open ini file [%s].", MEDIA_STREAMER_INI_PATH);
-               instance = ms_dict;
+                       ms_debug("Open ini file [%s], instance[%p]", MEDIA_STREAMER_INI_PATH, g_ini_instance);
        }
 
-       ms_debug_fleave();
+       return g_ini_instance;
+}
 
-       return instance;
+static void __ms_free_ini_instance(void)
+{
+       if (g_ini_instance) {
+               iniparser_freedict(g_ini_instance);
+               ms_debug("ini instance[%p] is freed", g_ini_instance);
+               g_ini_instance = NULL;
+       }
 }
 
 gchar *ms_ini_get_string(const char *ini_path, const char *default_str)
@@ -186,13 +187,9 @@ void ms_ini_read_list(const char *key, gchar ***list)
 
 void ms_load_ini_settings(media_streamer_ini_t *ini)
 {
-       ms_debug_fenter();
-
-       /* get ini values */
        memset(ini, 0, sizeof(media_streamer_ini_t));
 
        if (__ms_get_ini_instance()) {
-               /* general */
                ini->generate_dot = iniparser_getboolean(__ms_get_ini_instance(), "general:generate dot", DEFAULT_GENERATE_DOT);
                if (ini->generate_dot == TRUE) {
                        const gchar *dot_path = iniparser_getstring(__ms_get_ini_instance(), "general:dot dir", MEDIA_STREAMER_DEFAULT_DOT_DIR);
@@ -209,24 +206,20 @@ void ms_load_ini_settings(media_streamer_ini_t *ini)
                /* Read gstreamer arguments list */
                ms_ini_read_list("general:gstreamer arguments", &ini->gst_args);
 
+               __ms_free_ini_instance();
        } else {
                /* if dict is not available just fill the structure with default values */
                ini->generate_dot = DEFAULT_GENERATE_DOT;
                ini->use_decodebin = DEFAULT_USE_DECODEBIN;
        }
 
-       /* general */
+       /* TODO: dump all ini settings */
        ms_debug("Media Streamer param [generate_dot] : %d", ini->generate_dot);
        ms_debug("Media Streamer param [use_decodebin] : %d", ini->use_decodebin);
-
-       ms_debug_fleave();
-
 }
 
 void ms_unload_ini_settings(media_streamer_ini_t *ini)
 {
-       dictionary *dict;
-
        ms_retm_if(!ini, "ini is null");
 
        /* Clean up exclude elements list */
@@ -237,9 +230,6 @@ void ms_unload_ini_settings(media_streamer_ini_t *ini)
 
        /* Clean up gstreamer arguments list */
        g_strfreev(ini->gst_args);
-
-       if ((dict = __ms_get_ini_instance()))
-               iniparser_freedict(dict);
 }
 
 static const gchar *__ms_find_item(const format_s table[], media_format_mimetype_e mime)