# HG changeset patch # User Jeffrey Connelly # Date 1183350256 0 # Node ID e7612bd6835b247ca8d54eb02dbed9d7b1bb0672 # Parent a752e1017fe98bca7a1c2af3757c88db27cdb9f4 Be more defensive about null pointers, especially null strings in %s format strings. Trying to fix crashes on Windows. diff -r a752e1017fe9 -r e7612bd6835b libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Mon Jul 02 04:22:42 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon Jul 02 04:24:16 2007 +0000 @@ -284,8 +284,11 @@ * long passwords, but reportedly the official IM client does not * allow more than 8 characters to be entered. Just entering the first * 8 does not, on first try, appear to work. */ - str = g_strdup_printf(_("Sorry, passwords over %d characters in length (yours is %d) are " - "currently not supported by the MySpaceIM plugin."), MSIM_MAX_PASSWORD_LENGTH, + /* Note: official client lets you have 10 characters in password. */ + str = g_strdup_printf( + _("Sorry, passwords over %d characters in length (yours is " + "%d) are currently not supported by the MySpaceIM plugin."), + MSIM_MAX_PASSWORD_LENGTH, (int)strlen(acct->password)); /* Notify an error message also, because this is important! */ @@ -768,8 +771,13 @@ decor = 0; gs_begin = g_string_new(""); - g_string_printf(gs_begin, "", face, - msim_font_size_to_purple(msim_font_height_to_point(height))); + if (!face) + g_string_printf(gs_begin, "", + msim_font_size_to_purple(msim_font_height_to_point(height))); + else + g_string_printf(gs_begin, "", face, + msim_font_size_to_purple(msim_font_height_to_point(height))); + /* No support for font-size CSS? */ /* g_string_printf(gs_begin, "", face, msim_font_height_to_point(height)); */ @@ -815,13 +823,21 @@ const gchar *color; color = xmlnode_get_attrib(root, "v"); + if (!color) + { + purple_debug_info("msim", "msim_markup_c_to_html: tag w/o v attr"); + *begin = g_strdup(""); + *end = g_strdup(""); + /* TODO: log as unrecognized */ + return; + } /* TODO: parse rgb(255,0,0) into #FF0000, etc. * And do something about rgba (alpha) and transparent. */ - /* *begin = g_strdup_printf("", color); */ - *begin = g_strdup_printf("", color); - *end = g_strdup("

"); + *begin = g_strdup_printf("", color); + /* *begin = g_strdup_printf("", color); */ + *end = g_strdup(""); } /** Convert the msim markup tag (background color) into HTML. TODO: Test */ @@ -830,8 +846,17 @@ const gchar *color; color = xmlnode_get_attrib(root, "v"); + if (!color) + { + *begin = g_strdup(""); + *end = g_strdup(""); + purple_debug_info("msim", "msim_markup_b_to_html: w/o v attr"); + /* TODO: log as unrecognized. */ + return; + } /* TODO: parse color same as msim_markup_c_to_html(). */ + /* TODO: find out how to set background color. */ *begin = g_strdup_printf("", color); *end = g_strdup("

