diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2011-08-28 15:25:30 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2011-08-28 15:25:30 +0200 |
commit | f843f904bc9fc1c8d0d2dfddd5e15aaa9738ec0d (patch) | |
tree | 82944d494970ee9095e0dfd59cb2edaf067cb379 | |
parent | e411d14b7a239b47a87f22c20ce193e37481f672 (diff) | |
download | weechat-f843f904bc9fc1c8d0d2dfddd5e15aaa9738ec0d.zip |
core: fix bugs with calls to realloc
-rw-r--r-- | src/core/wee-string.c | 27 | ||||
-rw-r--r-- | src/core/wee-util.c | 38 | ||||
-rw-r--r-- | src/gui/gui-bar-window.c | 122 | ||||
-rw-r--r-- | src/gui/gui-buffer.c | 9 | ||||
-rw-r--r-- | src/gui/gui-color.c | 9 | ||||
-rw-r--r-- | src/gui/gui-input.c | 13 | ||||
-rw-r--r-- | src/gui/gui-key.c | 14 | ||||
-rw-r--r-- | src/plugins/alias/alias.c | 15 | ||||
-rw-r--r-- | src/plugins/irc/irc-mode.c | 22 | ||||
-rw-r--r-- | src/plugins/irc/irc-notify.c | 14 | ||||
-rw-r--r-- | src/plugins/irc/irc-protocol.c | 13 | ||||
-rw-r--r-- | src/plugins/irc/irc-redirect.c | 15 | ||||
-rw-r--r-- | src/plugins/irc/irc-server.c | 13 | ||||
-rw-r--r-- | src/plugins/relay/relay-client-irc.c | 11 | ||||
-rw-r--r-- | src/plugins/rmodifier/rmodifier.c | 11 | ||||
-rw-r--r-- | src/plugins/scripts/script.c | 15 |
16 files changed, 257 insertions, 104 deletions
diff --git a/src/core/wee-string.c b/src/core/wee-string.c index 7ebee8c44..49d9c6bf3 100644 --- a/src/core/wee-string.c +++ b/src/core/wee-string.c @@ -1039,7 +1039,7 @@ char ** string_split_command (const char *command, char separator) { int nb_substr, arr_idx, str_idx, type; - char **array; + char **array, **array2; char *buffer, *p; const char *ptr; @@ -1105,12 +1105,18 @@ string_split_command (const char *command, char separator) array[arr_idx++] = strdup (p); array[arr_idx] = NULL; - + free (buffer); - - array = realloc (array, (arr_idx + 1) * sizeof(array[0])); - - return array; + + array2 = realloc (array, (arr_idx + 1) * sizeof(array[0])); + if (!array2) + { + if (array) + free (array); + return NULL; + } + + return array2; } /* @@ -1611,7 +1617,7 @@ string_replace_with_hashtable (const char *string, int *errors) { int length, length_value, index_string, index_result; - char *result, *key; + char *result, *result2, *key; const char *pos_end_name, *ptr_value; *errors = 0; @@ -1651,12 +1657,15 @@ string_replace_with_hashtable (const char *string, { length_value = strlen (ptr_value); length += length_value; - result = realloc (result, length); - if (!result) + result2 = realloc (result, length); + if (!result2) { + if (result) + free (result); free (key); return NULL; } + result = result2; strcpy (result + index_result, ptr_value); index_result += length_value; index_string += pos_end_name - string - diff --git a/src/core/wee-util.c b/src/core/wee-util.c index 1346d1798..d78cc856e 100644 --- a/src/core/wee-util.c +++ b/src/core/wee-util.c @@ -369,25 +369,41 @@ util_search_full_lib_name (const char *filename, const char *sys_directory) char * util_file_get_content (const char *filename) { - char *buffer; + char *buffer, *buffer2; FILE *f; size_t count, fp; - + buffer = NULL; fp = 0; - - f = fopen(filename, "r"); - if (f) { - while(!feof(f)) { - buffer = (char *) realloc(buffer, (fp + 1024*sizeof(char))); - count = fread(&buffer[fp], sizeof(char), 1024, f); + + f = fopen (filename, "r"); + if (f) + { + while (!feof (f)) + { + buffer2 = (char *) realloc (buffer, (fp + (1024 * sizeof (char)))); + if (!buffer2) + { + if (buffer) + free (buffer); + return NULL; + } + buffer = buffer2; + count = fread (&buffer[fp], sizeof(char), 1024, f); fp += count; } - buffer = (char *) realloc(buffer, fp + sizeof(char)); + buffer2 = (char *) realloc (buffer, fp + sizeof (char)); + if (!buffer2) + { + if (buffer) + free (buffer); + return NULL; + } + buffer = buffer2; buffer[fp] = '\0'; - fclose(f); + fclose (f); } - + return buffer; } diff --git a/src/gui/gui-bar-window.c b/src/gui/gui-bar-window.c index 8d8066e13..a87aec710 100644 --- a/src/gui/gui-bar-window.c +++ b/src/gui/gui-bar-window.c @@ -616,7 +616,7 @@ gui_bar_window_content_get_with_filling (struct t_gui_bar_window *bar_window, struct t_gui_window *window) { enum t_gui_bar_filling filling; - char *ptr_content, *content, str_reinit_color[32]; + char *ptr_content, *content, *content2, str_reinit_color[32]; char str_reinit_color_space[32], str_reinit_color_space_start_line[32]; char str_start_item[32]; char *item_value, *item_value2, ****split_items, **linear_items; @@ -694,7 +694,14 @@ gui_bar_window_content_get_with_filling (struct t_gui_bar_window *bar_window, content_length += ((filling == GUI_BAR_FILLING_HORIZONTAL) ? length_start_item : 0) + length_reinit_color_space + strlen ((item_value) ? item_value : ptr_content); - content = realloc (content, content_length); + content2 = realloc (content, content_length); + if (!content2) + { + if (content) + free (content); + return NULL; + } + content = content2; if (at_least_one_item && first_sub_item) { /* first sub item: insert space after last item */ @@ -722,9 +729,15 @@ gui_bar_window_content_get_with_filling (struct t_gui_bar_window *bar_window, if (filling == GUI_BAR_FILLING_HORIZONTAL) { content_length += length_start_item; - content = realloc (content, content_length); - if (content) - strcat (content, str_start_item); + content2 = realloc (content, content_length); + if (!content2) + { + if (content) + free (content); + return NULL; + } + content = content2; + strcat (content, str_start_item); } } } @@ -732,9 +745,15 @@ gui_bar_window_content_get_with_filling (struct t_gui_bar_window *bar_window, if (filling == GUI_BAR_FILLING_HORIZONTAL) { content_length += length_start_item; - content = realloc (content, content_length); - if (content) - strcat (content, str_start_item); + content2 = realloc (content, content_length); + if (!content2) + { + if (content) + free (content); + return NULL; + } + content = content2; + strcat (content, str_start_item); } break; case GUI_BAR_FILLING_COLUMNS_HORIZONTAL: /* items in columns, with horizontal filling */ @@ -822,49 +841,53 @@ gui_bar_window_content_get_with_filling (struct t_gui_bar_window *bar_window, content_length = 1 + (lines * ((columns * (max_length + max_length_screen + length_reinit_color_space)) + 1)); - content = realloc (content, content_length); - if (content) + content2 = realloc (content, content_length); + if (!content2) + { + if (content) + free (content); + return NULL; + } + content = content2; + content[0] = '\0'; + index_content = 0; + for (i = 0; i < lines; i++) { - content[0] = '\0'; - index_content = 0; - for (i = 0; i < lines; i++) + for (j = 0; j < columns; j++) { - for (j = 0; j < columns; j++) + if (filling == GUI_BAR_FILLING_COLUMNS_HORIZONTAL) + index = (i * columns) + j; + else + index = (j * lines) + i; + + if (index >= total_items) { - if (filling == GUI_BAR_FILLING_COLUMNS_HORIZONTAL) - index = (i * columns) + j; - else - index = (j * lines) + i; - - if (index >= total_items) - { - for (k = 0; k < max_length_screen; k++) - { - content[index_content++] = ' '; - } - } - else + for (k = 0; k < max_length_screen; k++) { - strcpy (content + index_content, linear_items[index]); - index_content += strlen (linear_items[index]); - length = max_length_screen - - gui_chat_strlen_screen (linear_items[index]); - for (k = 0; k < length; k++) - { - content[index_content++] = ' '; - } + content[index_content++] = ' '; } - if (j < columns - 1) + } + else + { + strcpy (content + index_content, linear_items[index]); + index_content += strlen (linear_items[index]); + length = max_length_screen - + gui_chat_strlen_screen (linear_items[index]); + for (k = 0; k < length; k++) { - strcpy (content + index_content, - str_reinit_color_space); - index_content += length_reinit_color_space; + content[index_content++] = ' '; } } - content[index_content++] = '\n'; + if (j < columns - 1) + { + strcpy (content + index_content, + str_reinit_color_space); + index_content += length_reinit_color_space; + } } - content[index_content] = '\0'; + content[index_content++] = '\n'; } + content[index_content] = '\0'; free (linear_items); } @@ -905,6 +928,8 @@ gui_bar_window_coords_add (struct t_gui_bar_window *bar_window, int index_item, int index_subitem, int index_line, int x, int y) { + struct t_gui_bar_window_coords **coords2; + if (!bar_window->coords) { bar_window->coords_count = 1; @@ -913,8 +938,19 @@ gui_bar_window_coords_add (struct t_gui_bar_window *bar_window, else { bar_window->coords_count++; - bar_window->coords = realloc (bar_window->coords, - bar_window->coords_count * sizeof (*(bar_window->coords))); + coords2 = realloc (bar_window->coords, + bar_window->coords_count * sizeof (*(bar_window->coords))); + if (!coords2) + { + if (bar_window->coords) + { + free (bar_window->coords); + bar_window->coords = NULL; + } + bar_window->coords_count = 0; + return; + } + bar_window->coords = coords2; } bar_window->coords[bar_window->coords_count - 1] = malloc (sizeof (*(bar_window->coords[bar_window->coords_count - 1]))); bar_window->coords[bar_window->coords_count - 1]->item = index_item; diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 19b05b653..925b3788f 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -607,7 +607,7 @@ gui_buffer_string_replace_local_var (struct t_gui_buffer *buffer, const char *string) { int length, length_var, index_string, index_result; - char *result, *local_var; + char *result, *result2, *local_var; const char *pos_end_name, *ptr_value; if (!string) @@ -646,12 +646,15 @@ gui_buffer_string_replace_local_var (struct t_gui_buffer *buffer, { length_var = strlen (ptr_value); length += length_var; - result = realloc (result, length); - if (!result) + result2 = realloc (result, length); + if (!result2) { + if (result) + free (result); free (local_var); return NULL; } + result = result2; strcpy (result + index_result, ptr_value); index_result += length_var; index_string += strlen (local_var) + 1; diff --git a/src/gui/gui-color.c b/src/gui/gui-color.c index 1dc72ec0f..1dcb4c8b8 100644 --- a/src/gui/gui-color.c +++ b/src/gui/gui-color.c @@ -576,7 +576,7 @@ char * gui_color_string_replace_colors (const char *string) { int length, length_color, index_string, index_result; - char *result, *color_name; + char *result, *result2, *color_name; const char *pos_end_name, *ptr_color; if (!string) @@ -611,12 +611,15 @@ gui_color_string_replace_colors (const char *string) { length_color = strlen (ptr_color); length += length_color; - result = realloc (result, length); - if (!result) + result2 = realloc (result, length); + if (!result2) { + if (result) + free (result); free (color_name); return NULL; } + result = result2; strcpy (result + index_result, ptr_color); index_result += length_color; index_string += pos_end_name - string - diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index e8cfb0a70..0eab02e4f 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -59,6 +59,7 @@ void gui_input_optimize_size (struct t_gui_buffer *buffer) { int optimal_size; + char *input_buffer2; if (buffer->input) { @@ -67,7 +68,17 @@ gui_input_optimize_size (struct t_gui_buffer *buffer) if (buffer->input_buffer_alloc != optimal_size) { buffer->input_buffer_alloc = optimal_size; - buffer->input_buffer = realloc (buffer->input_buffer, optimal_size); + input_buffer2 = realloc (buffer->input_buffer, optimal_size); + if (!input_buffer2) + { + if (buffer->input_buffer) + { + free (buffer->input_buffer); + buffer->input_buffer = NULL; + } + return; + } + buffer->input_buffer = input_buffer2; } } } diff --git a/src/gui/gui-key.c b/src/gui/gui-key.c index 89c79acab..f9920f9d7 100644 --- a/src/gui/gui-key.c +++ b/src/gui/gui-key.c @@ -1323,7 +1323,7 @@ gui_key_free_all (struct t_gui_key **keys, struct t_gui_key **last_key, void gui_key_buffer_optimize () { - int optimal_size; + int optimal_size, *gui_key_buffer2; optimal_size = (((gui_key_buffer_size * sizeof (int)) / GUI_KEY_BUFFER_BLOCK_SIZE) * @@ -1333,7 +1333,17 @@ gui_key_buffer_optimize () if (gui_key_buffer_alloc != optimal_size) { gui_key_buffer_alloc = optimal_size; - gui_key_buffer = realloc (gui_key_buffer, optimal_size); + gui_key_buffer2 = realloc (gui_key_buffer, optimal_size); + if (!gui_key_buffer2) + { + if (gui_key_buffer) + { + free (gui_key_buffer); + gui_key_buffer = NULL; + } + return; + } + gui_key_buffer = gui_key_buffer2; } } diff --git a/src/plugins/alias/alias.c b/src/plugins/alias/alias.c index e1172235a..969745d8d 100644 --- a/src/plugins/alias/alias.c +++ b/src/plugins/alias/alias.c @@ -97,7 +97,8 @@ void alias_string_add_word (char **alias, int *length, const char *word) { int length_word; - + char *alias2; + if (!word) return; @@ -112,7 +113,17 @@ alias_string_add_word (char **alias, int *length, const char *word) } else { - *alias = realloc (*alias, strlen (*alias) + length_word + 1); + alias2 = realloc (*alias, strlen (*alias) + length_word + 1); + if (!alias2) + { + if (*alias) + { + free (*alias); + *alias = NULL; + } + return; + } + *alias = alias2; strcat (*alias, word); } *length += length_word; diff --git a/src/plugins/irc/irc-mode.c b/src/plugins/irc/irc-mode.c index 16522d27d..009a4e5e5 100644 --- a/src/plugins/irc/irc-mode.c +++ b/src/plugins/irc/irc-mode.c @@ -176,7 +176,7 @@ irc_mode_channel_set (struct t_irc_server *server, void irc_mode_user_add (struct t_irc_server *server, char mode) { - char str_mode[2]; + char str_mode[2], *nick_modes2; str_mode[0] = mode; str_mode[1] = '\0'; @@ -185,8 +185,18 @@ irc_mode_user_add (struct t_irc_server *server, char mode) { if (!strchr (server->nick_modes, mode)) { - server->nick_modes = realloc (server->nick_modes, - strlen (server->nick_modes) + 1 + 1); + nick_modes2 = realloc (server->nick_modes, + strlen (server->nick_modes) + 1 + 1); + if (!nick_modes2) + { + if (server->nick_modes) + { + free (server->nick_modes); + server->nick_modes = NULL; + } + return; + } + server->nick_modes = nick_modes2; strcat (server->nick_modes, str_mode); weechat_bar_item_update ("input_prompt"); } @@ -206,7 +216,7 @@ irc_mode_user_add (struct t_irc_server *server, char mode) void irc_mode_user_remove (struct t_irc_server *server, char mode) { - char *pos; + char *pos, *nick_modes2; int new_size; if (server->nick_modes) @@ -216,7 +226,9 @@ irc_mode_user_remove (struct t_irc_server *server, char mode) { new_size = strlen (server->nick_modes); memmove (pos, pos + 1, strlen (pos + 1) + 1); - server->nick_modes = realloc (server->nick_modes, new_size); + nick_modes2 = realloc (server->nick_modes, new_size); + if (nick_modes2) + server->nick_modes = nick_modes2; weechat_bar_item_update ("input_prompt"); } } diff --git a/src/plugins/irc/irc-notify.c b/src/plugins/irc/irc-notify.c index 29849f580..a1d1ceb27 100644 --- a/src/plugins/irc/irc-notify.c +++ b/src/plugins/irc/irc-notify.c @@ -118,7 +118,7 @@ irc_notify_search (struct t_irc_server *server, const char *nick) void irc_notify_set_server_option (struct t_irc_server *server) { - char *str; + char *str, *str2; struct t_irc_notify *ptr_notify; int total_length, length; @@ -143,7 +143,14 @@ irc_notify_set_server_option (struct t_irc_server *server) else { total_length += length; - str = realloc (str, total_length); + str2 = realloc (str, total_length); + if (!str2) + { + if (str) + free (str); + return; + } + str = str2; } if (str) { @@ -754,7 +761,8 @@ irc_notify_timer_ison_cb (void *data, int remaining_calls) message2 = realloc (message, total_length); if (!message2) { - free (message); + if (message) + free (message); message = NULL; break; } diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 17dbd7b77..0d9dace75 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -1908,7 +1908,7 @@ IRC_PROTOCOL_CALLBACK(001) IRC_PROTOCOL_CALLBACK(005) { - char *pos, *pos2, *pos_start, *error; + char *pos, *pos2, *pos_start, *error, *isupport2; int length_isupport, length, nick_max_length; /* @@ -1961,11 +1961,14 @@ IRC_PROTOCOL_CALLBACK(005) if (server->isupport) { length_isupport = strlen (server->isupport); - server->isupport = realloc (server->isupport, - length_isupport + /* existing */ - 1 + length + 1); /* new */ - if (server->isupport) + isupport2 = realloc (server->isupport, + length_isupport + /* existing */ + 1 + length + 1); /* new */ + if (isupport2) + { + server->isupport = isupport2; pos_start = server->isupport + length_isupport; + } } else { diff --git a/src/plugins/irc/irc-redirect.c b/src/plugins/irc/irc-redirect.c index 9ebd3aabd..bb1ecf2aa 100644 --- a/src/plugins/irc/irc-redirect.c +++ b/src/plugins/irc/irc-redirect.c @@ -647,6 +647,8 @@ void irc_redirect_message_add (struct t_irc_redirect *redirect, const char *message, const char *command) { + char *output2; + /* * if command is not for output, then don't add message * (it is silently ignored) @@ -659,9 +661,16 @@ irc_redirect_message_add (struct t_irc_redirect *redirect, const char *message, if (redirect->output) { redirect->output_size += strlen("\n") + strlen (message); - redirect->output = realloc (redirect->output, redirect->output_size); - if (redirect->output) - strcat (redirect->output, "\n"); + output2 = realloc (redirect->output, redirect->output_size); + if (!output2) + { + free (redirect->output); + redirect->output = NULL; + redirect->output_size = 0; + return; + } + redirect->output = output2; + strcat (redirect->output, "\n"); } else { diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index 85a45f9ad..9bab689e4 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -1888,23 +1888,28 @@ irc_server_msgq_add_msg (struct t_irc_server *server, const char *msg) void irc_server_msgq_add_unterminated (struct t_irc_server *server, const char *string) { + char *unterminated_message2; + if (!string[0]) return; if (server->unterminated_message) { - server->unterminated_message = + unterminated_message2 = realloc (server->unterminated_message, (strlen (server->unterminated_message) + strlen (string) + 1)); - if (!server->unterminated_message) + if (!unterminated_message2) { weechat_printf (server->buffer, _("%s%s: not enough memory for received message"), weechat_prefix ("error"), IRC_PLUGIN_NAME); + free (server->unterminated_message); + server->unterminated_message = NULL; + return; } - else - strcat (server->unterminated_message, string); + server->unterminated_message = unterminated_message2; + strcat (server->unterminated_message, string); } else { diff --git a/src/plugins/relay/relay-client-irc.c b/src/plugins/relay/relay-client-irc.c index 2c7eda9b1..a48e298be 100644 --- a/src/plugins/relay/relay-client-irc.c +++ b/src/plugins/relay/relay-client-irc.c @@ -469,7 +469,7 @@ void relay_client_irc_send_join (struct t_relay_client *client, const char *channel) { - char *infolist_name, *nicks; + char *infolist_name, *nicks, *nicks2; const char *nick, *prefix, *topic; char *host; int length, length_nicks; @@ -540,7 +540,14 @@ relay_client_irc_send_join (struct t_relay_client *client, length_nicks += strlen (nick) + 1 + 1; if (nicks) { - nicks = realloc (nicks, length_nicks); + nicks2 = realloc (nicks, length_nicks); + if (!nicks2) + { + if (nicks) + free (nicks); + return; + } + nicks = nicks2; strcat (nicks, " "); } else diff --git a/src/plugins/rmodifier/rmodifier.c b/src/plugins/rmodifier/rmodifier.c index 7451b058f..f79db52bd 100644 --- a/src/plugins/rmodifier/rmodifier.c +++ b/src/plugins/rmodifier/rmodifier.c @@ -130,7 +130,7 @@ char * rmodifier_replace_groups (const char *string, regmatch_t regex_match[], const char *groups) { - char *result, *str_group, *string_to_add; + char *result, *result2, *str_group, *string_to_add; const char *ptr_groups; int length, num_group; @@ -161,9 +161,14 @@ rmodifier_replace_groups (const char *string, regmatch_t regex_match[], if (string_to_add) { length += strlen (string_to_add); - result = realloc (result, length); - if (!result) + result2 = realloc (result, length); + if (!result2) + { + if (result) + free (result); return NULL; + } + result = result2; strcat (result, string_to_add); free (string_to_add); } diff --git a/src/plugins/scripts/script.c b/src/plugins/scripts/script.c index 4e1b746d6..b87c4bad7 100644 --- a/src/plugins/scripts/script.c +++ b/src/plugins/scripts/script.c @@ -817,7 +817,8 @@ void script_action_add (char **action_list, const char *name) { int length; - + char *action_list2; + length = strlen (name); if (!(*action_list)) @@ -828,13 +829,17 @@ script_action_add (char **action_list, const char *name) } else { - *action_list = realloc (*action_list, + action_list2 = realloc (*action_list, strlen (*action_list) + 1 + length + 1); - if (*action_list) + if (!action_list2) { - strcat (*action_list, ","); - strcat (*action_list, name); + free (*action_list); + *action_list = NULL; + return; } + *action_list = action_list2; + strcat (*action_list, ","); + strcat (*action_list, name); } } |