summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2014-05-24 18:57:29 +0200
committerSébastien Helleu <flashcode@flashtux.org>2014-05-24 18:57:29 +0200
commit02eed97d977567b0fb16cfeeaeebb863eab1e509 (patch)
treedcd39d052d85b522eb71a3a6fd293cc180c2ed4b
parentfaae8f470b3f1cec6b77c7844b78ac64ce2845b6 (diff)
downloadweechat-02eed97d977567b0fb16cfeeaeebb863eab1e509.zip
relay: fix crash when closing relay buffers (closes #57, closes #78)
A flag "closing" has been added in buffers. It is set to 1 when the buffer is closing, and then no more printf is allowed in the buffer (a message printed on relay buffer was causing a crash when it is closed).
-rw-r--r--ChangeLog.asciidoc1
-rw-r--r--src/gui/gui-buffer.c25
-rw-r--r--src/gui/gui-buffer.h1
-rw-r--r--src/gui/gui-chat.c12
4 files changed, 28 insertions, 11 deletions
diff --git a/ChangeLog.asciidoc b/ChangeLog.asciidoc
index ffb783291..c7817de09 100644
--- a/ChangeLog.asciidoc
+++ b/ChangeLog.asciidoc
@@ -139,6 +139,7 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
* lua: fix interpreter used after unload of a script
* perl: fix context used after unload of a script
* python: fix interpreter used after unload of a script
+* relay: fix crash when closing relay buffers (closes #57, closes #78)
* relay: check pointers received in hdata command to prevent crashes with bad
pointers (WeeChat protocol)
* relay: remove warning on /reload of relay.conf when ports are defined
diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c
index 2bc130961..4794fd12f 100644
--- a/src/gui/gui-buffer.c
+++ b/src/gui/gui-buffer.c
@@ -78,14 +78,14 @@ char *gui_buffer_notify_string[GUI_BUFFER_NUM_NOTIFY] =
char *gui_buffer_properties_get_integer[] =
{ "number", "layout_number", "layout_number_merge_order", "type", "notify",
"num_displayed", "active", "hidden", "zoomed", "print_hooks_enabled",
- "day_change", "clear", "filter", "lines_hidden", "prefix_max_length",
- "time_for_each_line", "nicklist", "nicklist_case_sensitive",
- "nicklist_max_length", "nicklist_display_groups", "nicklist_count",
- "nicklist_groups_count", "nicklist_nicks_count", "nicklist_visible_count",
- "input", "input_get_unknown_commands", "input_size", "input_length",
- "input_pos", "input_1st_display", "num_history", "text_search",
- "text_search_exact", "text_search_regex", "text_search_where",
- "text_search_found",
+ "day_change", "clear", "filter", "closing", "lines_hidden",
+ "prefix_max_length", "time_for_each_line", "nicklist",
+ "nicklist_case_sensitive", "nicklist_max_length", "nicklist_display_groups",
+ "nicklist_count", "nicklist_groups_count", "nicklist_nicks_count",
+ "nicklist_visible_count", "input", "input_get_unknown_commands",
+ "input_size", "input_length", "input_pos", "input_1st_display",
+ "num_history", "text_search", "text_search_exact", "text_search_regex",
+ "text_search_where", "text_search_found",
NULL
};
char *gui_buffer_properties_get_string[] =
@@ -603,6 +603,7 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
/* close callback */
new_buffer->close_callback = close_callback;
new_buffer->close_callback_data = close_callback_data;
+ new_buffer->closing = 0;
/* title */
new_buffer->title = NULL;
@@ -995,6 +996,8 @@ gui_buffer_get_integer (struct t_gui_buffer *buffer, const char *property)
return buffer->clear;
else if (string_strcasecmp (property, "filter") == 0)
return buffer->filter;
+ else if (string_strcasecmp (property, "closing") == 0)
+ return buffer->closing;
else if (string_strcasecmp (property, "lines_hidden") == 0)
return buffer->lines->lines_hidden;
else if (string_strcasecmp (property, "prefix_max_length") == 0)
@@ -2515,6 +2518,8 @@ gui_buffer_close (struct t_gui_buffer *buffer)
int index, i;
struct t_gui_buffer_visited *ptr_buffer_visited;
+ buffer->closing = 1;
+
(void) hook_signal_send ("buffer_closing",
WEECHAT_HOOK_SIGNAL_POINTER, buffer);
@@ -3964,6 +3969,7 @@ gui_buffer_hdata_buffer_cb (void *data, const char *hdata_name)
HDATA_VAR(struct t_gui_buffer, filter, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, close_callback, POINTER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, close_callback_data, POINTER, 0, NULL, NULL);
+ HDATA_VAR(struct t_gui_buffer, closing, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, title, STRING, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, own_lines, POINTER, 0, NULL, "lines");
HDATA_VAR(struct t_gui_buffer, mixed_lines, POINTER, 0, NULL, "lines");
@@ -4146,6 +4152,8 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!infolist_new_var_integer (ptr_item, "filter", buffer->filter))
return 0;
+ if (!infolist_new_var_integer (ptr_item, "closing", buffer->closing))
+ return 0;
if (!infolist_new_var_integer (ptr_item, "first_line_not_read", buffer->lines->first_line_not_read))
return 0;
if (!infolist_new_var_integer (ptr_item, "lines_hidden", buffer->lines->lines_hidden))
@@ -4358,6 +4366,7 @@ gui_buffer_print_log ()
log_printf (" filter. . . . . . . . . : %d", ptr_buffer->filter);
log_printf (" close_callback. . . . . : 0x%lx", ptr_buffer->close_callback);
log_printf (" close_callback_data . . : 0x%lx", ptr_buffer->close_callback_data);
+ log_printf (" closing . . . . . . . . : %d", ptr_buffer->closing);
log_printf (" title . . . . . . . . . : '%s'", ptr_buffer->title);
log_printf (" own_lines . . . . . . . : 0x%lx", ptr_buffer->own_lines);
gui_lines_print_log (ptr_buffer->own_lines);
diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h
index fa0c6c8fa..c142dbdbf 100644
--- a/src/gui/gui-buffer.h
+++ b/src/gui/gui-buffer.h
@@ -109,6 +109,7 @@ struct t_gui_buffer
int (*close_callback)(void *data, /* called when buffer is closed */
struct t_gui_buffer *buffer);
void *close_callback_data; /* data for callback */
+ int closing; /* 1 if the buffer is being closed */
/* buffer title */
char *title; /* buffer title */
diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c
index b14c896af..4a8ba2660 100644
--- a/src/gui/gui-chat.c
+++ b/src/gui/gui-chat.c
@@ -644,10 +644,10 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
char *modifier_data, *new_msg, *ptr_msg, *lines_waiting;
struct t_gui_line *ptr_line;
- if (!gui_buffer_valid (buffer))
+ if (!message)
return;
- if (!message)
+ if (!gui_buffer_valid (buffer))
return;
if (gui_init_ok)
@@ -655,7 +655,7 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
if (!buffer)
buffer = gui_buffer_search_main ();
- if (!buffer)
+ if (!buffer || buffer->closing)
return;
if (buffer->type != GUI_BUFFER_TYPE_FORMATTED)
@@ -842,11 +842,17 @@ gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...)
struct t_gui_line *ptr_line;
int i, num_lines_to_add;
+ if (!gui_buffer_valid (buffer))
+ return;
+
if (gui_init_ok)
{
if (!buffer)
buffer = gui_buffer_search_main ();
+ if (!buffer || buffer->closing)
+ return;
+
if (buffer->type != GUI_BUFFER_TYPE_FREE)
buffer = gui_buffers;