From 846dde00aae772c5df89da7534409cab73952650 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 5 Jan 2014 14:37:27 +0100 Subject: [PATCH] core: fix crash with hdata_update on shared strings, add hdata type "shared_string" (bug #41104) --- ChangeLog | 2 ++ doc/en/weechat_plugin_api.en.txt | 4 ++++ doc/fr/weechat_plugin_api.fr.txt | 4 ++++ doc/it/weechat_plugin_api.it.txt | 4 ++++ src/core/wee-eval.c | 1 + src/core/wee-hdata.c | 9 +++++++++ src/gui/gui-line.c | 4 ++-- src/gui/gui-nicklist.c | 12 ++++++------ src/plugins/relay/weechat/relay-weechat-msg.c | 3 +++ src/plugins/weechat-plugin.h | 3 ++- 10 files changed, 37 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index f49d971db..879bdd03a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,8 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes] == Version 0.4.3 (under dev) +* core: fix crash with hdata_update on shared strings, add hdata type + "shared_string" (bug #41104) * core: add support of UTF-8 chars in horizontal/vertical separators (options weechat.look.separator_{horizontal|vertical}) * core: add option weechat.look.window_auto_zoom, disable automatic zoom by diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt index 934597f01..1842b3bb5 100644 --- a/doc/en/weechat_plugin_api.en.txt +++ b/doc/en/weechat_plugin_api.en.txt @@ -13015,6 +13015,7 @@ Arguments: ** WEECHAT_HDATA_INTEGER ** WEECHAT_HDATA_LONG ** WEECHAT_HDATA_STRING +** WEECHAT_HDATA_SHARED_STRING ** WEECHAT_HDATA_POINTER ** WEECHAT_HDATA_TIME ** WEECHAT_HDATA_HASHTABLE @@ -13262,6 +13263,9 @@ switch (type) case WEECHAT_HDATA_STRING: /* ... */ break; + case WEECHAT_HDATA_SHARED_STRING: + /* ... */ + break; case WEECHAT_HDATA_POINTER: /* ... */ break; diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt index 27807f4d7..af5af0171 100644 --- a/doc/fr/weechat_plugin_api.fr.txt +++ b/doc/fr/weechat_plugin_api.fr.txt @@ -13250,6 +13250,7 @@ Paramètres : ** WEECHAT_HDATA_INTEGER ** WEECHAT_HDATA_LONG ** WEECHAT_HDATA_STRING +** WEECHAT_HDATA_SHARED_STRING ** WEECHAT_HDATA_POINTER ** WEECHAT_HDATA_TIME ** WEECHAT_HDATA_HASHTABLE @@ -13500,6 +13501,9 @@ switch (type) case WEECHAT_HDATA_STRING: /* ... */ break; + case WEECHAT_HDATA_SHARED_STRING: + /* ... */ + break; case WEECHAT_HDATA_POINTER: /* ... */ break; diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt index c992513d8..a0793f6ba 100644 --- a/doc/it/weechat_plugin_api.it.txt +++ b/doc/it/weechat_plugin_api.it.txt @@ -13263,6 +13263,7 @@ Argomenti: ** WEECHAT_HDATA_INTEGER ** WEECHAT_HDATA_LONG ** WEECHAT_HDATA_STRING +** WEECHAT_HDATA_SHARED_STRING ** WEECHAT_HDATA_POINTER ** WEECHAT_HDATA_TIME ** WEECHAT_HDATA_HASHTABLE @@ -13513,6 +13514,9 @@ switch (type) case WEECHAT_HDATA_STRING: /* ... */ break; + case WEECHAT_HDATA_SHARED_STRING: + /* ... */ + break; case WEECHAT_HDATA_POINTER: /* ... */ break; diff --git a/src/core/wee-eval.c b/src/core/wee-eval.c index a982011dc..468e1497c 100644 --- a/src/core/wee-eval.c +++ b/src/core/wee-eval.c @@ -129,6 +129,7 @@ eval_hdata_get_value (struct t_hdata *hdata, void *pointer, const char *path) value = strdup (str_value); break; case WEECHAT_HDATA_STRING: + case WEECHAT_HDATA_SHARED_STRING: ptr_value = hdata_string (hdata, pointer, var_name); value = (ptr_value) ? strdup (ptr_value) : NULL; break; diff --git a/src/core/wee-hdata.c b/src/core/wee-hdata.c index e6d710c4c..fea9207b4 100644 --- a/src/core/wee-hdata.c +++ b/src/core/wee-hdata.c @@ -254,6 +254,7 @@ hdata_get_var_array_size (struct t_hdata *hdata, void *pointer, * types: string, pointer, hashtable) */ if ((var->type == WEECHAT_HDATA_STRING) + || (var->type == WEECHAT_HDATA_SHARED_STRING) || (var->type == WEECHAT_HDATA_POINTER) || (var->type == WEECHAT_HDATA_HASHTABLE)) { @@ -266,6 +267,7 @@ hdata_get_var_array_size (struct t_hdata *hdata, void *pointer, switch (var->type) { case WEECHAT_HDATA_STRING: + case WEECHAT_HDATA_SHARED_STRING: ptr_value = (*((char ***)(pointer + var->offset)))[i]; break; case WEECHAT_HDATA_POINTER: @@ -836,6 +838,13 @@ hdata_set (struct t_hdata *hdata, void *pointer, const char *name, *ptr_string = (value) ? strdup (value) : NULL; return 1; break; + case WEECHAT_HDATA_SHARED_STRING: + ptr_string = (char **)(pointer + var->offset); + if (*ptr_string) + string_shared_free (*ptr_string); + *ptr_string = (value) ? (char *)string_shared_get (value) : NULL; + return 1; + break; case WEECHAT_HDATA_POINTER: rc = sscanf (value, "%lx", &ptr); if ((rc != EOF) && (rc != 0)) diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c index fccb4ddd2..ed9b67a78 100644 --- a/src/gui/gui-line.c +++ b/src/gui/gui-line.c @@ -1688,11 +1688,11 @@ gui_line_hdata_line_data_cb (void *data, const char *hdata_name) HDATA_VAR(struct t_gui_line_data, date_printed, TIME, 1, NULL, NULL); HDATA_VAR(struct t_gui_line_data, str_time, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, tags_count, INTEGER, 0, NULL, NULL); - HDATA_VAR(struct t_gui_line_data, tags_array, STRING, 1, "tags_count", NULL); + HDATA_VAR(struct t_gui_line_data, tags_array, SHARED_STRING, 1, "tags_count", NULL); HDATA_VAR(struct t_gui_line_data, displayed, CHAR, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, highlight, CHAR, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, refresh_needed, CHAR, 0, NULL, NULL); - HDATA_VAR(struct t_gui_line_data, prefix, STRING, 1, NULL, NULL); + HDATA_VAR(struct t_gui_line_data, prefix, SHARED_STRING, 1, NULL, NULL); HDATA_VAR(struct t_gui_line_data, prefix_length, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, message, STRING, 1, NULL, NULL); } diff --git a/src/gui/gui-nicklist.c b/src/gui/gui-nicklist.c index 18a755394..f9921f7b1 100644 --- a/src/gui/gui-nicklist.c +++ b/src/gui/gui-nicklist.c @@ -1046,8 +1046,8 @@ gui_nicklist_hdata_nick_group_cb (void *data, const char *hdata_name) 0, 0, NULL, NULL); if (hdata) { - HDATA_VAR(struct t_gui_nick_group, name, STRING, 0, NULL, NULL); - HDATA_VAR(struct t_gui_nick_group, color, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick_group, name, SHARED_STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick_group, color, SHARED_STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_nick_group, visible, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_nick_group, level, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_nick_group, parent, POINTER, 0, NULL, hdata_name); @@ -1078,10 +1078,10 @@ gui_nicklist_hdata_nick_cb (void *data, const char *hdata_name) if (hdata) { HDATA_VAR(struct t_gui_nick, group, POINTER, 0, NULL, "nick_group"); - HDATA_VAR(struct t_gui_nick, name, STRING, 0, NULL, NULL); - HDATA_VAR(struct t_gui_nick, color, STRING, 0, NULL, NULL); - HDATA_VAR(struct t_gui_nick, prefix, STRING, 0, NULL, NULL); - HDATA_VAR(struct t_gui_nick, prefix_color, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick, name, SHARED_STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick, color, SHARED_STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick, prefix, SHARED_STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_nick, prefix_color, SHARED_STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_nick, visible, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_nick, prev_nick, POINTER, 0, NULL, hdata_name); HDATA_VAR(struct t_gui_nick, next_nick, POINTER, 0, NULL, hdata_name); diff --git a/src/plugins/relay/weechat/relay-weechat-msg.c b/src/plugins/relay/weechat/relay-weechat-msg.c index 753a5057b..c05aa1e44 100644 --- a/src/plugins/relay/weechat/relay-weechat-msg.c +++ b/src/plugins/relay/weechat/relay-weechat-msg.c @@ -433,6 +433,7 @@ relay_weechat_msg_add_hdata_path (struct t_relay_weechat_msg *msg, relay_weechat_msg_add_type (msg, RELAY_WEECHAT_MSG_OBJ_LONG); break; case WEECHAT_HDATA_STRING: + case WEECHAT_HDATA_SHARED_STRING: relay_weechat_msg_add_type (msg, RELAY_WEECHAT_MSG_OBJ_STRING); break; case WEECHAT_HDATA_POINTER: @@ -476,6 +477,7 @@ relay_weechat_msg_add_hdata_path (struct t_relay_weechat_msg *msg, name)); break; case WEECHAT_HDATA_STRING: + case WEECHAT_HDATA_SHARED_STRING: relay_weechat_msg_add_string (msg, weechat_hdata_string (hdata, pointer, @@ -664,6 +666,7 @@ relay_weechat_msg_add_hdata (struct t_relay_weechat_msg *msg, strcat (keys_types, RELAY_WEECHAT_MSG_OBJ_LONG); break; case WEECHAT_HDATA_STRING: + case WEECHAT_HDATA_SHARED_STRING: strcat (keys_types, RELAY_WEECHAT_MSG_OBJ_STRING); break; case WEECHAT_HDATA_POINTER: diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index 7d569ff27..00d5ca826 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -56,7 +56,7 @@ struct timeval; * please change the date with current one; for a second change at same * date, increment the 01, otherwise please keep 01. */ -#define WEECHAT_PLUGIN_API_VERSION "20130819-01" +#define WEECHAT_PLUGIN_API_VERSION "20140105-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -122,6 +122,7 @@ struct timeval; #define WEECHAT_HDATA_POINTER 5 #define WEECHAT_HDATA_TIME 6 #define WEECHAT_HDATA_HASHTABLE 7 +#define WEECHAT_HDATA_SHARED_STRING 8 /* buffer hotlist */ #define WEECHAT_HOTLIST_LOW "0"