This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
unnecessary use of stpncpy
- To: libc-alpha at sources dot redhat dot com
- Subject: unnecessary use of stpncpy
- From: Bruno Haible <haible at ilog dot fr>
- Date: Mon, 28 Aug 2000 11:54:02 +0200 (CEST)
stpncpy has the same bad behaviour as strncpy: It clears the rest of the
buffer past the result, regardless how large. Since it is common to pass
large buffers to the functions strxfrm(), wcsxfrm(), getdomainname(),
strerror(), and the result normally is much smaller than the buffer, here
is an optimization: don't clear the rest of the buffer.
2000-08-27 Bruno Haible <haible@clisp.cons.org>
* string/strxfrm.c (strxfrm, wcsxfrm): Include <sys/param.h>.
If nrules == 0 and srclen < n, copy only srclen + 1 characters.
* sysdeps/generic/getdomain.c (getdomainname): Include <sys/param.h>.
If the result is fits in the buffer, copy only as many bytes as needed.
* sysdeps/generic/_strerror.c (__strerror_r): Don't zero-fill the
buffer after copying numbuf into it.
* sysdeps/mach/_strerror.c (__strerror_r): Likewise.
*** glibc-20000826/string/strxfrm.c.bak Tue Aug 1 13:53:18 2000
--- glibc-20000826/string/strxfrm.c Sat Aug 26 18:46:44 2000
***************
*** 22,27 ****
--- 22,28 ----
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+ #include <sys/param.h>
#ifndef STRING_TYPE
# define STRING_TYPE char
***************
*** 124,130 ****
if (nrules == 0)
{
if (n != 0)
! STPNCPY (dest, src, n);
return srclen;
}
--- 125,131 ----
if (nrules == 0)
{
if (n != 0)
! STPNCPY (dest, src, MIN (srclen + 1, n));
return srclen;
}
*** glibc-20000826/sysdeps/generic/getdomain.c.bak Tue Sep 7 17:10:12 1999
--- glibc-20000826/sysdeps/generic/getdomain.c Sat Aug 26 18:46:44 2000
***************
*** 1,4 ****
! /* Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
--- 1,4 ----
! /* Copyright (C) 1994, 1995, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
***************
*** 22,27 ****
--- 22,28 ----
#include <errno.h>
#include <unistd.h>
+ #include <sys/param.h>
#include <sys/utsname.h>
#include <string.h>
***************
*** 34,44 ****
size_t len;
{
struct utsname u;
if (uname (&u) < 0)
return -1;
! strncpy (name, u.domainname, len);
return 0;
}
--- 35,47 ----
size_t len;
{
struct utsname u;
+ size_t u_len;
if (uname (&u) < 0)
return -1;
! u_len = strlen (u.domainname);
! memcpy (name, u.domainname, MIN (u_len + 1, len));
return 0;
}
*** glibc-20000826/sysdeps/generic/_strerror.c.bak Tue Sep 7 17:09:42 1999
--- glibc-20000826/sysdeps/generic/_strerror.c Sat Aug 26 18:46:44 2000
***************
*** 1,4 ****
! /* Copyright (C) 1991, 93, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
--- 1,4 ----
! /* Copyright (C) 1991, 93, 95, 96, 97, 98, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
***************
*** 56,62 ****
buffer size. */
q = __mempcpy (buf, unk, MIN (unklen, buflen));
if (unklen < buflen)
! __stpncpy (q, p, buflen - unklen);
/* Terminate the string in any case. */
if (buflen > 0)
--- 56,62 ----
buffer size. */
q = __mempcpy (buf, unk, MIN (unklen, buflen));
if (unklen < buflen)
! memcpy (q, p, MIN (&numbuf[21] - p, buflen - unklen));
/* Terminate the string in any case. */
if (buflen > 0)
*** glibc-20000826/sysdeps/mach/_strerror.c.bak Tue Sep 7 17:19:19 1999
--- glibc-20000826/sysdeps/mach/_strerror.c Sat Aug 26 18:46:44 2000
***************
*** 1,4 ****
! /* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
--- 1,5 ----
! /* Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000
! Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
***************
*** 65,71 ****
buffer size. */
q = __mempcpy (buf, unk, MIN (unklen, buflen));
if (unklen < buflen)
! __stpncpy (q, p, buflen - unklen);
/* Terminate the string in any case. */
if (buflen > 0)
--- 66,72 ----
buffer size. */
q = __mempcpy (buf, unk, MIN (unklen, buflen));
if (unklen < buflen)
! memcpy (q, p, MIN (&numbuf[21] - p, buflen - unklen));
/* Terminate the string in any case. */
if (buflen > 0)
***************
*** 103,109 ****
{
*q++ = ' ';
if (unklen + len + 1 < buflen)
! __stpncpy (q, p, buflen - unklen - len - 1);
}
}
--- 104,111 ----
{
*q++ = ' ';
if (unklen + len + 1 < buflen)
! memcpy (q, p,
! MIN (&numbuf[21] - p, buflen - unklen - len - 1));
}
}