Joerg Schilling wrote:
>         while (*bp) { 
>                 if (*bp++ == ':') { 
>                         if (*bp == ':' || *bp == ' ' || *bp == '\t') { 
>                                 p = bp; 
>                                 while (*p) 
>                                         if (*p++ == ':') 
>                                                 break; 
>                                 strcpy(bp--, p); 
>                         } 
>                 } 
>         } 
> } 
> 
> BTW: I would guess it only happens when the overlap is less than 8 chars
> and I believe that new behavior may be a result of the upgraded compiler
> Sun uses.

Yikes.  That helped locate it.  It happens with a particular buffer
alignment.  Here's a condensed example:

#include <stdio.h>
#include <string.h>

void
main(void)
{
        char buf[32];

        strcpy(buf, "0123456abcdefghijklmnopqrstuvwxyz");

        puts(buf);
        strcpy(buf+6,buf+7);
        puts(buf);
}

A 32-bit executable produces:

0123456abcdefghijklmnopqrstuvwxyz
012345abcdefghijklmnopqrstuvwxyz

A 64-bit executable does:

0123456abcdefghijklmnopqrstuvwxyz
012345abcdefghijlmnoppqrstuvwxyz

Note the doubled 'p' and missing 'k'.  It looks like bytes 16-20 got
shifted left somehow.

I think that might be nasty enough to warrant backing down from 129 ...

-- 
James Carlson         42.703N 71.076W         <carls...@workingcode.com>
_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to