[PATCH v2 1/3] taint: Convert to indexed initialization

2018-02-19 Thread Kees Cook
This converts to using indexed initializers instead of comments, adds a
comment on why the taint flags can't be an enum, and make sure that no one
forgets to update the taint_flags when adding new bits.

Signed-off-by: Kees Cook 
---
 include/linux/kernel.h |  1 +
 kernel/panic.c | 36 +++-
 2 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index ce51455e2adf..62fa060a6e1a 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -533,6 +533,7 @@ extern enum system_states {
SYSTEM_RESTART,
 } system_state;
 
+/* This cannot be an enum because some may be used in assembly source. */
 #define TAINT_PROPRIETARY_MODULE   0
 #define TAINT_FORCED_MODULE1
 #define TAINT_CPU_OUT_OF_SPEC  2
diff --git a/kernel/panic.c b/kernel/panic.c
index 2cfef408fec9..c5e0fd5a188e 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -308,23 +308,23 @@ EXPORT_SYMBOL(panic);
  * is being removed anyway.
  */
 const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = {
-   { 'P', 'G', true }, /* TAINT_PROPRIETARY_MODULE */
-   { 'F', ' ', true }, /* TAINT_FORCED_MODULE */
-   { 'S', ' ', false },/* TAINT_CPU_OUT_OF_SPEC */
-   { 'R', ' ', false },/* TAINT_FORCED_RMMOD */
-   { 'M', ' ', false },/* TAINT_MACHINE_CHECK */
-   { 'B', ' ', false },/* TAINT_BAD_PAGE */
-   { 'U', ' ', false },/* TAINT_USER */
-   { 'D', ' ', false },/* TAINT_DIE */
-   { 'A', ' ', false },/* TAINT_OVERRIDDEN_ACPI_TABLE */
-   { 'W', ' ', false },/* TAINT_WARN */
-   { 'C', ' ', true }, /* TAINT_CRAP */
-   { 'I', ' ', false },/* TAINT_FIRMWARE_WORKAROUND */
-   { 'O', ' ', true }, /* TAINT_OOT_MODULE */
-   { 'E', ' ', true }, /* TAINT_UNSIGNED_MODULE */
-   { 'L', ' ', false },/* TAINT_SOFTLOCKUP */
-   { 'K', ' ', true }, /* TAINT_LIVEPATCH */
-   { 'X', ' ', true }, /* TAINT_AUX */
+   [ TAINT_PROPRIETARY_MODULE ]= { 'P', 'G', true },
+   [ TAINT_FORCED_MODULE ] = { 'F', ' ', true },
+   [ TAINT_CPU_OUT_OF_SPEC ]   = { 'S', ' ', false },
+   [ TAINT_FORCED_RMMOD ]  = { 'R', ' ', false },
+   [ TAINT_MACHINE_CHECK ] = { 'M', ' ', false },
+   [ TAINT_BAD_PAGE ]  = { 'B', ' ', false },
+   [ TAINT_USER ]  = { 'U', ' ', false },
+   [ TAINT_DIE ]   = { 'D', ' ', false },
+   [ TAINT_OVERRIDDEN_ACPI_TABLE ] = { 'A', ' ', false },
+   [ TAINT_WARN ]  = { 'W', ' ', false },
+   [ TAINT_CRAP ]  = { 'C', ' ', true },
+   [ TAINT_FIRMWARE_WORKAROUND ]   = { 'I', ' ', false },
+   [ TAINT_OOT_MODULE ]= { 'O', ' ', true },
+   [ TAINT_UNSIGNED_MODULE ]   = { 'E', ' ', true },
+   [ TAINT_SOFTLOCKUP ]= { 'L', ' ', false },
+   [ TAINT_LIVEPATCH ] = { 'K', ' ', true },
+   [ TAINT_AUX ]   = { 'X', ' ', true },
 };
 
 /**
@@ -354,6 +354,8 @@ const char *print_tainted(void)
 {
static char buf[TAINT_FLAGS_COUNT + sizeof("Tainted: ")];
 
+   BUILD_BUG_ON(ARRAY_SIZE(taint_flags) != TAINT_FLAGS_COUNT);
+
if (tainted_mask) {
char *s;
int i;
-- 
2.7.4



[PATCH v2 1/3] taint: Convert to indexed initialization

2018-02-19 Thread Kees Cook
This converts to using indexed initializers instead of comments, adds a
comment on why the taint flags can't be an enum, and make sure that no one
forgets to update the taint_flags when adding new bits.

Signed-off-by: Kees Cook 
---
 include/linux/kernel.h |  1 +
 kernel/panic.c | 36 +++-
 2 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index ce51455e2adf..62fa060a6e1a 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -533,6 +533,7 @@ extern enum system_states {
SYSTEM_RESTART,
 } system_state;
 
+/* This cannot be an enum because some may be used in assembly source. */
 #define TAINT_PROPRIETARY_MODULE   0
 #define TAINT_FORCED_MODULE1
 #define TAINT_CPU_OUT_OF_SPEC  2
