[6230] in bugtraq
Re: strcpy versus strncpy
daemon@ATHENA.MIT.EDU (Chris L. Mason)
Wed Mar 4 19:01:52 1998
Date: Tue, 3 Mar 1998 23:38:18 -0500
Reply-To: "Chris L. Mason" <cmason@WYREX.COM>
From: "Chris L. Mason" <cmason@WYREX.COM>
To: BUGTRAQ@NETSPACE.ORG
In-Reply-To: <Pine.GSO.3.95.980304025706.20503L-100000@legolas.mdh.se>; from
Emil Isberg on Wed, Mar 04, 1998 at 03:02:03AM +0100
>
> It is kalled SIGSEGV ...
> Because strlen is simply an
> size_t i; char *string;
> for(i=0;*(string+i)!='\0';i++);
> return i;
>
> And when (string+1) points outside the space allocated .. well .. possible
> it doesn't find a '\0' there .. possible it don't even can read it ..
>
> And thats why you can't do that.
Good point. Here's a revised version (also incorporating other suggestions
made)
size_t sstrlen(const char *s, size_t n) {
size_t i;
for(i = 0; (*(s+i) != '\0' && i < n); i++);
return i;
}
char *sstrncpy(char *dst, size_t n1, const char *src, size_t n2) {
if (sstrlen(src, n2) > (n1 - 1)) {
errno = ENOSPC;
dst[0] = NULL;
return NULL;
}
strncpy(dst, src, n2);
return dst;
}
Something similar could be done with strncat as well. Note that I
don't return the number of bytes written because I wanted to remain
consistent with the existing strncpy.
Chris