strlcpy strlcat - size-bounded string copying and concatenation
Lb libc
The
strlcpy ();
function copies up to
Fa size
- 1 characters from the NUL-terminated string
Fa src
to
Fa dst ,
NUL-terminating the result.
The
strlcat ();
function appends the NUL-terminated string
Fa src
to the end of
Fa dst .
It will append at most
Fa size
- strlen(dst) - 1 bytes, NUL-terminating the result.
Note however, that if
strlcat ();
traverses
Fa size
characters without finding a NUL, the length of the string is considered
to be
Fa size
and the destination string will not be NUL-terminated (since there was
no space for the NUL).
This keeps
strlcat ();
from running off the end of a string.
In practice this should not happen (as it means that either
Fa size
is incorrect or that
Fa dst
is not a proper
``C''
string).
The check exists to prevent potential security problems in incorrect code.
char *s, *p, buf[BUFSIZ]; ... (void)strlcpy(buf, s, sizeof(buf)); (void)strlcat(buf, p, sizeof(buf));
To detect truncation, perhaps while building a pathname, something like the following might be used:
char *dir, *file, pname[MAXPATHLEN]; ... if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname)) goto toolong; if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname)) goto toolong;
Since we know how many characters we copied the first time, we can speed things up a bit by using a copy instead of an append:
char *dir, *file, pname[MAXPATHLEN]; size_t n; ... n = strlcpy(pname, dir, sizeof(pname)); if (n >= sizeof(pname)) goto toolong; if (strlcpy(pname + n, file, sizeof(pname) - n) >= sizeof(pname) - n) goto toolong;
However, one may question the validity of such optimizations, as they
defeat the whole purpose of
strlcpy ();
and
strlcat (.);
As a matter of fact, the first version of this manual page got it wrong.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |