diff options
Diffstat (limited to 'lib/string.c')
| -rw-r--r-- | lib/string.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/string.c b/lib/string.c index eb4486ed40d2..b632c71df1a5 100644 --- a/lib/string.c +++ b/lib/string.c @@ -119,6 +119,7 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count)  	if (count == 0 || WARN_ON_ONCE(count > INT_MAX))  		return -E2BIG; +#ifndef CONFIG_DCACHE_WORD_ACCESS  #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS  	/*  	 * If src is unaligned, don't cross a page boundary, @@ -134,11 +135,13 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count)  	if (((long) dest | (long) src) & (sizeof(long) - 1))  		max = 0;  #endif +#endif  	/* -	 * read_word_at_a_time() below may read uninitialized bytes after the -	 * trailing zero and use them in comparisons. Disable this optimization -	 * under KMSAN to prevent false positive reports. +	 * load_unaligned_zeropad() or read_word_at_a_time() below may read +	 * uninitialized bytes after the trailing zero and use them in +	 * comparisons. Disable this optimization under KMSAN to prevent +	 * false positive reports.  	 */  	if (IS_ENABLED(CONFIG_KMSAN))  		max = 0; @@ -146,7 +149,11 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count)  	while (max >= sizeof(unsigned long)) {  		unsigned long c, data; +#ifdef CONFIG_DCACHE_WORD_ACCESS +		c = load_unaligned_zeropad(src+res); +#else  		c = read_word_at_a_time(src+res); +#endif  		if (has_zero(c, &data, &constants)) {  			data = prep_zero_mask(c, data, &constants);  			data = create_zero_mask(data);  | 
