diff options
author | Jiri Kosina <jkosina@suse.com> | 2025-01-20 11:58:12 +0300 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.com> | 2025-01-20 11:58:12 +0300 |
commit | 670af65d2ab4a6a9bb72f014b080757e291ad3fe (patch) | |
tree | d54ccf4ba52fa9f15ed8f1de6214edc53e1502be /lib/string.c | |
parent | 53078a736fbc60e5d3a1e14f4cd4214003815026 (diff) | |
parent | 1b1d865715e0eda52e62226261651e97673773d6 (diff) | |
download | linux-670af65d2ab4a6a9bb72f014b080757e291ad3fe.tar.xz |
Merge branch 'for-6.14/constify-bin-attribute' into for-linus
- constification of 'struct bin_attribute' in various HID driver (Thomas Weißschuh)
Diffstat (limited to 'lib/string.c')
-rw-r--r-- | lib/string.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/string.c b/lib/string.c index 76327b51e36f..eb4486ed40d2 100644 --- a/lib/string.c +++ b/lib/string.c @@ -104,6 +104,12 @@ char *strncpy(char *dest, const char *src, size_t count) EXPORT_SYMBOL(strncpy); #endif +#ifdef __BIG_ENDIAN +# define ALLBUTLAST_BYTE_MASK (~255ul) +#else +# define ALLBUTLAST_BYTE_MASK (~0ul >> 8) +#endif + ssize_t sized_strscpy(char *dest, const char *src, size_t count) { const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; @@ -147,13 +153,18 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count) *(unsigned long *)(dest+res) = c & zero_bytemask(data); return res + find_zero(data); } + count -= sizeof(unsigned long); + if (unlikely(!count)) { + c &= ALLBUTLAST_BYTE_MASK; + *(unsigned long *)(dest+res) = c; + return -E2BIG; + } *(unsigned long *)(dest+res) = c; res += sizeof(unsigned long); - count -= sizeof(unsigned long); max -= sizeof(unsigned long); } - while (count) { + while (count > 1) { char c; c = src[res]; @@ -164,11 +175,11 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count) count--; } - /* Hit buffer length without finding a NUL; force NUL-termination. */ - if (res) - dest[res-1] = '\0'; + /* Force NUL-termination. */ + dest[res] = '\0'; - return -E2BIG; + /* Return E2BIG if the source didn't stop */ + return src[res] ? -E2BIG : res; } EXPORT_SYMBOL(sized_strscpy); |