Re: [code] showing all players in pfile

From: Thomas Arp (t_arp@stofanet.dk)
Date: 08/13/02


From: "Peter d" <death_comes_to_all@HOTMAIL.COM>
> ACMD(do_players)
> {
>   char buf[MAX_INPUT_LENGTH];
>   int i, count = 0;
>   *buf = 0;
>
>   for (i = 0; i < top_of_p_table; i++) {
>     sprintf(buf, "%s  %-20.20s", buf, (player_table + i)->name);
>     count++;
>     if (count == 3) {
>       count = 0;
>       strcat(buf, "\r\n");
>     }
>   }
>   page_string(ch->desc, buf, 1);
> }
>
> i am using bpl21..
>
This code has som problems, mainly regarding buffer overruns and
overlapping strings in sprintf()[1]. Try this (mailer code):

ACMD(do_players)
{
  char buf[MAX_INPUT_LENGTH];
  int i, count = 0, len = 0;
  *buf = 0;

  for (i = 0; i < top_of_p_table; i++)
    len += snprintf(buf + len, sizeof(buf) - len,
           "  %-20.20s%s", player_table[i].name,
           (count++ % 3) ? "":"\r\n" );
  strncat(buf, "\r\n", sizeof(buf)-len-1);

  page_string(ch->desc, buf, 1);
}

Welcor

[1] The practice of using
    sprintf(buf, "%s foo", buf);
    is dangerous, since, according to the glibc library definitions,
    the behaviour of overlapping strings is undefined:

http://www.fsf.org/manual/glibc-2.2.5/html_node/Formatted-Output-Functions.h
tml
"int sprintf (char *s, const char *template, ...)
 [...]
 The behavior of this function is undefined if copying takes place
 between objects that overlap--for example, if s is also given as
 an argument to be printed under control of the %s conversion."

    Undefined behaviour is bad, since this means different compilers
    will behave differently with the results. In this case, they won't
    work with your compiler, but may with others.

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   | Newbie List:  http://groups.yahoo.com/group/circle-newbies/   |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 06/25/03 PDT