From 09c34c045f61e202235a285366a5a2358c0631ac Mon Sep 17 00:00:00 2001 From: Kevin Easton Date: Sun, 17 Apr 2011 11:58:16 +0000 Subject: [PATCH] Further cleanups and fixes in chelp.c:read_file(). Now properly adds NULLs to terminate the lists, that the code in get_help_topic() expects to be there - fixes a potential crash in /bhelp. git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@123 13b04d17-f746-0410-82c6-800466cd88b0 --- Changelog | 2 ++ source/chelp.c | 59 ++++++++++++++++++++------------------------------ 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/Changelog b/Changelog index be1d27f..48bfc74 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,7 @@ [Changes 1.2c01] +* Cleanup the /BHELP code, fixing a potential crash. (caf) + * [1.1s01] Sanity check color codes, fixes a potential crash. (caf) * Add /FSET USERMODE_OTHER to correctly format user mode changes where the diff --git a/source/chelp.c b/source/chelp.c index 3b46ef5..d2a1e00 100644 --- a/source/chelp.c +++ b/source/chelp.c @@ -154,10 +154,9 @@ static int first_time = 1; int read_file(FILE *help_file, int helpfunc) { char line[BIG_BUFFER_SIZE + 1]; - char *topic = NULL; - char *subject = NULL; int item_number = 0; - int topics = 0; + int topic = -1; + Chelp **index = new_malloc(sizeof index[0]); while (fgets(line, sizeof line, help_file)) { @@ -170,51 +169,41 @@ int read_file(FILE *help_file, int helpfunc) if (*line != ' ') /* we got a topic copy to topic */ { - topics++; - item_number = 0; if (!my_strnicmp(line, "-RELATED", 7)) { - if (topic) + if (topic > -1) { - if (helpfunc) - script_help[topics-1]->relates = m_strdup(line+8); - else - help_index[topics-1]->relates = m_strdup(line+8); + index[topic]->relates = m_strdup(line+8); } } else { - new_free(&topic); new_free(&subject); - malloc_strcpy(&topic, line); - if (helpfunc) - { - RESIZE(script_help, Chelp, topics+1); - script_help[topics-1] = new_malloc(sizeof(Chelp)); - script_help[topics-1]->title = m_strdup(line); - } - else - { - RESIZE(help_index, Chelp, topics+1); - help_index[topics-1] = new_malloc(sizeof(Chelp)); - help_index[topics-1]->title = m_strdup(line); - } + topic++; + item_number = 0; + RESIZE(index, Chelp *, topic + 2); + + index[topic] = new_malloc(sizeof(Chelp)); + index[topic]->title = m_strdup(line); + index[topic]->contents = new_malloc(sizeof(char *)); + index[topic]->contents[0] = NULL; + index[topic]->relates = NULL; } } - else if (topic && *topic) + else if (topic > -1) { /* we found the subject material */ - if (helpfunc) - { - RESIZE(script_help[topics-1]->contents, char **, ++item_number); - script_help[topics-1]->contents[item_number-1] = m_strdup(line); - } - else - { - RESIZE(help_index[topics-1]->contents, char **, ++item_number); - help_index[topics-1]->contents[item_number-1] = m_strdup(line); - } + item_number++; + RESIZE(index[topic]->contents, char *, item_number + 1); + + index[topic]->contents[item_number-1] = m_strdup(line); + index[topic]->contents[item_number] = NULL; } } + if (helpfunc) + script_help = index; + else + help_index = index; + return 0; } #endif