On Mon, Sep 8, 2008 at 9:31 AM, Allison Randal via RT
<[EMAIL PROTECTED]> wrote:
> Agreed that this particular ticket is not useful. Resolve it and replace
> it with a [CAGE] ticket with explicit instructions on converting all
> existing 'sprintf', 'strcat', etc calls with calls to 'snprintf',
> 'strlcat', etc. (Also include a list of all calls that should be converted.)

I disagree on the "all" part. strlcat and strlcpy are not always the
best repalcement. When the C string length is known memcpy is a
simpler and faster solution.

For example in config/gen/platform/generic/env.c we have:

    int name_len = strlen(name);
    int val_len = strlen(value);

    char *envs = malloc(name_len + 1 + val_len + 1);
    if (envs == NULL)
        return;

    /* Save a bit of time, by using the fact we already have the
       lengths, avoiding strcat */
    strcpy(envs, name);
    strcpy(envs + name_len, "=");
    strcpy(envs + name_len + 1, value);

The memcpy way can be:

   memcpy(envs, name, name_len);
   envs[name_len] = '=';
   memcpy(envs + name_len + 1, value, val_len + 1);

This code can be encapsulated on a function or a macro, and add inside
it checks for non-nullness and lengths in debug builds.

Regarding snprintf, according linux man page is in the C99, BSD and
XOPEN standards, not on older ansi C, and I think we don't have that
as a requirement for the C compiler usable to build parrot. And a
replacement for this is not so easy to write and test as the others.

-- 
Salu2

Reply via email to