--- gdm-2.16.0/gui/greeter/greeter_item_ulist.c (revision 5099) +++ gdm-2.16.0/gui/greeter/greeter_item_ulist.c (revision 5100) @@ -146,8 +146,10 @@ char **rvec; rvec = g_strsplit (vec[i], ",", -1); - if (rvec == NULL || ve_vector_len (rvec) != 3) + if (ve_vector_len (rvec) != 3) { + g_strfreev (rvec); continue; + } g_hash_table_insert (displays_hash, g_strdup (rvec[1]), --- gdm-2.16.0/gui/gdmflexiserver.c (revision 5099) +++ gdm-2.16.0/gui/gdmflexiserver.c (revision 5100) @@ -136,9 +136,10 @@ for (i = 0; vec[i] != NULL; i++) { char **rvec; rvec = g_strsplit (vec[i], ",", -1); - if (rvec == NULL || - ve_vector_len (rvec) != 3) + if (ve_vector_len (rvec) != 3) { + g_strfreev (rvec); continue; + } if (strcmp (rvec[0], vtpart) == 0) { /* could be nested? */ @@ -177,9 +178,10 @@ char **rvec; int vt; rvec = g_strsplit (vec[i], ",", -1); - if (rvec == NULL || - ve_vector_len (rvec) != 3) + if (ve_vector_len (rvec) != 3) { + g_strfreev (rvec); continue; + } vt = get_vt_num (vec, rvec[2], 5); @@ -516,9 +518,10 @@ char **rvec; int vt; rvec = g_strsplit (vec[i], ",", -1); - if (rvec == NULL || - ve_vector_len (rvec) != 3) + if (ve_vector_len (rvec) != 3) { + g_strfreev (rvec); continue; + } vt = get_vt_num (vec, rvec[2], 5); --- gdm-2.16.0/gui/gdmconfig.c (revision 5099) +++ gdm-2.16.0/gui/gdmconfig.c (revision 5100) @@ -214,11 +214,11 @@ } /* skip the "OK " */ - splitstr = g_strsplit (result + 3, ";", 0); - sec = splitstr; + splitstr = g_strsplit (result + 3, ";", 0); + sec = splitstr; g_free (result); - while (*sec != NULL) { + while (sec != NULL && *sec != NULL) { GdmXserver *svr = g_new0 (GdmXserver, 1); temp = gdm_config_get_xserver_details (*sec, "ID"); --- gdm-2.16.0/daemon/gdm.c (revision 5099) +++ gdm-2.16.0/daemon/gdm.c (revision 5100) @@ -3087,10 +3087,14 @@ } else if (strncmp (msg, GDM_SUP_GET_SERVER_DETAILS " ", strlen (GDM_SUP_GET_SERVER_DETAILS " ")) == 0) { - const gchar *server = &msg[strlen (GDM_SUP_GET_SERVER_DETAILS " ")]; - gchar **splitstr = g_strsplit (server, " ", 2); - GdmXserver *svr = gdm_find_xserver ((gchar *)splitstr[0]); + const gchar *server = &msg[strlen (GDM_SUP_GET_SERVER_DETAILS " ")]; + gchar **splitstr = g_strsplit (server, " ", 2); + GdmXserver *svr = NULL; + if (splitstr != NULL && splitstr[0] != NULL) { + svr = gdm_find_xserver ((gchar *)splitstr[0]); + } + if (svr != NULL) { if (g_strcasecmp (splitstr[1], "ID") == 0) gdm_connection_printf (conn, "OK %s\n", svr->id); @@ -3126,12 +3130,11 @@ gdm_connection_printf (conn, "OK false\n"); else gdm_connection_printf (conn, "ERROR 2 Key not valid\n"); - - g_strfreev (splitstr); } else { gdm_connection_printf (conn, "ERROR 1 Server not found\n"); } + g_strfreev (splitstr); } else if (strcmp (msg, GDM_SUP_GREETERPIDS) == 0) { GString *msg; GSList *li; @@ -3161,10 +3164,15 @@ } else if (strncmp (msg, GDM_SUP_GET_CONFIG " ", strlen (GDM_SUP_GET_CONFIG " ")) == 0) { const gchar *parms = &msg[strlen (GDM_SUP_GET_CONFIG " ")]; - gchar **splitstr = g_strsplit (parms, " ", 2); - gchar *retval = NULL; + gchar **splitstr = g_strsplit (parms, " ", 2); + gchar *retval = NULL; static gboolean done_prefetch = FALSE; + if (splitstr == NULL || splitstr[0] == NULL) { + gdm_connection_printf (conn, "ERROR 50 Unsupported key <null>\n"); + return; + } + /* * It is not meaningful to manage this in a per-display * fashion since the prefetch program is only run once the --- gdm-2.16.0/daemon/gdmconfig.c (revision 5099) +++ gdm-2.16.0/daemon/gdmconfig.c (revision 5100) @@ -816,9 +816,10 @@ file = gdm_get_per_display_custom_config_file (display); - if (strcmp (ve_sure_string (splitstr[0]), "greeter") == 0 || - strcmp (ve_sure_string (splitstr[0]), "gui") == 0 || - is_key (key, GDM_KEY_PAM_STACK)) { + if (splitstr != NULL && + (strcmp (ve_sure_string (splitstr[0]), "greeter") == 0 || + strcmp (ve_sure_string (splitstr[0]), "gui") == 0 || + is_key (key, GDM_KEY_PAM_STACK))) { gdm_config_key_to_string (file, key, retval); } @@ -844,7 +845,7 @@ *retval = NULL; /* Should not fail, all keys should have a category. */ - if (splitstr[0] == NULL) + if (splitstr == NULL || splitstr[0] == NULL) return; /* If file doesn't exist, then just return */ @@ -1705,7 +1706,7 @@ if (custom_cfg != NULL) { gchar **splitstr = g_strsplit (key, "/", 2); - if (splitstr[0] != NULL) { + if (splitstr != NULL && splitstr[0] != NULL) { GList *list = ve_config_get_keys (custom_cfg, splitstr[0]); while (list != NULL) { @@ -1893,7 +1894,7 @@ /* First check the custom file */ if (cfgfiles->custom_cfg != NULL) { gchar **splitstr = g_strsplit (key_in, "/", 2); - if (splitstr[0] != NULL) { + if (splitstr != NULL && splitstr[0] != NULL) { GList *list = ve_config_get_keys (cfgfiles->custom_cfg, splitstr[0]); while (list != NULL) {