* [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions
@ 2015-10-16 9:32 Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 1/2] overflow-arith: begin to add support for overflow builtin functions Hannes Frederic Sowa
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Hannes Frederic Sowa @ 2015-10-16 9:32 UTC (permalink / raw)
To: linux-kernel; +Cc: netdev, dvyukov, davem, Hannes Frederic Sowa
Hello,
I add a new header, linux/overflow-arith.h, as the central place to add
overflow and wrap-around checking functions. The reason I am doing so
is that it can make use of compiler supported builtin functions which
can leverage hardware.
As I need this for a fix in the ipv6 stack, which is also included in
this series, I propose to add it sooner than later over Davem's net
tree. This is also the reason why I start slowly with only the one
function I need at this time.
Thanks for reviewing!
Hannes Frederic Sowa (2):
overflow-arith: begin to add support for overflow builtin functions
ipv6: protect mtu calculation of wrap-around and infinite loop by
rounding issues
include/linux/compiler-gcc.h | 4 ++++
include/linux/overflow-arith.h | 18 ++++++++++++++++++
net/ipv6/ip6_output.c | 6 +++++-
3 files changed, 27 insertions(+), 1 deletion(-)
create mode 100644 include/linux/overflow-arith.h
--
2.4.3
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH net RESEND 1/2] overflow-arith: begin to add support for overflow builtin functions
2015-10-16 9:32 [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions Hannes Frederic Sowa
@ 2015-10-16 9:32 ` Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 2/2] ipv6: protect mtu calculation of wrap-around and infinite loop by rounding issues Hannes Frederic Sowa
2015-10-23 9:50 ` [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Hannes Frederic Sowa @ 2015-10-16 9:32 UTC (permalink / raw)
To: linux-kernel; +Cc: netdev, dvyukov, davem, Hannes Frederic Sowa
The idea of the overflow-arith.h header is to collect overflow checking
functions in one central place.
If gcc compiler supports the __builtin_overflow_* builtins we use them
because they might give better performance, otherwise the code falls
back to normal overflow checking functions.
The builtin_overflow functions are supported by gcc-5 and clang. The
matter of supporting clang is to just provide a corresponding
CC_HAVE_BUILTIN_OVERFLOW, because the specific overflow checking builtins
don't differ between gcc and clang.
I just provide overflow_usub function here as I intend this to get merged
into net, more functions will definitely follow as they are needed.
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
include/linux/compiler-gcc.h | 4 ++++
include/linux/overflow-arith.h | 18 ++++++++++++++++++
2 files changed, 22 insertions(+)
create mode 100644 include/linux/overflow-arith.h
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index dfaa7b3..82c159e 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -237,6 +237,10 @@
#define KASAN_ABI_VERSION 3
#endif
+#if GCC_VERSION >= 50000
+#define CC_HAVE_BUILTIN_OVERFLOW
+#endif
+
#endif /* gcc version >= 40000 specific checks */
#if !defined(__noclone)
diff --git a/include/linux/overflow-arith.h b/include/linux/overflow-arith.h
new file mode 100644
index 0000000..e12ccf8
--- /dev/null
+++ b/include/linux/overflow-arith.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <linux/kernel.h>
+
+#ifdef CC_HAVE_BUILTIN_OVERFLOW
+
+#define overflow_usub __builtin_usub_overflow
+
+#else
+
+static inline bool overflow_usub(unsigned int a, unsigned int b,
+ unsigned int *res)
+{
+ *res = a - b;
+ return *res > a ? true : false;
+}
+
+#endif
--
2.4.3
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH net RESEND 2/2] ipv6: protect mtu calculation of wrap-around and infinite loop by rounding issues
2015-10-16 9:32 [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 1/2] overflow-arith: begin to add support for overflow builtin functions Hannes Frederic Sowa
@ 2015-10-16 9:32 ` Hannes Frederic Sowa
2015-10-23 9:50 ` [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Hannes Frederic Sowa @ 2015-10-16 9:32 UTC (permalink / raw)
To: linux-kernel; +Cc: netdev, dvyukov, davem, Hannes Frederic Sowa
Raw sockets with hdrincl enabled can insert ipv6 extension headers
right into the data stream. In case we need to fragment those packets,
we reparse the options header to find the place where we can insert
the fragment header. If the extension headers exceed the link's MTU we
actually cannot make progress in such a case.
Instead of ending up in broken arithmetic or rounding towards 0 and
entering an endless loop in ip6_fragment, just prevent those cases by
aborting early and signal -EMSGSIZE to user space.
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
net/ipv6/ip6_output.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 61d403e..00aa538 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -28,6 +28,7 @@
#include <linux/errno.h>
#include <linux/kernel.h>
+#include <linux/overflow-arith.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/net.h>
@@ -584,7 +585,10 @@ int ip6_fragment(struct sock *sk, struct sk_buff *skb,
if (np->frag_size)
mtu = np->frag_size;
}
- mtu -= hlen + sizeof(struct frag_hdr);
+
+ if (overflow_usub(mtu, hlen + sizeof(struct frag_hdr), &mtu) ||
+ mtu <= 7)
+ goto fail_toobig;
frag_id = ipv6_select_ident(net, &ipv6_hdr(skb)->daddr,
&ipv6_hdr(skb)->saddr);
--
2.4.3
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions
2015-10-16 9:32 [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 1/2] overflow-arith: begin to add support for overflow builtin functions Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 2/2] ipv6: protect mtu calculation of wrap-around and infinite loop by rounding issues Hannes Frederic Sowa
@ 2015-10-23 9:50 ` David Miller
2 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2015-10-23 9:50 UTC (permalink / raw)
To: hannes; +Cc: linux-kernel, netdev, dvyukov
From: Hannes Frederic Sowa <hannes@stressinduktion.org>
Date: Fri, 16 Oct 2015 11:32:41 +0200
> I add a new header, linux/overflow-arith.h, as the central place to add
> overflow and wrap-around checking functions. The reason I am doing so
> is that it can make use of compiler supported builtin functions which
> can leverage hardware.
>
> As I need this for a fix in the ipv6 stack, which is also included in
> this series, I propose to add it sooner than later over Davem's net
> tree. This is also the reason why I start slowly with only the one
> function I need at this time.
>
> Thanks for reviewing!
Series applied, thanks Hannes.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-10-23 9:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-16 9:32 [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 1/2] overflow-arith: begin to add support for overflow builtin functions Hannes Frederic Sowa
2015-10-16 9:32 ` [PATCH net RESEND 2/2] ipv6: protect mtu calculation of wrap-around and infinite loop by rounding issues Hannes Frederic Sowa
2015-10-23 9:50 ` [PATCH net RESEND 0/2] overflow-arith: begin to add support for overflow builtins functions David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®