[CODE] My fix to helpfile loading

From: Andrey Fidrya (andrey@ALEX-UA.COM)
Date: 12/07/97


Some time ago someone reported a bug in stock CircleMUD bpl 12 with loading of
help files. The problem is memory overrun if you have more than 2 aliases
per help entry in average, which results in a crash.
I recently bumped into this bug and fixed it this way:

Previously Circle counted number of "#" in a help file and allocated space
for (number of "#") * 2 aliases. I changed it slightly and now it will count
number of aliases in help file and allocate as much space, as needed.
So - no more possible memory overruns and crashes and all allocated memory is
used. I tested this code with my help files and it seems to work ok.

Here is the code:

-----------------------------------------------------------------------------
In DB.C
Before index_boot function, insert this function:
-----------------------------------------------------------------------------
/* function to count how many aliases exist in a help file */
int count_alias_records(FILE *fl)
{
  char key[READ_SIZE+1], next_key[READ_SIZE+1];
  char line[READ_SIZE+1], *scan;
  int total_keywords = 0;

  /* get the first keyword line */
  get_one_line(fl, key);
  while (*key != '$') {
    /* skip the text */
    get_one_line(fl, line);
    while (*line != '#')
      get_one_line(fl, line);

    /* now count keywords */
    scan = one_word(key, next_key);
    ++total_keywords;
    while (*next_key) {
      scan = one_word(scan, next_key);
      ++total_keywords;
    }

    /* get next keyword line (or $) */
    get_one_line(fl, key);
  }

  return total_keywords;
}
-----------------------------------------------------------------------------
Btw, since function above uses get_one_line() before it was declared, you
should prototype it at the beginning of db.c.

Around line 508, look for:
-----------------------------------------------------------------------------
      if (mode == DB_BOOT_ZON)
        rec_count++;
      else
        rec_count += count_hash_records(db_file);
    }
-----------------------------------------------------------------------------
and change it to:
-----------------------------------------------------------------------------
      if (mode == DB_BOOT_ZON)
        rec_count++;
      else if (mode == DB_BOOT_HLP)
        rec_count += count_alias_records(db_file);
      else
        rec_count += count_hash_records(db_file);
    }
-----------------------------------------------------------------------------
Arount line 540 look for:
-----------------------------------------------------------------------------
  case DB_BOOT_HLP:
    CREATE(help_table, struct help_index_element, rec_count * 2);
    break;
-----------------------------------------------------------------------------
and change it to:
-----------------------------------------------------------------------------
  case DB_BOOT_HLP:
    CREATE(help_table, struct help_index_element, rec_count);
    break;
-----------------------------------------------------------------------------
Now everything should work fine.

  Andrey (andrey@alex-ua.com)
    aka Zmey//RMUD


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST