]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man3/strcpy.3
fuse.4: fuse_entry_out: rework discussion of uniqueness of nodeid + generation
[thirdparty/man-pages.git] / man3 / strcpy.3
CommitLineData
fea681da
MK
1.\" Copyright (C) 1993 David Metcalfe (david@prism.demon.co.uk)
2.\"
93015253 3.\" %%%LICENSE_START(VERBATIM)
fea681da
MK
4.\" Permission is granted to make and distribute verbatim copies of this
5.\" manual provided the copyright notice and this permission notice are
6.\" preserved on all copies.
7.\"
8.\" Permission is granted to copy and distribute modified versions of this
9.\" manual under the conditions for verbatim copying, provided that the
10.\" entire resulting derived work is distributed under the terms of a
11.\" permission notice identical to this one.
c13182ef 12.\"
fea681da
MK
13.\" Since the Linux kernel and libraries are constantly changing, this
14.\" manual page may be incorrect or out-of-date. The author(s) assume no
15.\" responsibility for errors or omissions, or for damages resulting from
16.\" the use of the information contained herein. The author(s) may not
17.\" have taken the same level of care in the production of this manual,
18.\" which is licensed free of charge, as they might when working
19.\" professionally.
c13182ef 20.\"
fea681da
MK
21.\" Formatted or processed versions of this manual, if unaccompanied by
22.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 23.\" %%%LICENSE_END
fea681da
MK
24.\"
25.\" References consulted:
26.\" Linux libc source code
27.\" Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991)
28.\" 386BSD man pages
29.\" Modified Sat Jul 24 18:06:49 1993 by Rik Faith (faith@cs.unc.edu)
30.\" Modified Fri Aug 25 23:17:51 1995 by Andries Brouwer (aeb@cwi.nl)
31.\" Modified Wed Dec 18 00:47:18 1996 by Andries Brouwer (aeb@cwi.nl)
616a8140
MK
32.\" 2007-06-15, Marc Boyer <marc.boyer@enseeiht.fr> + mtk
33.\" Improve discussion of strncpy().
fea681da 34.\"
460495ca 35.TH STRCPY 3 2015-08-08 "GNU" "Linux Programmer's Manual"
fea681da
MK
36.SH NAME
37strcpy, strncpy \- copy a string
38.SH SYNOPSIS
39.nf
40.B #include <string.h>
41.sp
42.BI "char *strcpy(char *" dest ", const char *" src );
43.sp
44.BI "char *strncpy(char *" dest ", const char *" src ", size_t " n );
45.fi
46.SH DESCRIPTION
60a90ecd
MK
47The
48.BR strcpy ()
46d8df8e
MK
49function copies the string pointed to by
50.IR src ,
f81fb444 51including the terminating null byte (\(aq\\0\(aq),
46d8df8e
MK
52to the buffer pointed to by
53.IR dest .
1c44bd5b 54The strings may not overlap, and the destination string
46d8df8e
MK
55.I dest
56must be large enough to receive the copy.
50a24bbc
MK
57.IR "Beware of buffer overruns!"
58(See BUGS.)
fea681da 59.PP
60a90ecd
MK
60The
61.BR strncpy ()
616a8140 62function is similar, except that at most
46d8df8e
MK
63.I n
64bytes of
65.I src
66are copied.
616a8140
MK
67.BR Warning :
68If there is no null byte
46d8df8e
MK
69among the first
70.I n
71bytes of
72.IR src ,
73the string placed in
74.I dest
75will not be null-terminated.
fea681da 76.PP
616a8140 77If the length of
fea681da 78.I src
616a8140 79is less than
fea681da 80.IR n ,
a638bc3b 81.BR strncpy ()
11c85ed8 82writes additional null bytes to
fea681da 83.I dest
cd90222a
MK
84to ensure that a total of
85.I n
86bytes are written.
616a8140
MK
87.PP
88A simple implementation of
89.BR strncpy ()
90might be:
088a639b 91.in +4n
616a8140
MK
92.nf
93
83e5bed5
MK
94char *
95strncpy(char *dest, const char *src, size_t n)
96{
616a8140
MK
97 size_t i;
98
83e5bed5 99 for (i = 0; i < n && src[i] != \(aq\\0\(aq; i++)
616a8140 100 dest[i] = src[i];
83e5bed5 101 for ( ; i < n; i++)
f81fb444 102 dest[i] = \(aq\\0\(aq;
616a8140
MK
103
104 return dest;
105}
106.fi
107.in
47297adb 108.SH RETURN VALUE
60a90ecd
MK
109The
110.BR strcpy ()
111and
112.BR strncpy ()
113functions return a pointer to
46d8df8e
MK
114the destination string
115.IR dest .
21b49240 116.SH ATTRIBUTES
5d876bea
PH
117For an explanation of the terms used in this section, see
118.BR attributes (7).
119.TS
120allbox;
121lbw19 lb lb
122l l l.
123Interface Attribute Value
124T{
125.BR strcpy (),
21b49240 126.BR strncpy ()
5d876bea
PH
127T} Thread safety MT-Safe
128.TE
47297adb 129.SH CONFORMING TO
1f3be1bf 130POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
616a8140
MK
131.SH NOTES
132Some programmers consider
133.BR strncpy ()
134to be inefficient and error prone.
135If the programmer knows (i.e., includes code to test!)
46d8df8e
MK
136that the size of
137.I dest
138is greater than
139the length of
140.IR src ,
141then
616a8140
MK
142.BR strcpy ()
143can be used.
144
bb96fc35
MK
145One valid (and intended) use of
146.BR strncpy ()
147is to copy a C string to a fixed-length buffer
148while ensuring both that the buffer is not overflowed
149and that unused bytes in the target buffer are zeroed out
1de7d4a1 150(perhaps to prevent information leaks if the buffer is to be
bb96fc35
MK
151written to media or transmitted to another process via an
152interprocess communication technique).
153
46d8df8e
MK
154If there is no terminating null byte in the first
155.I n
156bytes of
157.IR src ,
616a8140 158.BR strncpy ()
46d8df8e
MK
159produces an unterminated string in
160.IR dest .
3f89ae77
MK
161If
162.I buf
163has length
164.IR buflen ,
165you can force termination using something like the following:
088a639b 166.in +4n
616a8140
MK
167.nf
168
3f89ae77
MK
169strncpy(buf, str, buflen \- 1);
170if (buflen > 0)
171 buf[buflen \- 1]= \(aq\\0\(aq;
616a8140
MK
172.fi
173.in
276d73b6 174.PP
3f89ae77 175(Of course, the above technique ignores the fact that, if
276d73b6 176.I src
3f89ae77
MK
177contains more than
178.I "buflen\ \-\ 1"
179bytes, information is lost in the copying to
276d73b6 180.IR dest .)
159c95e1
MK
181.\"
182.SS strlcpy()
bb96fc35
MK
183Some systems (the BSDs, Solaris, and others) provide the following function:
184
185 size_t strlcpy(char *dest, const char *src, size_t size);
186
187.\" http://static.usenix.org/event/usenix99/full_papers/millert/millert_html/index.html
188.\" "strlcpy and strlcat - consistent, safe, string copy and concatenation"
189.\" 1999 USENIX Annual Technical Conference
190This function is similar to
191.BR strncpy (),
192but it copies at most
193.I size\-1
11c85ed8 194bytes to
bb96fc35
MK
195.IR dest ,
196always adds a terminating null byte,
197and does not pad the target with (further) null bytes.
198This function fixes some of the problems of
199.BR strcpy ()
200and
201.BR strncpy (),
202but the caller must still handle the possibility of data loss if
203.I size
204is too small.
205The return value of the function is the length of
206.IR src ,
207which allows truncation to be easily detected:
208if the return value is greater than or equal to
209.IR size ,
210truncation occurred.
211If loss of data matters, the caller
212.I must
213either check the arguments before the call,
214or test the function return value.
215.BR strlcpy ()
216is not present in glibc and is not standardized by POSIX,
217.\" https://lwn.net/Articles/506530/
218but is available on Linux via the
219.IR libbsd
220library.
fea681da 221.SH BUGS
60a90ecd
MK
222If the destination string of a
223.BR strcpy ()
9031fc7a
JS
224is not large enough, then anything might happen.
225Overflowing fixed-length string buffers is a favorite cracker technique
226for taking complete control of the machine.
227Any time a program reads or copies data into a buffer,
228the program first needs to check that there's enough space.
229This may be unnecessary if you can show that overflow is impossible,
230but be careful: programs can get changed over time,
231in ways that may make the impossible possible.
47297adb 232.SH SEE ALSO
fea681da
MK
233.BR bcopy (3),
234.BR memccpy (3),
235.BR memcpy (3),
236.BR memmove (3),
2cd33eb5 237.BR stpcpy (3),
f4d305c9 238.BR stpncpy (3),
c7a20d46 239.BR strdup (3),
3e5c319e 240.BR string (3),
fea681da
MK
241.BR wcscpy (3),
242.BR wcsncpy (3)