x86/boot: Warn on future overlapping memcpy() use
PATCH v3 1/1 x86/boot: Warn on future overlapping memcpy() use
If an overlapping memcpy() is ever attempted, we should report it and gracefully call memmove(). These cases can be found and fixed to use memmove() correctly, but in the meantime, we will not break booting.
--- arch/x86/boot/compressed/string.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
arch/x86/boot/compressed/string.c +13 -2
@@ -8,7 +8,7 @@#include "../string.c" #ifdef CONFIG_X86_32 -void *memcpy (void *dest,const void *src,size_t n) +static void *__memcpy (void *dest,const void *src,size_t n) {int d0, d1, d2; asm volatile(
@@ -22,7 +22,7 @@ void *memcpy(void *dest, const void *src, size_t n)return dest; }#else -void *memcpy (void *dest,const void *src,size_t n) +static void *__memcpy (void *dest,const void *src,size_t n) {long d0, d1, d2; asm volatile(
@@ -60,3 +60,14 @@ void *memmove(void *dest, const void *src, size_t n)return dest; } + +/* Detect and warn about potential overlaps, but handle them with memmove. */ +void *memcpy (void *dest,const void *src,size_t n) +{ +if (dest > src && dest - src < n) { +warn ("Avoiding potentially unsafe overlapping memcpy()!" ); +return memmove (dest, src, n); + } +return __memcpy (dest, src, n); +} +
Signature · 6 lines
2.6.3 -- Kees Cook Chrome OS & Brillo Security
(Sorry, this v3 got sent to an incomplete CC list...)
Quoted 54 lines · Kees Cook
If an overlapping
memcpy()is ever attempted, we should report it and gracefully callmemmove(). These cases can be found and fixed to usememmove()correctly, but in the meantime, we will not break booting.Suggested-by Ingo Molnar <[email protected]>Signed-off-by Kees Cook <[email protected]>--- arch/x86/boot/compressed/string.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)arch/x86/boot/compressed/string.c +13
-3@@ -8,7 +8,7 @@#include "../string.c" #ifdef CONFIG_X86_32 -void *memcpy (void *dest,const void *src,size_t n) +static void *__memcpy (void *dest,const void *src,size_t n) {int d0, d1, d2; asm volatile(@@ -22,7 +22,7 @@ void *memcpy(void *dest, const void *src, size_t n)return dest; }#else -void *memcpy (void *dest,const void *src,size_t n) +static void *__memcpy (void *dest,const void *src,size_t n) {long d0, d1, d2; asm volatile(@@ -60,3 +60,14 @@ void *memmove(void *dest, const void *src, size_t n)return dest; } + +/* Detect and warn about potential overlaps, but handle them with memmove. */ +void *memcpy (void *dest,const void *src,size_t n) +{ +if (dest > src && dest - src < n) { +warn ("Avoiding potentially unsafe overlapping memcpy()!" ); +return memmove (dest, src, n); + } +return __memcpy (dest, src, n); +} + --2.6.3
--
Kees Cook
Chrome OS & Brillo Security
Signature · 2 lines
Kees Cook Chrome OS & Brillo Security
kbuild test robot
build botreproduce:
Hi,
[auto build test ERROR on tip/auto-latest]
[cannot apply to tip/x86/core v4.6-rc5 next-20160428]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/Kees-Cook/x86-boot-Warn-on-future-overlapping-memcpy-use/20160429-075026 config: i386-tinyconfig (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386
All error/warnings (new ones prefixed by >>):
arch/x86/boot/compressed/string.c: In function 'memmove':
>> arch/x86/boot/compressed/string.c:56:10: warning: implicit declaration of function 'memcpy' [-Wimplicit-function-declaration]
return memcpy(dest, src, n);
^
>> arch/x86/boot/compressed/string.c:56:10: warning: return makes pointer from integer without a cast [-Wint-conversion]
arch/x86/boot/compressed/string.c: At top level:
>> arch/x86/boot/compressed/string.c:65:7: error: conflicting types for 'memcpy'
void *memcpy(void *dest, const void *src, size_t n)
^
arch/x86/boot/compressed/string.c:56:10: note: previous implicit declaration of 'memcpy' was here
return memcpy(dest, src, n);
^
arch/x86/boot/compressed/string.c: In function 'memcpy':
>> arch/x86/boot/compressed/string.c:68:3: warning: implicit declaration of function 'warn' [-Wimplicit-function-declaration]
warn("Avoiding potentially unsafe overlapping memcpy()!");
^vim +/memcpy +65 arch/x86/boot/compressed/string.c
50 void *memmove(void *dest, const void *src, size_t n)
51 {
52 unsigned char *d = dest;
53 const unsigned char *s = src;
54
55 if (d <= s || d - s >= n)
> 56 return memcpy(dest, src, n);
57
58 while (n-- > 0)
59 d[n] = s[n];
60
61 return dest;
62 }
63
64 /* Detect and warn about potential overlaps, but handle them with memmove. */
> 65 void *memcpy(void *dest, const void *src, size_t n)
66 {
67 if (dest > src && dest - src < n) {
> 68 warn("Avoiding potentially unsafe overlapping memcpy()!");
69 return memmove(dest, src, n);
70 }
71 return __memcpy(dest, src, n);---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Argh. I'm hating this patch. :)
Will fix with v4.
Quoted 59 lines · kbuild test robot
Hi,
[auto build test ERROR on tip/auto-latest]
[cannot apply to tip/x86/core v4.6-rc5 next-20160428]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]url: https://github.com/0day-ci/linux/commits/Kees-Cook/x86-boot-Warn-on-future-overlapping-memcpy-use/20160429-075026 config: i386-tinyconfig (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386All error/warnings (new ones prefixed by >>):
arch/x86/boot/compressed/string.c: In function 'memmove':Quoted 1 line
Quoted 1 line
arch/x86/boot/compressed/string.c:56:10: warning: implicit declaration of function 'memcpy' [-Wimplicit-function-declaration]return memcpy(dest, src, n); ^Quoted 1 line
Quoted 1 line
arch/x86/boot/compressed/string.c:56:10: warning: return makes pointer from integer without a cast [-Wint-conversion]
arch/x86/boot/compressed/string.c: At top level:Quoted 1 line
Quoted 1 line
arch/x86/boot/compressed/string.c:65:7: error: conflicting types for 'memcpy'void *memcpy(void *dest, const void *src,
size_tn)
^
arch/x86/boot/compressed/string.c:56:10: note: previous implicit declaration of 'memcpy' was herereturn memcpy(dest, src, n); ^
arch/x86/boot/compressed/string.c: In function 'memcpy':Quoted 1 line
Quoted 1 line
arch/x86/boot/compressed/string.c:68:3: warning: implicit declaration of function 'warn' [-Wimplicit-function-declaration]warn("Avoiding potentially unsafe overlapping memcpy()!"); ^vim +/memcpy +65
arch/x86/boot/compressed/string.c50 void *memmove(void *dest, const void *src, size_t n) 51 { 52 unsigned char *d = dest; 53 const unsigned char *s = src; 54 55 if (d <= s || d - s >= n)Quoted 1 line
56 return
memcpy(dest, src, n);57 58 while (n-- > 0) 59 d[n] = s[n]; 60 61 return dest; 62 } 63 64 /* Detect and warn about potential overlaps, but handle them with memmove. */Quoted 1 line
65 void *memcpy(void *dest, const void *src,
size_tn)66 { 67 if (dest > src && dest - src < n) {Quoted 1 line
68
warn("Avoiding potentially unsafe overlapping memcpy()!");69 return memmove(dest, src, n); 70 } 71 return __memcpy(dest, src, n);---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Signature · 2 lines
Kees Cook Chrome OS & Brillo Security