diff options
author | Stu Tomlinson <nosnilmot@pidgin.im> | 2007-12-06 01:19:19 +0000 |
---|---|---|
committer | Stu Tomlinson <nosnilmot@pidgin.im> | 2007-12-06 01:19:19 +0000 |
commit | c3bf32ff20c09be8fe055b84379287a6ee7e5cc0 (patch) | |
tree | 402418d509d249476dd1f76a869583852010c25f | |
parent | ad81ca666f3c3432c9b9871abc528aba83836a18 (diff) | |
download | pidgin-c3bf32ff20c09be8fe055b84379287a6ee7e5cc0.tar.gz |
applied changes from 8d953d5714cb202c5fa66fda1b0f31f01a969622
through 2ffbc249cf14de9e738c76f8cdb0f55d32cdbf03
applied changes from 2ffbc249cf14de9e738c76f8cdb0f55d32cdbf03
through 51648da970800504c5fef1552e7475982f977904
applied changes from 51648da970800504c5fef1552e7475982f977904
through 93a8de710501e9a772b3fb12ab3db6682a41b3d6
Plug several leaks in perl plugins
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/BuddyList.xs | 20 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Cmds.xs | 10 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Conversation.xs | 4 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Log.xs | 29 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Pounce.xs | 12 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Prefs.xs | 2 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Prpl.xs | 10 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/SavedStatuses.xs | 6 | ||||
-rw-r--r-- | libpurple/plugins/perl/common/Status.xs | 35 |
10 files changed, 86 insertions, 43 deletions
@@ -19,6 +19,7 @@ version 2.3.1 (12/??/2007): * Update QQ client version so we can connect again * Do not allow ISON requests to stack in IRC, preventing flooding IRC servers when temporary network outages are restored + * Plug several leaks in the perl plugin loader version 2.3.0 (11/24/2007): diff --git a/libpurple/plugins/perl/common/BuddyList.xs b/libpurple/plugins/perl/common/BuddyList.xs index 38d568c0cd..585e066431 100644 --- a/libpurple/plugins/perl/common/BuddyList.xs +++ b/libpurple/plugins/perl/common/BuddyList.xs @@ -44,11 +44,13 @@ purple_find_buddies(account, name) Purple::Account account const char * name PREINIT: - GSList *l; + GSList *l, *ll; PPCODE: - for (l = purple_find_buddies(account, name); l != NULL; l = l->next) { + ll = purple_find_buddies(account, name); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::BuddyList::Buddy"))); } + g_slist_free(ll); Purple::BuddyList::Group purple_find_group(name) @@ -101,11 +103,13 @@ void purple_group_get_accounts(group) Purple::BuddyList::Group group PREINIT: - GSList *l; + GSList *l, *ll; PPCODE: - for (l = purple_group_get_accounts(group); l != NULL; l = l->next) { + ll = purple_group_get_accounts(group); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Account"))); } + g_slist_free(ll); gboolean purple_group_on_account(group, account) @@ -268,11 +272,15 @@ void purple_blist_node_get_extended_menu(node) Purple::BuddyList::Node node PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_blist_node_get_extended_menu(node); l != NULL; l = g_list_delete_link(l, l)) { + ll = purple_blist_node_get_extended_menu(node); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Menu::Action"))); } + /* We can free the list here but the script needs to free the + * Purple::Menu::Action 'objects' itself. */ + g_list_free(ll); void purple_blist_node_set_bool(node, key, value) diff --git a/libpurple/plugins/perl/common/Cmds.xs b/libpurple/plugins/perl/common/Cmds.xs index 14059590da..42ac98bcf5 100644 --- a/libpurple/plugins/perl/common/Cmds.xs +++ b/libpurple/plugins/perl/common/Cmds.xs @@ -66,21 +66,23 @@ purple_cmd_help(conv, command) Purple::Conversation conv const gchar *command PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_cmd_help(conv, command); l != NULL; l = l->next) { + for (l = ll = purple_cmd_help(conv, command); l != NULL; l = l->next) { XPUSHs(sv_2mortal(newSVpv(l->data, 0))); } + g_list_free(ll); void purple_cmd_list(conv) Purple::Conversation conv PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_cmd_list(conv); l != NULL; l = l->next) { + for (l = ll = purple_cmd_list(conv); l != NULL; l = l->next) { XPUSHs(sv_2mortal(newSVpv(l->data, 0))); } + g_list_free(ll); Purple::Cmd::Id purple_cmd_register(plugin, command, args, priority, flag, prpl_id, func, helpstr, data = 0) diff --git a/libpurple/plugins/perl/common/Conversation.xs b/libpurple/plugins/perl/common/Conversation.xs index da261689dc..180a94d9fa 100644 --- a/libpurple/plugins/perl/common/Conversation.xs +++ b/libpurple/plugins/perl/common/Conversation.xs @@ -464,6 +464,10 @@ PPCODE: purple_conv_chat_add_users(chat, t_GL_users, t_GL_extra_msgs, t_GL_flags, new_arrivals); + g_list_free(t_GL_users); + g_list_free(t_GL_extra_msgs); + g_list_free(t_GL_flags); + gboolean purple_conv_chat_find_user(chat, user) Purple::Conversation::Chat chat diff --git a/libpurple/plugins/perl/common/Log.xs b/libpurple/plugins/perl/common/Log.xs index 7f16d29c15..bc47acadc5 100644 --- a/libpurple/plugins/perl/common/Log.xs +++ b/libpurple/plugins/perl/common/Log.xs @@ -65,11 +65,15 @@ purple_log_get_logs(type, name, account) const char *name Purple::Account account PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_get_logs(type, name, account); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + ll = purple_log_get_logs(type, name, account); + for (l = ll; l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Log"))); } + /* We can free the list here but the script needs to free the + * Purple::Log 'objects' itself. */ + g_list_free(ll); int purple_log_get_size(log) @@ -79,11 +83,15 @@ void purple_log_get_system_logs(account) Purple::Account account PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_get_system_logs(account); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + ll = purple_log_get_system_logs(account); + for (l = ll; l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Log"))); } + /* We can free the list here but the script needs to free the + * Purple::Log 'objects' itself. */ + g_list_free(ll); int purple_log_get_total_size(type, name, account) @@ -101,11 +109,14 @@ purple_log_logger_free(logger) void purple_log_logger_get_options() PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_logger_get_options(); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + /* This might want to be massaged to a hash, since that's essentially + * what the key/value list is emulating. */ + for (l = ll = purple_log_logger_get_options(); l != NULL; l = l->next) { + XPUSHs(sv_2mortal(newSVpv(l->data, 0))); } + g_list_free(ll); gchar_own * purple_log_read(log, flags) diff --git a/libpurple/plugins/perl/common/Pounce.xs b/libpurple/plugins/perl/common/Pounce.xs index 8fc6e68ee6..e6b9ba8271 100644 --- a/libpurple/plugins/perl/common/Pounce.xs +++ b/libpurple/plugins/perl/common/Pounce.xs @@ -106,6 +106,18 @@ PPCODE: XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Pounce"))); } +void +purple_pounces_get_all_for_ui(ui) + const char *ui +PREINIT: + GList *l, *ll; +PPCODE: + ll = purple_pounces_get_all_for_ui(ui); + for (l = ll; l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Pounce"))); + } + g_list_free(ll); + Purple::Handle purple_pounces_get_handle() diff --git a/libpurple/plugins/perl/common/Prefs.xs b/libpurple/plugins/perl/common/Prefs.xs index d3f19bbe78..e1a037a550 100644 --- a/libpurple/plugins/perl/common/Prefs.xs +++ b/libpurple/plugins/perl/common/Prefs.xs @@ -57,6 +57,7 @@ PPCODE: t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(value), i, 0), t_sl)); } purple_prefs_add_string_list(name, t_GL); + g_list_free(t_GL); void purple_prefs_destroy() @@ -159,6 +160,7 @@ PPCODE: t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(value), i, 0), t_sl)); } purple_prefs_set_string_list(name, t_GL); + g_list_free(t_GL); void purple_prefs_trigger_callback(name) diff --git a/libpurple/plugins/perl/common/Prpl.xs b/libpurple/plugins/perl/common/Prpl.xs index b3e9c74e52..bbbdeb379a 100644 --- a/libpurple/plugins/perl/common/Prpl.xs +++ b/libpurple/plugins/perl/common/Prpl.xs @@ -21,13 +21,15 @@ purple_prpl_get_statuses(account, presence) Purple::Account account Purple::Presence presence PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_prpl_get_statuses(account,presence); l != NULL; l = l->next) { - /* XXX Someone please test and make sure this is the right - * type for these things. */ + ll = purple_prpl_get_statuses(account,presence); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Status"))); } + /* We can free the list here but the script needs to free the + * Purple::Status 'objects' itself. */ + g_list_free(ll); void purple_prpl_got_account_idle(account, idle, idle_time) diff --git a/libpurple/plugins/perl/common/SavedStatuses.xs b/libpurple/plugins/perl/common/SavedStatuses.xs index 098655f76a..d6e65f3ac5 100644 --- a/libpurple/plugins/perl/common/SavedStatuses.xs +++ b/libpurple/plugins/perl/common/SavedStatuses.xs @@ -140,11 +140,13 @@ void purple_savedstatuses_get_popular(how_many) unsigned int how_many PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_savedstatuses_get_popular(how_many); l != NULL; l = l->next) { + ll = purple_savedstatuses_get_popular(how_many); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::SavedStatus"))); } + g_list_free(ll); Purple::Handle purple_savedstatuses_get_handle() diff --git a/libpurple/plugins/perl/common/Status.xs b/libpurple/plugins/perl/common/Status.xs index ff5d440415..e73cc5f8ed 100644 --- a/libpurple/plugins/perl/common/Status.xs +++ b/libpurple/plugins/perl/common/Status.xs @@ -90,6 +90,7 @@ PPCODE: t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(source_list), i, 0), t_sl)); } purple_presence_add_list(presence, t_GL); + g_list_free(t_GL); void purple_presence_add_status(presence, status) @@ -361,14 +362,26 @@ void purple_status_type_destroy(status_type) Purple::StatusType status_type +Purple::StatusAttr +purple_status_type_get_attr(status_type, id) + Purple::StatusType status_type + const char *id + +void +purple_status_type_get_attrs(status_type) + Purple::StatusType status_type +PREINIT: + GList *l; +PPCODE: + for (l = purple_status_type_get_attrs(status_type); l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::StatusAttr"))); + } + Purple::StatusType purple_status_type_find_with_id(status_types, id) SV *status_types const char *id PREINIT: -/* XXX Check that this function actually works, I think it might need a */ -/* status_type as it's first argument to work as $status_type->find_with_id */ -/* properly. */ GList *t_GL; int i, t_len; CODE: @@ -380,24 +393,10 @@ CODE: t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(status_types), i, 0), t_sl)); } RETVAL = (PurpleStatusType *)purple_status_type_find_with_id(t_GL, id); + g_list_free(t_GL); OUTPUT: RETVAL -Purple::StatusAttr -purple_status_type_get_attr(status_type, id) - Purple::StatusType status_type - const char *id - -void -purple_status_type_get_attrs(status_type) - Purple::StatusType status_type -PREINIT: - GList *l; -PPCODE: - for (l = purple_status_type_get_attrs(status_type); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::StatusAttr"))); - } - const char * purple_status_type_get_id(status_type) Purple::StatusType status_type |