summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStu Tomlinson <nosnilmot@pidgin.im>2007-12-06 01:19:19 +0000
committerStu Tomlinson <nosnilmot@pidgin.im>2007-12-06 01:19:19 +0000
commitc3bf32ff20c09be8fe055b84379287a6ee7e5cc0 (patch)
tree402418d509d249476dd1f76a869583852010c25f
parentad81ca666f3c3432c9b9871abc528aba83836a18 (diff)
downloadpidgin-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--ChangeLog1
-rw-r--r--libpurple/plugins/perl/common/BuddyList.xs20
-rw-r--r--libpurple/plugins/perl/common/Cmds.xs10
-rw-r--r--libpurple/plugins/perl/common/Conversation.xs4
-rw-r--r--libpurple/plugins/perl/common/Log.xs29
-rw-r--r--libpurple/plugins/perl/common/Pounce.xs12
-rw-r--r--libpurple/plugins/perl/common/Prefs.xs2
-rw-r--r--libpurple/plugins/perl/common/Prpl.xs10
-rw-r--r--libpurple/plugins/perl/common/SavedStatuses.xs6
-rw-r--r--libpurple/plugins/perl/common/Status.xs35
10 files changed, 86 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index 7c5ddb9c76..d11271156d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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