]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man3/strcpy.3
des_crypt.3: Minor wording fix in VERSIONS
[thirdparty/man-pages.git] / man3 / strcpy.3
index 3f0b45f4b695d71b3a718b3f09a35b1780968135..7da5b9796958c56cf1969540c819e39c1a1f9ba4 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
 .\" 2007-06-15, Marc Boyer <marc.boyer@enseeiht.fr> + mtk
 .\"     Improve discussion of strncpy().
 .\"
-.TH STRCPY 3  2007-06-15 "GNU" "Linux Programmer's Manual"
+.TH STRCPY 3  2019-03-06 "GNU" "Linux Programmer's Manual"
 .SH NAME
 strcpy, strncpy \- copy a string
 .SH SYNOPSIS
 .nf
 .B #include <string.h>
-.sp
+.PP
 .BI "char *strcpy(char *" dest ", const char *" src );
-.sp
+.PP
 .BI "char *strncpy(char *" dest ", const char *" src ", size_t " n );
 .fi
 .SH DESCRIPTION
 The
 .BR strcpy ()
-function copies the string pointed to by \fIsrc\fP,
-including the terminating null byte ('\\0'),
-to the buffer pointed to by \fIdest\fP.
+function copies the string pointed to by
+.IR src ,
+including the terminating null byte (\(aq\e0\(aq),
+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 ()
 might be:
-.in +0.25i
-.nf
-
-char*
-strncpy(char *dest, const char *src, size_t n){
+.PP
+.in +4n
+.EX
+char *
+strncpy(char *dest, const char *src, size_t n)
+{
     size_t i;
 
-    for (i = 0 ; i < n && src[i] != '\\0' ; i++)
+    for (i = 0; i < n && src[i] != \(aq\e0\(aq; i++)
         dest[i] = src[i];
-    for ( ; i < n ; i++)
-        dest[i] = '\\0';
+    for ( ; i < n; i++)
+        dest[i] = \(aq\e0\(aq;
 
     return dest;
 }
-.fi
+.EE
 .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"
-SVr4, 4.3BSD, C89, C99.
+the destination string
+.IR dest .
+.SH ATTRIBUTES
+For an explanation of the terms used in this section, see
+.BR attributes (7).
+.TS
+allbox;
+lbw19 lb lb
+l l l.
+Interface      Attribute       Value
+T{
+.BR strcpy (),
+.BR strncpy ()
+T}     Thread safety   MT-Safe
+.TE
+.SH CONFORMING TO
+POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
 .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,
+.PP
+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:
-.in +0.25i
-.nf
-
-strncpy(buf, str, n);
-if (n > 0) 
-    buf[n - 1]= '\\0';
-.fi
+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 destination 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).
+.PP
+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:
+.PP
+.in +4n
+.EX
+if (buflen > 0) {
+    strncpy(buf, str, buflen \- 1);
+    buf[buflen \- 1]= \(aq\e0\(aq;
+}
+.EE
 .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:
+.PP
+    size_t strlcpy(char *dest, const char *src, size_t size);
+.PP
+.\" 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 destination 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 ()
-is not large enough
-(that is, if the programmer was stupid or lazy, and failed to check
-the size before copying) then anything might happen.
-Overflowing fixed length strings is a favorite cracker technique.
-.SH "SEE ALSO"
+is not large enough, then anything might happen.
+Overflowing fixed-length string buffers is a favorite cracker technique
+for taking complete control of the machine.
+Any time a program reads or copies data into a buffer,
+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
 .BR bcopy (3),
 .BR memccpy (3),
 .BR memcpy (3),
 .BR memmove (3),
+.BR stpcpy (3),
+.BR stpncpy (3),
+.BR strdup (3),
+.BR string (3),
 .BR wcscpy (3),
 .BR wcsncpy (3)