mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
x86: __memcpy_flushcache: fix wrong alignment if size > 2^32
The first "if" condition in __memcpy_flushcache is supposed to align the "dest" variable to 8 bytes and copy data up to this alignment. However, this condition may misbehave if "size" is greater than 4GiB. The statement min_t(unsigned, size, ALIGN(dest, 8) - dest); casts both arguments to unsigned int and selects the smaller one. However, the cast truncates high bits in "size" and it results in misbehavior. For example: suppose that size == 0x100000001, dest == 0x200000002 min_t(unsigned, size, ALIGN(dest, 8) - dest) == min_t(0x1, 0xe) == 0x1; ... dest += 0x1; so we copy just one byte "and" dest remains unaligned. This patch fixes the bug by replacing unsigned with size_t. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
559089e0a9
commit
a6823e4e36
@@ -119,7 +119,7 @@ void __memcpy_flushcache(void *_dst, const void *_src, size_t size)
|
|||||||
|
|
||||||
/* cache copy and flush to align dest */
|
/* cache copy and flush to align dest */
|
||||||
if (!IS_ALIGNED(dest, 8)) {
|
if (!IS_ALIGNED(dest, 8)) {
|
||||||
unsigned len = min_t(unsigned, size, ALIGN(dest, 8) - dest);
|
size_t len = min_t(size_t, size, ALIGN(dest, 8) - dest);
|
||||||
|
|
||||||
memcpy((void *) dest, (void *) source, len);
|
memcpy((void *) dest, (void *) source, len);
|
||||||
clean_cache_range((void *) dest, len);
|
clean_cache_range((void *) dest, len);
|
||||||
|
Reference in New Issue
Block a user