diff --git a/kernel/panic.c b/kernel/panic.c
index 2cfef408fec9..c5e0fd5a188e 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -308,23 +308,23 @@ EXPORT_SYMBOL(panic);
  * is being removed anyway.
  */
 const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = {
-   { 'P', 'G', true }, /* TAINT_PROPRIETARY_MODULE */
-   { 'F', ' ', true }, /* TAINT_FORCED_MODULE */
-   { 'S', ' ', false },/* TAINT_CPU_OUT_OF_SPEC */
-   { 'R', ' ', false },/* TAINT_FORCED_RMMOD */
-   { 'M', ' ', false },/* TAINT_MACHINE_CHECK */
-   { 'B', ' ', false },/* TAINT_BAD_PAGE */
-   { 'U', ' ', false },/* TAINT_USER */
-   { 'D', ' ', false },/* TAINT_DIE */
-   { 'A', ' ', false },/* TAINT_OVERRIDDEN_ACPI_TABLE */
-   { 'W', ' ', false },/* TAINT_WARN */
-   { 'C', ' ', true }, /* TAINT_CRAP */
-   { 'I', ' ', false },/* TAINT_FIRMWARE_WORKAROUND */
-   { 'O', ' ', true }, /* TAINT_OOT_MODULE */
-   { 'E', ' ', true }, /* TAINT_UNSIGNED_MODULE */
-   { 'L', ' ', false },/* TAINT_SOFTLOCKUP */
-   { 'K', ' ', true }, /* TAINT_LIVEPATCH */
-   { 'X', ' ', true }, /* TAINT_AUX */
+   [ TAINT_PROPRIETARY_MODULE ]= { 'P', 'G', true },
+   [ TAINT_FORCED_MODULE ] = { 'F', ' ', true },
+   [ TAINT_CPU_OUT_OF_SPEC ]   = { 'S', ' ', false },
+   [ TAINT_FORCED_RMMOD ]  = { 'R', ' ', false },
+   [ TAINT_MACHINE_CHECK ] = { 'M', ' ', false },
+   [ TAINT_BAD_PAGE ]  = { 'B', ' ', false },
+   [ TAINT_USER ]  = { 'U', ' ', false },
+   [ TAINT_DIE ]   = { 'D', ' ', false },
+   [ TAINT_OVERRIDDEN_ACPI_TABLE ] = { 'A', ' ', false },
+   [ TAINT_WARN ]  = { 'W', ' ', false },
+   [ TAINT_CRAP ]  = { 'C', ' ', true },
+   [ TAINT_FIRMWARE_WORKAROUND ]   = { 'I', ' ', false },
+   [ TAINT_OOT_MODULE ]= { 'O', ' ', true },
+   [ TAINT_UNSIGNED_MODULE ]   = { 'E', ' ', true },
+   [ TAINT_SOFTLOCKUP ]= { 'L', ' ', false },
+   [ TAINT_LIVEPATCH ] = { 'K', ' ', true },
+   [ TAINT_AUX ]   = { 'X', ' ', true },
 };
 
 /**
@@ -354,6 +354,8 @@ const char *print_tainted(void)
 {
static char buf[TAINT_FLAGS_COUNT + sizeof("Tainted: ")];
 
+   BUILD_BUG_ON(ARRAY_SIZE(taint_flags) != TAINT_FLAGS_COUNT);
+
if (tainted_mask) {
char *s;
int i;
-- 
2.7.4