diff options
author | Brian Cameron <brian.cameron@sun.com> | 2007-07-12 00:06:52 +0000 |
---|---|---|
committer | Brian Cameron <bcameron@src.gnome.org> | 2007-07-12 00:06:52 +0000 |
commit | ffe575887845523e6d3e9a2e35770426c6e78d76 (patch) | |
tree | 705a7ad20ec56a9a20af522c543c2dceb1df6a2a | |
parent | 94d669b125a7ac83a530dd4a4527be07388f8054 (diff) | |
download | gdm-ffe575887845523e6d3e9a2e35770426c6e78d76.tar.gz |
Fix g_strsplit calls so that NULL return codes are better handled.
2007-07-11 Brian Cameron <brian.cameron@sun.com>
* daemon/gdm.c, daemon/gdmconfig.c, gui/gdmsetup.c,
gui/gdmconfig.c, gui/gdmflexiserver.c,
gui/greeter/greeter_item_ulist.c: Fix g_strsplit calls
so that NULL return codes are better handled.
svn path=/branches/gnome-2-18/; revision=5062
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | daemon/gdm.c | 316 | ||||
-rw-r--r-- | daemon/gdmconfig.c | 13 | ||||
-rw-r--r-- | gui/gdmconfig.c | 6 | ||||
-rw-r--r-- | gui/gdmflexiserver.c | 15 | ||||
-rw-r--r-- | gui/gdmsetup.c | 2 | ||||
-rw-r--r-- | gui/greeter/greeter_item_ulist.c | 4 |
7 files changed, 205 insertions, 158 deletions
@@ -1,3 +1,10 @@ +2007-07-11 Brian Cameron <brian.cameron@sun.com> + + * daemon/gdm.c, daemon/gdmconfig.c, gui/gdmsetup.c, + gui/gdmconfig.c, gui/gdmflexiserver.c, + gui/greeter/greeter_item_ulist.c: Fix g_strsplit calls + so that NULL return codes are better handled. + 2007-07-09 Brian Cameron <brian.cameron@sun.com> * daemon/misc.c: Initialize hints and set ai_family in the diff --git a/daemon/gdm.c b/daemon/gdm.c index 6c196a9d..dafd3b2a 100644 --- a/daemon/gdm.c +++ b/daemon/gdm.c @@ -2557,190 +2557,216 @@ gdm_handle_message (GdmConnection *conn, const char *msg, gpointer data) NULL, 0, NULL, NULL, NULL); } else if (strncmp (msg, "opcode="GDM_SOP_SHOW_ERROR_DIALOG, strlen ("opcode="GDM_SOP_SHOW_ERROR_DIALOG)) == 0) { - GdmDisplay *d; - GtkMessageType type; char **list; - char *ptr; - char *error; - char *details_label; - char *details_file; - long slave_pid; - int uid, gid; - list = g_strsplit (msg, "$$", -1); - ptr = strchr (list[1], '='); - slave_pid = atol (ptr + 1); + if (ve_vector_len (list) == 8) { + GdmDisplay *d; + GtkMessageType type; + char *ptr; + char *error; + char *details_label; + char *details_file; + long slave_pid; + int uid, gid; - ptr = strchr (list[2], '='); - type = atoi (ptr + 1); + ptr = strchr (list[1], '='); + slave_pid = atol (ptr + 1); - ptr = strchr (list[3], '='); - error = g_malloc0 (strlen (ptr)); - strcpy (error, ptr + 1); + ptr = strchr (list[2], '='); + type = atoi (ptr + 1); - ptr = strchr (list[4], '='); - details_label = g_malloc0 (strlen (ptr)); - strcpy (details_label, ptr + 1); + ptr = strchr (list[3], '='); + error = g_malloc0 (strlen (ptr)); + strcpy (error, ptr + 1); - ptr = strchr (list[5], '='); - details_file = g_malloc0 (strlen (ptr)); - strcpy (details_file, ptr + 1); + ptr = strchr (list[4], '='); + details_label = g_malloc0 (strlen (ptr)); + strcpy (details_label, ptr + 1); - ptr = strchr (list[6], '='); - uid = atoi (ptr + 1); + ptr = strchr (list[5], '='); + details_file = g_malloc0 (strlen (ptr)); + strcpy (details_file, ptr + 1); - ptr = strchr (list[7], '='); - gid = atoi (ptr + 1); + ptr = strchr (list[6], '='); + uid = atoi (ptr + 1); - d = gdm_display_lookup (slave_pid); + ptr = strchr (list[7], '='); + gid = atoi (ptr + 1); - if (d != NULL) { - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0644)); - } + d = gdm_display_lookup (slave_pid); + + if (d != NULL) { + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0644)); + } - gdm_error_box_full (d, type, error, details_label, details_file, 0, 0); + gdm_error_box_full (d, type, error, + details_label, details_file, 0, 0); - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); - } + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0640)); + } - send_slave_ack_dialog_char (d, GDM_SLAVE_NOTIFY_ERROR_RESPONSE, NULL); + send_slave_ack_dialog_char (d, + GDM_SLAVE_NOTIFY_ERROR_RESPONSE, NULL); + } + g_free (error); + g_free (details_label); + g_free (details_file); } - g_free (error); - g_free (details_label); - g_free (details_file); g_strfreev (list); } else if (strncmp (msg, "opcode="GDM_SOP_SHOW_YESNO_DIALOG, - strlen ("opcode="GDM_SOP_SHOW_YESNO_DIALOG)) == 0) { - GdmDisplay *d; + strlen ("opcode="GDM_SOP_SHOW_YESNO_DIALOG)) == 0) { char **list; - char *ptr; - char *yesno_msg; - long slave_pid; - gboolean response_yesno; - list = g_strsplit (msg, "$$", -1); - ptr = strchr (list [1], '='); - slave_pid = atol (ptr + 1); - - ptr = strchr (list [2], '='); - yesno_msg = g_malloc0 (strlen (ptr)); - strcpy (yesno_msg, ptr + 1); - - d = gdm_display_lookup (slave_pid); - if (d != NULL) { - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0644)); - } + if (ve_vector_len (list) == 3) { + GdmDisplay *d; + char *ptr; + char *yesno_msg; + long slave_pid; + gboolean resp; + + ptr = strchr (list [1], '='); + slave_pid = atol (ptr + 1); + + ptr = strchr (list [2], '='); + yesno_msg = g_malloc0 (strlen (ptr)); + strcpy (yesno_msg, ptr + 1); + + d = gdm_display_lookup (slave_pid); + if (d != NULL) { + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0644)); + } - response_yesno = gdm_failsafe_yesno (d, yesno_msg); + resp = gdm_failsafe_yesno (d, yesno_msg); - send_slave_ack_dialog_int (d, GDM_SLAVE_NOTIFY_YESNO_RESPONSE, response_yesno); + send_slave_ack_dialog_int (d, + GDM_SLAVE_NOTIFY_YESNO_RESPONSE, + resp); - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0640)); + } } - } - g_free (yesno_msg); + g_free (yesno_msg); + } g_strfreev (list); } else if (strncmp (msg, "opcode="GDM_SOP_SHOW_QUESTION_DIALOG, strlen ("opcode="GDM_SOP_SHOW_QUESTION_DIALOG)) == 0) { - GdmDisplay *d; char **list; - char *ptr; - char *question_msg; - char *response_question; - long slave_pid; - gboolean echo; - list = g_strsplit (msg, "$$", -1); - ptr = strchr (list [1], '='); - slave_pid = atol (ptr + 1); + if (ve_vector_len (list) == 4) { + GdmDisplay *d; + char *ptr; + char *question_msg; + char *resp; + long slave_pid; + gboolean echo; + + ptr = strchr (list [1], '='); + slave_pid = atol (ptr + 1); + + ptr = strchr (list [2], '='); + question_msg = g_malloc0 (strlen (ptr)); + strcpy (question_msg, ptr + 1); + + ptr = strchr (list [3], '='); + echo = atoi (ptr + 1); + + d = gdm_display_lookup (slave_pid); + if (d != NULL) { + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0644)); + } - ptr = strchr (list [2], '='); - question_msg = g_malloc0 (strlen (ptr)); - strcpy (question_msg, ptr + 1); + resp = gdm_failsafe_question (d, + question_msg, echo); - ptr = strchr (list [3], '='); - echo = atoi (ptr + 1); + send_slave_ack_dialog_char (d, + GDM_SLAVE_NOTIFY_QUESTION_RESPONSE, + resp); - d = gdm_display_lookup (slave_pid); - if (d != NULL) { - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0644)); + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0640)); + } } - response_question = gdm_failsafe_question (d, question_msg, echo); - - send_slave_ack_dialog_char (d, GDM_SLAVE_NOTIFY_QUESTION_RESPONSE, response_question); - - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); - } + g_free (question_msg); } - - g_free (question_msg); g_strfreev (list); } else if (strncmp (msg, "opcode="GDM_SOP_SHOW_ASKBUTTONS_DIALOG, strlen ("opcode="GDM_SOP_SHOW_ASKBUTTONS_DIALOG)) == 0) { - GdmDisplay *d; - char *askbuttons_msg; char **list; - char *ptr; - char *options[4]; - long slave_pid; - int i; - int response_askbuttons; - list = g_strsplit (msg, "$$", -1); - ptr = strchr (list [1], '='); - slave_pid = atol (ptr + 1); - - ptr = strchr (list [2], '='); - askbuttons_msg = g_malloc0 (strlen (ptr)); - strcpy (askbuttons_msg, ptr + 1); - - ptr = strchr (list [3], '='); - options[0] = g_malloc0 (strlen (ptr)); - strcpy (options[0], ptr + 1); - - ptr = strchr (list [4], '='); - options[1] = g_malloc0 (strlen (ptr)); - strcpy (options[1], ptr + 1); - - ptr = strchr (list [5], '='); - options[2] = g_malloc0 (strlen (ptr)); - strcpy (options[2], ptr + 1); + if (ve_vector_len (list) == 7) { + GdmDisplay *d; + char *askbuttons_msg; + char *ptr; + char *options[4]; + long slave_pid; + int i; + int resp; + + ptr = strchr (list [1], '='); + slave_pid = atol (ptr + 1); + + ptr = strchr (list [2], '='); + askbuttons_msg = g_malloc0 (strlen (ptr)); + strcpy (askbuttons_msg, ptr + 1); + + ptr = strchr (list [3], '='); + options[0] = g_malloc0 (strlen (ptr)); + strcpy (options[0], ptr + 1); + + ptr = strchr (list [4], '='); + options[1] = g_malloc0 (strlen (ptr)); + strcpy (options[1], ptr + 1); + + ptr = strchr (list [5], '='); + options[2] = g_malloc0 (strlen (ptr)); + strcpy (options[2], ptr + 1); + + ptr = strchr (list [6], '='); + options[3] = g_malloc0 (strlen (ptr)); + strcpy (options[3], ptr + 1); + + d = gdm_display_lookup (slave_pid); + if (d != NULL) { + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0644)); + } - ptr = strchr (list [6], '='); - options[3] = g_malloc0 (strlen (ptr)); - strcpy (options[3], ptr + 1); + resp = gdm_failsafe_ask_buttons (d, + askbuttons_msg, options); - d = gdm_display_lookup (slave_pid); - if (d != NULL) { - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0644)); + send_slave_ack_dialog_int (d, + GDM_SLAVE_NOTIFY_ASKBUTTONS_RESPONSE, + resp); + if (GDM_AUTHFILE (d)) { + VE_IGNORE_EINTR ( + chmod (GDM_AUTHFILE (d), 0640)); + } } - response_askbuttons = gdm_failsafe_ask_buttons (d, askbuttons_msg, options); + g_free (askbuttons_msg); - send_slave_ack_dialog_int (d, GDM_SLAVE_NOTIFY_ASKBUTTONS_RESPONSE, response_askbuttons); - if (GDM_AUTHFILE (d)) { - VE_IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); - } + for (i = 0; i < 3; i ++) + g_free (options[i]); } - - g_free (askbuttons_msg); - - for (i = 0; i < 3; i ++) - g_free (options[i]); g_strfreev (list); } } @@ -3481,9 +3507,13 @@ gdm_handle_user_message (GdmConnection *conn, const gchar *msg, gpointer data) } 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) @@ -3520,12 +3550,11 @@ gdm_handle_user_message (GdmConnection *conn, const gchar *msg, gpointer data) 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; @@ -3555,10 +3584,15 @@ gdm_handle_user_message (GdmConnection *conn, const gchar *msg, gpointer data) } 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 diff --git a/daemon/gdmconfig.c b/daemon/gdmconfig.c index d81abf1b..772252aa 100644 --- a/daemon/gdmconfig.c +++ b/daemon/gdmconfig.c @@ -850,9 +850,10 @@ gdm_config_key_to_string_per_display (const gchar *display, gchar *key, gchar ** 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); } @@ -878,7 +879,7 @@ gdm_config_key_to_string (gchar *file, gchar *key, gchar **retval) *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 */ @@ -1768,7 +1769,7 @@ gdm_update_config (gchar* key) 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) { @@ -1956,7 +1957,7 @@ gdm_load_config_option (gpointer key_in, gpointer value_in, gpointer data) /* 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) { diff --git a/gui/gdmconfig.c b/gui/gdmconfig.c index 24e222f6..9586e446 100644 --- a/gui/gdmconfig.c +++ b/gui/gdmconfig.c @@ -214,11 +214,11 @@ gdm_config_get_xservers (gboolean flexible) } /* 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"); diff --git a/gui/gdmflexiserver.c b/gui/gdmflexiserver.c index 176551a1..2ead4f1b 100644 --- a/gui/gdmflexiserver.c +++ b/gui/gdmflexiserver.c @@ -136,9 +136,10 @@ get_vt_num (char **vec, char *vtpart, int depth) 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 @@ create_model (char **vec) 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 @@ check_for_users (void) 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); diff --git a/gui/gdmsetup.c b/gui/gdmsetup.c index b0d924f7..82dc97ed 100644 --- a/gui/gdmsetup.c +++ b/gui/gdmsetup.c @@ -4220,7 +4220,7 @@ strings_list_remove (char *strings_list, const char *string, const char *sep) msg = g_string_new (""); actions = g_strsplit (strings_list, sep, -1); - for (i = 0; actions[i]; i++) { + for (i = 0; actions != NULL && actions[i] != NULL; i++) { if (strncmp (actions[i], string, strlen (string)) == 0) continue; g_string_append_printf (msg, "%s%s", separator, actions[i]); diff --git a/gui/greeter/greeter_item_ulist.c b/gui/greeter/greeter_item_ulist.c index 3a8636e2..bdeaec57 100644 --- a/gui/greeter/greeter_item_ulist.c +++ b/gui/greeter/greeter_item_ulist.c @@ -140,8 +140,10 @@ check_for_displays (void) 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]), |