comparison libpurple/protocols/myspace/myspace.c @ 28977:e137c1fc216a

Check if memory has been freed by looking at its contents does not work 100% of the time. If any of these functions are called with an invalid object, then the correct fix is to determine why the function was called and prevent it from being called.
author Mark Doliner <mark@kingant.net>
date Fri, 05 Feb 2010 01:18:18 +0000
parents 52fffd4cdd62
children 3e99c4eab63b
comparison
equal deleted inserted replaced
28976:ef1c3791ad32 28977:e137c1fc216a
249 { 249 {
250 gboolean rc; 250 gboolean rc;
251 MsimMessage *msg; 251 MsimMessage *msg;
252 const gchar *from_username; 252 const gchar *from_username;
253 253
254 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
255 g_return_val_if_fail(who != NULL, FALSE); 254 g_return_val_if_fail(who != NULL, FALSE);
256 g_return_val_if_fail(text != NULL, FALSE); 255 g_return_val_if_fail(text != NULL, FALSE);
257 256
258 from_username = session->account->username; 257 from_username = session->account->username;
259 258
342 msim_new_reply_callback(MsimSession *session, MSIM_USER_LOOKUP_CB cb, 341 msim_new_reply_callback(MsimSession *session, MSIM_USER_LOOKUP_CB cb,
343 gpointer data) 342 gpointer data)
344 { 343 {
345 guint rid; 344 guint rid;
346 345
347 g_return_val_if_fail(MSIM_SESSION_VALID(session), -1);
348
349 rid = session->next_rid++; 346 rid = session->next_rid++;
350 347
351 g_hash_table_insert(session->user_lookup_cb, GUINT_TO_POINTER(rid), cb); 348 g_hash_table_insert(session->user_lookup_cb, GUINT_TO_POINTER(rid), cb);
352 g_hash_table_insert(session->user_lookup_cb_data, GUINT_TO_POINTER(rid), data); 349 g_hash_table_insert(session->user_lookup_cb_data, GUINT_TO_POINTER(rid), data);
353 350
391 user = msim_get_user_from_buddy(buddy, TRUE); 388 user = msim_get_user_from_buddy(buddy, TRUE);
392 389
393 account = purple_buddy_get_account(buddy); 390 account = purple_buddy_get_account(buddy);
394 gc = purple_account_get_connection(account); 391 gc = purple_account_get_connection(account);
395 session = (MsimSession *)gc->proto_data; 392 session = (MsimSession *)gc->proto_data;
396
397 g_return_val_if_fail(MSIM_SESSION_VALID(session), NULL);
398 393
399 display_name = headline = NULL; 394 display_name = headline = NULL;
400 395
401 /* Retrieve display name and/or headline, depending on user preference. */ 396 /* Retrieve display name and/or headline, depending on user preference. */
402 if (purple_account_get_bool(session->account, "show_headline", TRUE)) { 397 if (purple_account_get_bool(session->account, "show_headline", TRUE)) {
440 435
441 if (PURPLE_BUDDY_IS_ONLINE(buddy)) { 436 if (PURPLE_BUDDY_IS_ONLINE(buddy)) {
442 MsimSession *session; 437 MsimSession *session;
443 PurpleAccount *account = purple_buddy_get_account(buddy); 438 PurpleAccount *account = purple_buddy_get_account(buddy);
444 PurpleConnection *gc = purple_account_get_connection(account); 439 PurpleConnection *gc = purple_account_get_connection(account);
445 440
446 session = (MsimSession *)gc->proto_data; 441 session = (MsimSession *)gc->proto_data;
447
448 g_return_if_fail(MSIM_SESSION_VALID(session));
449 442
450 /* TODO: if (full), do something different? */ 443 /* TODO: if (full), do something different? */
451 444
452 /* TODO: request information? have to figure out how to do 445 /* TODO: request information? have to figure out how to do
453 * the asynchronous lookup like oscar does (tooltip shows 446 * the asynchronous lookup like oscar does (tooltip shows
692 guint response_len; 685 guint response_len;
693 gchar *nc; 686 gchar *nc;
694 gsize nc_len; 687 gsize nc_len;
695 gboolean ret; 688 gboolean ret;
696 689
697 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
698 g_return_val_if_fail(msg != NULL, FALSE); 690 g_return_val_if_fail(msg != NULL, FALSE);
699 691
700 g_return_val_if_fail(msim_msg_get_binary(msg, "nc", &nc, &nc_len), FALSE); 692 g_return_val_if_fail(msim_msg_get_binary(msg, "nc", &nc, &nc_len), FALSE);
701 693
702 account = session->account; 694 account = session->account;
781 /** Called when the session key arrives to check whether the user 773 /** Called when the session key arrives to check whether the user
782 * has a username, and set one if desired. */ 774 * has a username, and set one if desired. */
783 static gboolean 775 static gboolean
784 msim_is_username_set(MsimSession *session, MsimMessage *msg) 776 msim_is_username_set(MsimSession *session, MsimMessage *msg)
785 { 777 {
786 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
787 g_return_val_if_fail(msg != NULL, FALSE); 778 g_return_val_if_fail(msg != NULL, FALSE);
788 g_return_val_if_fail(session->gc != NULL, FALSE); 779 g_return_val_if_fail(session->gc != NULL, FALSE);
789 780
790 session->sesskey = msim_msg_get_integer(msg, "sesskey"); 781 session->sesskey = msim_msg_get_integer(msg, "sesskey");
791 purple_debug_info("msim", "SESSKEY=<%d>\n", session->sesskey); 782 purple_debug_info("msim", "SESSKEY=<%d>\n", session->sesskey);
839 { 830 {
840 MsimSession *session; 831 MsimSession *session;
841 time_t delta; 832 time_t delta;
842 833
843 session = (MsimSession *)data; 834 session = (MsimSession *)data;
844
845 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
846 835
847 delta = time(NULL) - session->last_comm; 836 delta = time(NULL) - session->last_comm;
848 837
849 /* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */ 838 /* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */
850 if (delta >= MSIM_KEEPALIVE_INTERVAL) { 839 if (delta >= MSIM_KEEPALIVE_INTERVAL) {
968 { 957 {
969 MsimSession *session; 958 MsimSession *session;
970 959
971 session = (MsimSession *)data; 960 session = (MsimSession *)data;
972 961
973 if (!MSIM_SESSION_VALID(session)) {
974 purple_debug_info("msim", "msim_check_inbox: session invalid, stopping the mail check.\n");
975 return FALSE;
976 }
977
978 purple_debug_info("msim", "msim_check_inbox: checking mail\n"); 962 purple_debug_info("msim", "msim_check_inbox: checking mail\n");
979 g_return_val_if_fail(msim_send(session, 963 g_return_val_if_fail(msim_send(session,
980 "persist", MSIM_TYPE_INTEGER, 1, 964 "persist", MSIM_TYPE_INTEGER, 1,
981 "sesskey", MSIM_TYPE_INTEGER, session->sesskey, 965 "sesskey", MSIM_TYPE_INTEGER, session->sesskey,
982 "cmd", MSIM_TYPE_INTEGER, MSIM_CMD_GET, 966 "cmd", MSIM_TYPE_INTEGER, MSIM_CMD_GET,
1213 /** Called after username is set, if necessary and we're open for business. */ 1197 /** Called after username is set, if necessary and we're open for business. */
1214 gboolean msim_we_are_logged_on(MsimSession *session) 1198 gboolean msim_we_are_logged_on(MsimSession *session)
1215 { 1199 {
1216 MsimMessage *body; 1200 MsimMessage *body;
1217 1201
1218 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
1219
1220 /* Set display name to username (otherwise will show email address) */ 1202 /* Set display name to username (otherwise will show email address) */
1221 purple_connection_set_display_name(session->gc, session->username); 1203 purple_connection_set_display_name(session->gc, session->username);
1222 1204
1223 body = msim_msg_new( 1205 body = msim_msg_new(
1224 "UserID", MSIM_TYPE_INTEGER, session->userid, 1206 "UserID", MSIM_TYPE_INTEGER, session->userid,
1380 gchar *status_headline, *status_headline_escaped; 1362 gchar *status_headline, *status_headline_escaped;
1381 gint status_code, purple_status_code; 1363 gint status_code, purple_status_code;
1382 gchar *username; 1364 gchar *username;
1383 gchar *unrecognized_msg; 1365 gchar *unrecognized_msg;
1384 1366
1385 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
1386 g_return_val_if_fail(msg != NULL, FALSE); 1367 g_return_val_if_fail(msg != NULL, FALSE);
1387 1368
1388 /* Helpfully looked up by msim_incoming_resolve() for us. */ 1369 /* Helpfully looked up by msim_incoming_resolve() for us. */
1389 username = msim_msg_get_string(msg, "_username"); 1370 username = msim_msg_get_string(msg, "_username");
1390 g_return_val_if_fail(username != NULL, FALSE); 1371 g_return_val_if_fail(username != NULL, FALSE);
1575 msim_incoming_action_or_im(MsimSession *session, MsimMessage *msg) 1556 msim_incoming_action_or_im(MsimSession *session, MsimMessage *msg)
1576 { 1557 {
1577 gchar *msg_text, *username; 1558 gchar *msg_text, *username;
1578 gboolean rc; 1559 gboolean rc;
1579 1560
1580 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
1581 g_return_val_if_fail(msg != NULL, FALSE); 1561 g_return_val_if_fail(msg != NULL, FALSE);
1582 1562
1583 msg_text = msim_msg_get_string(msg, "msg"); 1563 msg_text = msim_msg_get_string(msg, "msg");
1584 g_return_val_if_fail(msg_text != NULL, FALSE); 1564 g_return_val_if_fail(msg_text != NULL, FALSE);
1585 1565
1795 { 1775 {
1796 MSIM_USER_LOOKUP_CB cb; 1776 MSIM_USER_LOOKUP_CB cb;
1797 gpointer data; 1777 gpointer data;
1798 guint rid, cmd, dsn, lid; 1778 guint rid, cmd, dsn, lid;
1799 1779
1800 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
1801 g_return_val_if_fail(msg != NULL, FALSE); 1780 g_return_val_if_fail(msg != NULL, FALSE);
1802 1781
1803 msim_store_user_info(session, msg, NULL); 1782 msim_store_user_info(session, msg, NULL);
1804 1783
1805 rid = msim_msg_get_integer(msg, "rid"); 1784 rid = msim_msg_get_integer(msg, "rid");
1846 msim_error(MsimSession *session, MsimMessage *msg) 1825 msim_error(MsimSession *session, MsimMessage *msg)
1847 { 1826 {
1848 gchar *errmsg, *full_errmsg; 1827 gchar *errmsg, *full_errmsg;
1849 guint err; 1828 guint err;
1850 1829
1851 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
1852 g_return_val_if_fail(msg != NULL, FALSE); 1830 g_return_val_if_fail(msg != NULL, FALSE);
1853 1831
1854 err = msim_msg_get_integer(msg, "err"); 1832 err = msim_msg_get_integer(msg, "err");
1855 errmsg = msim_msg_get_string(msg, "errmsg"); 1833 errmsg = msim_msg_get_string(msg, "errmsg");
1856 1834
1960 gpointer data) 1938 gpointer data)
1961 { 1939 {
1962 gchar *username; 1940 gchar *username;
1963 MsimMessage *msg, *body; 1941 MsimMessage *msg, *body;
1964 1942
1965 g_return_if_fail(MSIM_SESSION_VALID(session));
1966 g_return_if_fail(userinfo != NULL); 1943 g_return_if_fail(userinfo != NULL);
1967 1944
1968 body = msim_msg_get_dictionary(userinfo, "body"); 1945 body = msim_msg_get_dictionary(userinfo, "body");
1969 g_return_if_fail(body != NULL); 1946 g_return_if_fail(body != NULL);
1970 1947
1996 * @param msg MsimMessage *, freed by caller. 1973 * @param msg MsimMessage *, freed by caller.
1997 */ 1974 */
1998 static gboolean 1975 static gboolean
1999 msim_preprocess_incoming(MsimSession *session, MsimMessage *msg) 1976 msim_preprocess_incoming(MsimSession *session, MsimMessage *msg)
2000 { 1977 {
2001 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
2002 g_return_val_if_fail(msg != NULL, FALSE); 1978 g_return_val_if_fail(msg != NULL, FALSE);
2003 1979
2004 if (msim_msg_get(msg, "bm") && msim_msg_get(msg, "f")) { 1980 if (msim_msg_get(msg, "bm") && msim_msg_get(msg, "f")) {
2005 guint uid; 1981 guint uid;
2006 const gchar *username; 1982 const gchar *username;
2069 _("Invalid input condition")); 2045 _("Invalid input condition"));
2070 return; 2046 return;
2071 } 2047 }
2072 2048
2073 g_return_if_fail(cond == PURPLE_INPUT_READ); 2049 g_return_if_fail(cond == PURPLE_INPUT_READ);
2074 g_return_if_fail(MSIM_SESSION_VALID(session));
2075 2050
2076 /* Mark down that we got data, so we don't timeout. */ 2051 /* Mark down that we got data, so we don't timeout. */
2077 session->last_comm = time(NULL); 2052 session->last_comm = time(NULL);
2078 2053
2079 /* If approaching end of buffer, reallocate some more memory. */ 2054 /* If approaching end of buffer, reallocate some more memory. */
2301 if (session == NULL) 2276 if (session == NULL)
2302 return; 2277 return;
2303 2278
2304 gc->proto_data = NULL; 2279 gc->proto_data = NULL;
2305 2280
2306 if (!MSIM_SESSION_VALID(session)) {
2307 return;
2308 }
2309
2310 if (session->gc->inpa) { 2281 if (session->gc->inpa) {
2311 purple_input_remove(session->gc->inpa); 2282 purple_input_remove(session->gc->inpa);
2312 } 2283 }
2313 if (session->fd >= 0) { 2284 if (session->fd >= 0) {
2314 close(session->fd); 2285 close(session->fd);
2345 g_return_val_if_fail(message != NULL, -1); 2316 g_return_val_if_fail(message != NULL, -1);
2346 2317
2347 /* 'flags' has many options, not used here. */ 2318 /* 'flags' has many options, not used here. */
2348 2319
2349 session = (MsimSession *)gc->proto_data; 2320 session = (MsimSession *)gc->proto_data;
2350
2351 g_return_val_if_fail(MSIM_SESSION_VALID(session), -1);
2352 2321
2353 message_msim = html_to_msim_markup(session, message); 2322 message_msim = html_to_msim_markup(session, message);
2354 2323
2355 if (msim_send_bm(session, who, message_msim, MSIM_BM_ACTION_OR_IM_DELAYABLE)) { 2324 if (msim_send_bm(session, who, message_msim, MSIM_BM_ACTION_OR_IM_DELAYABLE)) {
2356 /* Return 1 to have Purple show this IM as being sent, 0 to not. I always 2325 /* Return 1 to have Purple show this IM as being sent, 0 to not. I always
2388 g_return_val_if_fail(gc != NULL, 0); 2357 g_return_val_if_fail(gc != NULL, 0);
2389 g_return_val_if_fail(name != NULL, 0); 2358 g_return_val_if_fail(name != NULL, 0);
2390 2359
2391 session = (MsimSession *)gc->proto_data; 2360 session = (MsimSession *)gc->proto_data;
2392 2361
2393 g_return_val_if_fail(MSIM_SESSION_VALID(session), 0);
2394
2395 switch (state) { 2362 switch (state) {
2396 case PURPLE_TYPING: 2363 case PURPLE_TYPING:
2397 typing_str = "%typing%"; 2364 typing_str = "%typing%";
2398 break; 2365 break;
2399 2366
2419 MsimMessage *msg; 2386 MsimMessage *msg;
2420 gchar *username; 2387 gchar *username;
2421 PurpleNotifyUserInfo *user_info; 2388 PurpleNotifyUserInfo *user_info;
2422 MsimUser *user; 2389 MsimUser *user;
2423 2390
2424 g_return_if_fail(MSIM_SESSION_VALID(session));
2425
2426 /* Get user{name,id} from msim_get_info, passed as an MsimMessage for 2391 /* Get user{name,id} from msim_get_info, passed as an MsimMessage for
2427 orthogonality. */ 2392 orthogonality. */
2428 msg = (MsimMessage *)data; 2393 msg = (MsimMessage *)data;
2429 g_return_if_fail(msg != NULL); 2394 g_return_if_fail(msg != NULL);
2430 2395
2477 2442
2478 g_return_if_fail(gc != NULL); 2443 g_return_if_fail(gc != NULL);
2479 g_return_if_fail(username != NULL); 2444 g_return_if_fail(username != NULL);
2480 2445
2481 session = (MsimSession *)gc->proto_data; 2446 session = (MsimSession *)gc->proto_data;
2482
2483 g_return_if_fail(MSIM_SESSION_VALID(session));
2484 2447
2485 /* Obtain uid of buddy. */ 2448 /* Obtain uid of buddy. */
2486 user = msim_find_user(session, username); 2449 user = msim_find_user(session, username);
2487 2450
2488 /* If is on buddy list, lookup by uid since it is faster. */ 2451 /* If is on buddy list, lookup by uid since it is faster. */
2513 * @param statstring Status string, must be a dynamic string (will be freed by msim_send). 2476 * @param statstring Status string, must be a dynamic string (will be freed by msim_send).
2514 */ 2477 */
2515 static void 2478 static void
2516 msim_set_status_code(MsimSession *session, guint status_code, gchar *statstring) 2479 msim_set_status_code(MsimSession *session, guint status_code, gchar *statstring)
2517 { 2480 {
2518 g_return_if_fail(MSIM_SESSION_VALID(session));
2519 g_return_if_fail(statstring != NULL); 2481 g_return_if_fail(statstring != NULL);
2520 2482
2521 purple_debug_info("msim", "msim_set_status_code: going to set status to code=%d,str=%s\n", 2483 purple_debug_info("msim", "msim_set_status_code: going to set status to code=%d,str=%s\n",
2522 status_code, statstring); 2484 status_code, statstring);
2523 2485
2546 gchar *stripped; 2508 gchar *stripped;
2547 gchar *unrecognized_msg; 2509 gchar *unrecognized_msg;
2548 2510
2549 session = (MsimSession *)account->gc->proto_data; 2511 session = (MsimSession *)account->gc->proto_data;
2550 2512
2551 g_return_if_fail(MSIM_SESSION_VALID(session));
2552
2553 type = purple_status_get_type(status); 2513 type = purple_status_get_type(status);
2554 pres = purple_status_get_presence(status); 2514 pres = purple_status_get_presence(status);
2555 2515
2556 switch (purple_status_type_get_primitive(type)) { 2516 switch (purple_status_type_get_primitive(type)) {
2557 case PURPLE_STATUS_AVAILABLE: 2517 case PURPLE_STATUS_AVAILABLE:
2610 PurpleStatus *status; 2570 PurpleStatus *status;
2611 2571
2612 g_return_if_fail(gc != NULL); 2572 g_return_if_fail(gc != NULL);
2613 2573
2614 session = (MsimSession *)gc->proto_data; 2574 session = (MsimSession *)gc->proto_data;
2615
2616 g_return_if_fail(MSIM_SESSION_VALID(session));
2617 2575
2618 status = purple_account_get_active_status(session->account); 2576 status = purple_account_get_active_status(session->account);
2619 2577
2620 if (time == 0) { 2578 if (time == 0) {
2621 /* Going back from idle. In msim, idle is mutually exclusive 2579 /* Going back from idle. In msim, idle is mutually exclusive
3003 g_return_val_if_fail(buf != NULL, -1); 2961 g_return_val_if_fail(buf != NULL, -1);
3004 g_return_val_if_fail(total_bytes >= 0, -1); 2962 g_return_val_if_fail(total_bytes >= 0, -1);
3005 2963
3006 session = (MsimSession *)gc->proto_data; 2964 session = (MsimSession *)gc->proto_data;
3007 2965
3008 g_return_val_if_fail(MSIM_SESSION_VALID(session), -1);
3009
3010 /* Loop until all data is sent, or a failure occurs. */ 2966 /* Loop until all data is sent, or a failure occurs. */
3011 total_bytes_sent = 0; 2967 total_bytes_sent = 0;
3012 do { 2968 do {
3013 int bytes_sent; 2969 int bytes_sent;
3014 2970
3039 gboolean 2995 gboolean
3040 msim_send_raw(MsimSession *session, const gchar *msg) 2996 msim_send_raw(MsimSession *session, const gchar *msg)
3041 { 2997 {
3042 size_t len; 2998 size_t len;
3043 2999
3044 g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
3045 g_return_val_if_fail(msg != NULL, FALSE); 3000 g_return_val_if_fail(msg != NULL, FALSE);
3046 3001
3047 purple_debug_info("msim", "msim_send_raw: writing <%s>\n", msg); 3002 purple_debug_info("msim", "msim_send_raw: writing <%s>\n", msg);
3048 len = strlen(msg); 3003 len = strlen(msg);
3049 3004