summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Cameron <brian.cameron@sun.com>2007-07-12 00:06:52 +0000
committerBrian Cameron <bcameron@src.gnome.org>2007-07-12 00:06:52 +0000
commitffe575887845523e6d3e9a2e35770426c6e78d76 (patch)
tree705a7ad20ec56a9a20af522c543c2dceb1df6a2a
parent94d669b125a7ac83a530dd4a4527be07388f8054 (diff)
downloadgdm-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--ChangeLog7
-rw-r--r--daemon/gdm.c316
-rw-r--r--daemon/gdmconfig.c13
-rw-r--r--gui/gdmconfig.c6
-rw-r--r--gui/gdmflexiserver.c15
-rw-r--r--gui/gdmsetup.c2
-rw-r--r--gui/greeter/greeter_item_ulist.c4
7 files changed, 205 insertions, 158 deletions
diff --git a/ChangeLog b/ChangeLog
index 7dc7bc1b..836ee96e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]),