You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.3 KiB
125 lines
4.3 KiB
From 5c0dc6965ffb6e6bb86b56a363c0f9a38a38be61 Mon Sep 17 00:00:00 2001 |
|
From: Peter Jones <pjones@redhat.com> |
|
Date: Mon, 15 Jun 2020 10:58:42 -0400 |
|
Subject: [PATCH 300/336] safemath: Add some arithmetic primitives that check |
|
for overflow |
|
|
|
This adds a new header, include/grub/safemath.h, that includes easy to |
|
use wrappers for __builtin_{add,sub,mul}_overflow() declared like: |
|
|
|
bool OP(a, b, res) |
|
|
|
where OP is grub_add, grub_sub or grub_mul. OP() returns true in the |
|
case where the operation would overflow and res is not modified. |
|
Otherwise, false is returned and the operation is executed. |
|
|
|
These arithmetic primitives require newer compiler versions. So, bump |
|
these requirements in the INSTALL file too. |
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com> |
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> |
|
Upstream-commit-id: de1c315841a |
|
--- |
|
include/grub/compiler.h | 8 ++++++++ |
|
include/grub/safemath.h | 37 +++++++++++++++++++++++++++++++++++++ |
|
INSTALL | 21 +++------------------ |
|
3 files changed, 48 insertions(+), 18 deletions(-) |
|
create mode 100644 include/grub/safemath.h |
|
|
|
diff --git a/include/grub/compiler.h b/include/grub/compiler.h |
|
index a9a684ccba6..60d9c7fae25 100644 |
|
--- a/include/grub/compiler.h |
|
+++ b/include/grub/compiler.h |
|
@@ -48,6 +48,14 @@ |
|
# define WARN_UNUSED_RESULT |
|
#endif |
|
|
|
+#if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__) |
|
+# define CLANG_PREREQ(maj,min) \ |
|
+ ((__clang_major__ > (maj)) || \ |
|
+ (__clang_major__ == (maj) && __clang_minor__ >= (min))) |
|
+#else |
|
+# define CLANG_PREREQ(maj,min) 0 |
|
+#endif |
|
+ |
|
#include "types.h" |
|
|
|
union component64 |
|
diff --git a/include/grub/safemath.h b/include/grub/safemath.h |
|
new file mode 100644 |
|
index 00000000000..c17b89bba17 |
|
--- /dev/null |
|
+++ b/include/grub/safemath.h |
|
@@ -0,0 +1,37 @@ |
|
+/* |
|
+ * GRUB -- GRand Unified Bootloader |
|
+ * Copyright (C) 2020 Free Software Foundation, Inc. |
|
+ * |
|
+ * GRUB is free software: you can redistribute it and/or modify |
|
+ * it under the terms of the GNU General Public License as published by |
|
+ * the Free Software Foundation, either version 3 of the License, or |
|
+ * (at your option) any later version. |
|
+ * |
|
+ * GRUB is distributed in the hope that it will be useful, |
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
+ * GNU General Public License for more details. |
|
+ * |
|
+ * You should have received a copy of the GNU General Public License |
|
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. |
|
+ * |
|
+ * Arithmetic operations that protect against overflow. |
|
+ */ |
|
+ |
|
+#ifndef GRUB_SAFEMATH_H |
|
+#define GRUB_SAFEMATH_H 1 |
|
+ |
|
+#include <grub/compiler.h> |
|
+ |
|
+/* These appear in gcc 5.1 and clang 3.8. */ |
|
+#if GNUC_PREREQ(5, 1) || CLANG_PREREQ(3, 8) |
|
+ |
|
+#define grub_add(a, b, res) __builtin_add_overflow(a, b, res) |
|
+#define grub_sub(a, b, res) __builtin_sub_overflow(a, b, res) |
|
+#define grub_mul(a, b, res) __builtin_mul_overflow(a, b, res) |
|
+ |
|
+#else |
|
+#error gcc 5.1 or newer or clang 3.8 or newer is required |
|
+#endif |
|
+ |
|
+#endif /* GRUB_SAFEMATH_H */ |
|
diff --git a/INSTALL b/INSTALL |
|
index b67cd7f3476..8f46a3e999c 100644 |
|
--- a/INSTALL |
|
+++ b/INSTALL |
|
@@ -11,24 +11,9 @@ GRUB depends on some software packages installed into your system. If |
|
you don't have any of them, please obtain and install them before |
|
configuring the GRUB. |
|
|
|
-* GCC 4.1.3 or later |
|
- Note: older versions may work but support is limited |
|
- Note: clang 3.2 or later works for i386 and x86_64 targets but results in |
|
- much bigger binaries. |
|
- earlier versions not tested |
|
- Note: clang 3.2 or later works for arm |
|
- None of tested clang versions generated usable thumb code |
|
- earlier versions not tested |
|
- Note: clang 3.3 or later works for arm64 |
|
- earlier versions have no arm64 support |
|
- Note: clang 3.3 or later works for mips(el) |
|
- earlier versions fail to generate .reginfo and hence gprel relocations |
|
- fail. |
|
- Note: clang 3.2 or later works for powerpc |
|
- earlier versions not tested |
|
- Note: clang doesn't support -mno-app-regs and so can't be used for sparc64 |
|
- Note: clang has no support for ia64 and hence you can't compile GRUB |
|
- for ia64 with clang |
|
+* GCC 5.1.0 or later |
|
+ Experimental support for clang 3.8.0 or later (results in much bigger binaries) |
|
+ for i386, x86_64, arm (including thumb), arm64, mips(el), powerpc, sparc64 |
|
* GNU Make |
|
* GNU Bison 2.3 or later |
|
* GNU gettext 0.17 or later |
|
-- |
|
2.26.2 |
|
|
|
|