nalika / rpms / grub2

Forked from rpms/grub2 2 years ago
Clone

Blame SOURCES/0300-safemath-Add-some-arithmetic-primitives-that-check-f.patch

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