"); } @@ -842,6 +867,14 @@ const gchar *name; name = xmlnode_get_attrib(root, "n"); + if (!name) + { + purple_debug_info("msim", "msim_markup_i_to_html: w/o n"); + *begin = g_strdup(""); + *end = g_strdup(""); + /* TODO: log as unrecognized */ + return; + } /* TODO: Support these emoticons: * @@ -864,7 +897,7 @@ gchar *begin, *inner, *end; gchar *final; - if (!root) + if (!root || !root->name) return g_strdup(""); purple_debug_info("msim", "msim_markup_xmlnode_to_html: got root=%s\n", @@ -1099,12 +1132,19 @@ gchar *user; PurpleNotifyUserInfo *user_info; PurpleBuddy *buddy; - gchar *song; - - - /* Get user{name,id} from msim_get_info, passed as an MsimMessage for orthogonality. */ + const gchar *str, *str2; + + + /* Get user{name,id} from msim_get_info, passed as an MsimMessage for + orthogonality. */ msg = (MsimMessage *)data; - user = g_strdup(msim_msg_get_string(msg, "user")); + user = msim_msg_get_string(msg, "user"); + if (!user) + { + purple_debug_info("msim", "msim_get_info_cb: no 'user' in msg"); + return; + } + purple_debug_info("msim", "msim_get_info_cb: got for user: %s\n", user); msim_msg_free(msg); @@ -1119,41 +1159,55 @@ user_info = purple_notify_user_info_new(); /* Identification */ - purple_notify_user_info_add_pair(user_info, _("User"), user); + purple_notify_user_info_add_pair(user_info, _("User"), g_strdup(user)); /* note: g_hash_table_lookup does not create a new string! */ - purple_notify_user_info_add_pair(user_info, _("User ID"), - g_strdup(g_hash_table_lookup(body, "UserID"))); + str = g_hash_table_lookup(body, "UserID"); + if (str) + purple_notify_user_info_add_pair(user_info, _("User ID"), + g_strdup(str)); /* a/s/l...the vitals */ - purple_notify_user_info_add_pair(user_info, _("Age"), - g_strdup(g_hash_table_lookup(body, "Age"))); - - purple_notify_user_info_add_pair(user_info, _("Gender"), - g_strdup(g_hash_table_lookup(body, "Gender"))); - - purple_notify_user_info_add_pair(user_info, _("Location"), - g_strdup(g_hash_table_lookup(body, "Location"))); + str = g_hash_table_lookup(body, "Age"); + if (str) + purple_notify_user_info_add_pair(user_info, _("Age"), g_strdup(str)); + + str = g_hash_table_lookup(body, "Gender"); + if (str) + purple_notify_user_info_add_pair(user_info, _("Gender"), g_strdup(str)); + + str = g_hash_table_lookup(body, "Location"); + if (str) + purple_notify_user_info_add_pair(user_info, _("Location"), + g_strdup(str)); /* Other information */ /* Headline comes from buddy status messages */ - if (buddy && purple_blist_node_get_string(&buddy->node, "Headline")) - purple_notify_user_info_add_pair(user_info, "Headline", - purple_blist_node_get_string(&buddy->node, "Headline")); - - song = g_strdup_printf("%s - %s", - (gchar *)g_hash_table_lookup(body, "BandName"), - (gchar *)g_hash_table_lookup(body, "SongName")); - - - purple_notify_user_info_add_pair(user_info, _("Song"), song); - /* Do not free song - used by user_info. */ + if (buddy) + { + str = purple_blist_node_get_string(&buddy->node, "Headline"); + if (str) + purple_notify_user_info_add_pair(user_info, "Headline", str); + } + + + str = g_hash_table_lookup(body, "BandName"); + str2 = g_hash_table_lookup(body, "SongName"); + if (str || str2) + { + purple_notify_user_info_add_pair(user_info, _("Song"), + g_strdup_printf("%s - %s", + str ? str : "Unknown Artist", + str2 ? str2 : "Unknown Song")); + } + /* Total friends only available if looked up by uid, not username. */ - if (g_hash_table_lookup(body, "TotalFriends")) + str = g_hash_table_lookup(body, "TotalFriends"); + if (str) purple_notify_user_info_add_pair(user_info, _("Total Friends"), - g_strdup(g_hash_table_lookup(body, "TotalFriends"))); + g_strdup(str)); purple_notify_userinfo(session->gc, user, user_info, NULL, NULL); purple_debug_info("msim", "msim_get_info_cb: username=%s\n", user); @@ -1625,7 +1679,8 @@ err = msim_msg_get_integer(msg, "err"); errmsg = msim_msg_get_string(msg, "errmsg"); - full_errmsg = g_strdup_printf(_("Protocol error, code %d: %s"), err, errmsg); + full_errmsg = g_strdup_printf(_("Protocol error, code %d: %s"), err, + errmsg ? errmsg : "no 'errmsg' given"); g_free(errmsg); @@ -2251,8 +2306,10 @@ if (source < 0) { purple_connection_error(gc, _("Couldn't connect to host")); - purple_connection_error(gc, g_strdup_printf(_("Couldn't connect to host: %s (%d)"), - error_message, source)); + purple_connection_error(gc, g_strdup_printf( + _("Couldn't connect to host: %s (%d)"), + error_message ? error_message : "no message given", + source)); return; } @@ -2448,7 +2505,8 @@ "lid", MSIM_TYPE_INTEGER, lid, "rid", MSIM_TYPE_INTEGER, rid, /* TODO: dictionary field type */ - "body", MSIM_TYPE_STRING, g_strdup_printf("%s=%s", field_name, user), + "body", MSIM_TYPE_STRING, + g_strdup_printf("%s=%s", field_name, user), NULL)); }