docs: deprecated.rst: Expand str*cpy() replacement notes
The notes on replacing the deprecated str*cpy() functions didn't call enough attention to the change in return type. Add these details and clean up the language a bit more. Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Gustavo A. R. Silva <gustavoars@kernel.org> Link: https://lore.kernel.org/r/20201015231730.2138505-1-keescook@chromium.org Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
Родитель
bb7a2c6362
Коммит
27def953b6
|
@ -106,23 +106,29 @@ NUL or newline terminated.
|
|||
|
||||
strcpy()
|
||||
--------
|
||||
strcpy() performs no bounds checking on the destination
|
||||
buffer. This could result in linear overflows beyond the
|
||||
end of the buffer, leading to all kinds of misbehaviors. While
|
||||
`CONFIG_FORTIFY_SOURCE=y` and various compiler flags help reduce the
|
||||
risk of using this function, there is no good reason to add new uses of
|
||||
this function. The safe replacement is strscpy().
|
||||
strcpy() performs no bounds checking on the destination buffer. This
|
||||
could result in linear overflows beyond the end of the buffer, leading to
|
||||
all kinds of misbehaviors. While `CONFIG_FORTIFY_SOURCE=y` and various
|
||||
compiler flags help reduce the risk of using this function, there is
|
||||
no good reason to add new uses of this function. The safe replacement
|
||||
is strscpy(), though care must be given to any cases where the return
|
||||
value of strcpy() was used, since strscpy() does not return a pointer to
|
||||
the destination, but rather a count of non-NUL bytes copied (or negative
|
||||
errno when it truncates).
|
||||
|
||||
strncpy() on NUL-terminated strings
|
||||
-----------------------------------
|
||||
Use of strncpy() does not guarantee that the destination buffer
|
||||
will be NUL terminated. This can lead to various linear read overflows
|
||||
and other misbehavior due to the missing termination. It also NUL-pads the
|
||||
destination buffer if the source contents are shorter than the destination
|
||||
buffer size, which may be a needless performance penalty for callers using
|
||||
only NUL-terminated strings. The safe replacement is strscpy().
|
||||
(Users of strscpy() still needing NUL-padding should instead
|
||||
use strscpy_pad().)
|
||||
Use of strncpy() does not guarantee that the destination buffer will
|
||||
be NUL terminated. This can lead to various linear read overflows and
|
||||
other misbehavior due to the missing termination. It also NUL-pads
|
||||
the destination buffer if the source contents are shorter than the
|
||||
destination buffer size, which may be a needless performance penalty
|
||||
for callers using only NUL-terminated strings. The safe replacement is
|
||||
strscpy(), though care must be given to any cases where the return value
|
||||
of strncpy() was used, since strscpy() does not return a pointer to the
|
||||
destination, but rather a count of non-NUL bytes copied (or negative
|
||||
errno when it truncates). Any cases still needing NUL-padding should
|
||||
instead use strscpy_pad().
|
||||
|
||||
If a caller is using non-NUL-terminated strings, strncpy() can
|
||||
still be used, but destinations should be marked with the `__nonstring
|
||||
|
@ -131,10 +137,12 @@ attribute to avoid future compiler warnings.
|
|||
|
||||
strlcpy()
|
||||
---------
|
||||
strlcpy() reads the entire source buffer first, possibly exceeding
|
||||
the given limit of bytes to copy. This is inefficient and can lead to
|
||||
linear read overflows if a source string is not NUL-terminated. The
|
||||
safe replacement is strscpy().
|
||||
strlcpy() reads the entire source buffer first (since the return value
|
||||
is meant to match that of strlen()). This read may exceed the destination
|
||||
size limit. This is both inefficient and can lead to linear read overflows
|
||||
if a source string is not NUL-terminated. The safe replacement is strscpy(),
|
||||
though care must be given to any cases where the return value of strlcpy()
|
||||
is used, since strscpy() will return negative errno values when it truncates.
|
||||
|
||||
%p format specifier
|
||||
-------------------
|
||||
|
|
Загрузка…
Ссылка в новой задаче