core: fix crash with hdata_update on shared strings, add hdata type "shared_string" (bug #41104)

v2.8-utf8proc
Sebastien Helleu 2014-01-05 14:37:27 +01:00
parent 7dfaca9ef3
commit 846dde00aa
10 changed files with 37 additions and 9 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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))

View File

@ -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);
}

View File

@ -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);

View File

@ -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:

View File

@ -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"