OSDN Git Service

LDP: Update original to LDP v3.79
[linuxjm/LDP_man-pages.git] / original / man3 / strcpy.3
index ce72ad8..92e0ce2 100644 (file)
@@ -1,5 +1,6 @@
 .\" Copyright (C) 1993 David Metcalfe (david@prism.demon.co.uk)
 .\"
+.\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
 .\" manual provided the copyright notice and this permission notice are
 .\" preserved on all copies.
@@ -19,6 +20,7 @@
 .\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
 .\"
 .\" References consulted:
 .\"     Linux libc source code
@@ -30,7 +32,7 @@
 .\" 2007-06-15, Marc Boyer <marc.boyer@enseeiht.fr> + mtk
 .\"     Improve discussion of strncpy().
 .\"
-.TH STRCPY 3  2010-09-20 "GNU" "Linux Programmer's Manual"
+.TH STRCPY 3  2014-05-21 "GNU" "Linux Programmer's Manual"
 .SH NAME
 strcpy, strncpy \- copy a string
 .SH SYNOPSIS
@@ -44,29 +46,44 @@ strcpy, strncpy \- copy a string
 .SH DESCRIPTION
 The
 .BR strcpy ()
-function copies the string pointed to by \fIsrc\fP,
+function copies the string pointed to by
+.IR src ,
 including the terminating null byte (\(aq\\0\(aq),
-to the buffer pointed to by \fIdest\fP.
+to the buffer pointed to by
+.IR dest .
 The strings may not overlap, and the destination string
-\fIdest\fP must be large enough to receive the copy.
+.I dest
+must be large enough to receive the copy.
+.IR "Beware of buffer overruns!"
+(See BUGS.)
 .PP
 The
 .BR strncpy ()
 function is similar, except that at most
-\fIn\fP bytes of \fIsrc\fP are copied.
+.I n
+bytes of
+.I src
+are copied.
 .BR Warning :
 If there is no null byte
-among the first \fIn\fP bytes of \fIsrc\fP,
-the string placed in \fIdest\fP will not be null-terminated.
+among the first
+.I n
+bytes of
+.IR src ,
+the string placed in
+.I dest
+will not be null-terminated.
 .PP
 If the length of
 .I src
 is less than
 .IR n ,
 .BR strncpy ()
-pads the remainder of
+writes additional null bytes to
 .I dest
-with null bytes.
+to ensure that a total of
+.I n
+bytes are written.
 .PP
 A simple implementation of
 .BR strncpy ()
@@ -88,39 +105,113 @@ strncpy(char *dest, const char *src, size_t n)
 }
 .fi
 .in
-.SH "RETURN VALUE"
+.SH RETURN VALUE
 The
 .BR strcpy ()
 and
 .BR strncpy ()
 functions return a pointer to
-the destination string \fIdest\fP.
-.SH "CONFORMING TO"
+the destination string
+.IR dest .
+.SH ATTRIBUTES
+.SS Multithreading (see pthreads(7))
+The
+.BR strcpy ()
+and
+.BR strncpy ()
+functions are thread-safe.
+.SH CONFORMING TO
 SVr4, 4.3BSD, C89, C99.
 .SH NOTES
 Some programmers consider
 .BR strncpy ()
 to be inefficient and error prone.
 If the programmer knows (i.e., includes code to test!)
-that the size of \fIdest\fP is greater than
-the length of \fIsrc\fP, then
+that the size of
+.I dest
+is greater than
+the length of
+.IR src ,
+then
 .BR strcpy ()
 can be used.
 
-If there is no terminating null byte in the first \fIn\fP
-characters of \fIsrc\fP,
+One valid (and intended) use of
 .BR strncpy ()
-produces an unterminated string in \fIdest\fP.
-Programmers often prevent this mistake by forcing termination
-as follows:
+is to copy a C string to a fixed-length buffer
+while ensuring both that the buffer is not overflowed
+and that unused bytes in the target buffer are zeroed out
+(perhaps to prevent information leaks if the buffer is to be
+written to media or transmitted to another process via an
+interprocess communication technique).
+
+If there is no terminating null byte in the first
+.I n
+bytes of
+.IR src ,
+.BR strncpy ()
+produces an unterminated string in
+.IR dest .
+If
+.I buf
+has length
+.IR buflen ,
+you can force termination using something like the following:
 .in +4n
 .nf
 
-strncpy(buf, str, n);
-if (n > 0)
-    buf[n \- 1]= \(aq\\0\(aq;
+strncpy(buf, str, buflen \- 1);
+if (buflen > 0)
+    buf[buflen \- 1]= \(aq\\0\(aq;
 .fi
 .in
+.PP
+(Of course, the above technique ignores the fact that, if
+.I src
+contains more than
+.I "buflen\ \-\ 1"
+bytes, information is lost in the copying to
+.IR dest .)
+.\"
+.SS strlcpy()
+Some systems (the BSDs, Solaris, and others) provide the following function:
+
+    size_t strlcpy(char *dest, const char *src, size_t size);
+
+.\" http://static.usenix.org/event/usenix99/full_papers/millert/millert_html/index.html
+.\"     "strlcpy and strlcat - consistent, safe, string copy and concatenation"
+.\"     1999 USENIX Annual Technical Conference
+This function is similar to
+.BR strncpy (),
+but it copies at most
+.I size\-1
+bytes to
+.IR dest ,
+always adds a terminating null byte,
+and does not pad the target with (further) null bytes.
+This function fixes some of the problems of
+.BR strcpy ()
+and
+.BR strncpy (),
+but the caller must still handle the possibility of data loss if
+.I size
+is too small.
+The return value of the function is the length of
+.IR src ,
+which allows truncation to be easily detected:
+if the return value is greater than or equal to
+.IR size ,
+truncation occurred.
+If loss of data matters, the caller
+.I must
+either check the arguments before the call,
+or test the function return value.
+.BR strlcpy ()
+is not present in glibc and is not standardized by POSIX,
+.\" https://lwn.net/Articles/506530/
+but is available on Linux via the
+.IR libbsd
+library.
 .SH BUGS
 If the destination string of a
 .BR strcpy ()
@@ -132,7 +223,7 @@ the program first needs to check that there's enough space.
 This may be unnecessary if you can show that overflow is impossible,
 but be careful: programs can get changed over time,
 in ways that may make the impossible possible.
-.SH "SEE ALSO"
+.SH SEE ALSO
 .BR bcopy (3),
 .BR memccpy (3),
 .BR memcpy (3),
@@ -143,3 +234,12 @@ in ways that may make the impossible possible.
 .BR string (3),
 .BR wcscpy (3),
 .BR wcsncpy (3)
+.SH COLOPHON
+This page is part of release 3.79 of the Linux
+.I man-pages
+project.
+A description of the project,
+information about reporting bugs,
+and the latest version of this page,
+can be found at
+\%http://www.kernel.org/doc/man\-pages/.