diff options
author | Vladimir Kondratyev <wulf@FreeBSD.org> | 2021-07-05 00:20:42 +0000 |
---|---|---|
committer | Vladimir Kondratyev <wulf@FreeBSD.org> | 2021-07-05 00:20:42 +0000 |
commit | 019391bf852771070cb739900f9e20ae6c41c746 (patch) | |
tree | 807246fb56bd6578050ef1abeb980f5164c426ff /sys/compat | |
parent | 98a6984a9e10c5c1677643eb4d9a758e3af131da (diff) | |
download | src-019391bf852771070cb739900f9e20ae6c41c746.tar.gz src-019391bf852771070cb739900f9e20ae6c41c746.zip |
LinuxKPI: Implement strscpy
strscpy copies the src string, or as much of it as fits, into the dst
buffer. The dst buffer is always NUL terminated, unless it's zero-sized.
strscpy returns the number of characters copied (not including the
trailing NUL) or -E2BIG if len is 0 or src was truncated.
Currently drm-kmod replaces strscpy with strncpy that is not quite
correct as strncpy does not NUL-terminate truncated strings and returns
different values on exit.
Reviewed by: hselasky, imp, manu
MFC after: 2 weeks
Differential revision: https://reviews.freebsd.org/D31005
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/string.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/string.h b/sys/compat/linuxkpi/common/include/linux/string.h index 39201e203162..659a48d93596 100644 --- a/sys/compat/linuxkpi/common/include/linux/string.h +++ b/sys/compat/linuxkpi/common/include/linux/string.h @@ -167,4 +167,20 @@ str_has_prefix(const char *str, const char *prefix) return (strncmp(str, prefix, len) == 0 ? len : 0); } +static inline ssize_t +strscpy(char* dst, const char* src, size_t len) +{ + size_t i; + + if (len <= INT_MAX) { + for (i = 0; i < len; i++) + if ('\0' == (dst[i] = src[i])) + return ((ssize_t)i); + if (i != 0) + dst[--i] = '\0'; + } + + return (-E2BIG); +} + #endif /* _LINUX_STRING_H_ */ |