Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1390647 > unrolled thread
| Started by | Kees Cook <keescook@chromium.org> |
|---|---|
| First post | 2016-04-29 01:50 +0200 |
| Last post | 2016-04-29 02:20 +0200 |
| Articles | 4 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v3] x86/boot: Warn on future overlapping memcpy() use Kees Cook <keescook@chromium.org> - 2016-04-29 01:50 +0200
Re: [PATCH v3] x86/boot: Warn on future overlapping memcpy() use Kees Cook <keescook@chromium.org> - 2016-04-29 01:50 +0200
Re: [PATCH v3] x86/boot: Warn on future overlapping memcpy() use kbuild test robot <lkp@intel.com> - 2016-04-29 02:00 +0200
Re: [PATCH v3] x86/boot: Warn on future overlapping memcpy() use Kees Cook <keescook@chromium.org> - 2016-04-29 02:20 +0200
| From | Kees Cook <keescook@chromium.org> |
|---|---|
| Date | 2016-04-29 01:50 +0200 |
| Subject | [PATCH v3] x86/boot: Warn on future overlapping memcpy() use |
| Message-ID | <rt3QZ-4g6-1@gated-at.bofh.it> |
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.
Suggested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
---
arch/x86/boot/compressed/string.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/arch/x86/boot/compressed/string.c b/arch/x86/boot/compressed/string.c
index 2befeca1aada..7402227fdfdb 100644
--- a/arch/x86/boot/compressed/string.c
+++ b/arch/x86/boot/compressed/string.c
@@ -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
[toc] | [next] | [standalone]
| From | Kees Cook <keescook@chromium.org> |
|---|---|
| Date | 2016-04-29 01:50 +0200 |
| Message-ID | <rt3R0-4g6-9@gated-at.bofh.it> |
| In reply to | #1390647 |
(Sorry, this v3 got sent to an incomplete CC list...)
On Thu, Apr 28, 2016 at 4:46 PM, Kees Cook <keescook@chromium.org> wrote:
> 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.
>
> Suggested-by: Ingo Molnar <mingo@kernel.org>
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
> arch/x86/boot/compressed/string.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/boot/compressed/string.c b/arch/x86/boot/compressed/string.c
> index 2befeca1aada..7402227fdfdb 100644
> --- a/arch/x86/boot/compressed/string.c
> +++ b/arch/x86/boot/compressed/string.c
> @@ -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
--
Kees Cook
Chrome OS & Brillo Security
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2016-04-29 02:00 +0200 |
| Message-ID | <rt40F-4lp-3@gated-at.bofh.it> |
| In reply to | #1390647 |
[Multipart message — attachments visible in raw view] — view raw
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
[toc] | [prev] | [next] | [standalone]
| From | Kees Cook <keescook@chromium.org> |
|---|---|
| Date | 2016-04-29 02:20 +0200 |
| Message-ID | <rt4k2-4Rw-13@gated-at.bofh.it> |
| In reply to | #1390652 |
Argh. I'm hating this patch. :)
Will fix with v4.
On Thu, Apr 28, 2016 at 4:56 PM, kbuild test robot <lkp@intel.com> wrote:
> 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
--
Kees Cook
Chrome OS & Brillo Security
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web