aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-11-13 13:30:44 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-13 13:30:44 -0500
commit55b3a0cb5aeef0961ee18eac058e488f149a0053 (patch)
treeb8ac5161349f5e5dea8b2a29842fe43ee78f23a2
parentdee02770cdcd8bc06a48c917ce5df2fb56cf6059 (diff)
parent34d8751fd4ffa34e85ee7e85d34168b3f3f62b42 (diff)
Merge branch 'next-general' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull general security subsystem updates from James Morris: "TPM (from Jarkko): - essential clean up for tpm_crb so that ARM64 and x86 versions do not distract each other as much as before - /dev/tpm0 rejects now too short writes (shorter buffer than specified in the command header - use DMA-safe buffer in tpm_tis_spi - otherwise mostly minor fixes. Smack: - base support for overlafs Capabilities: - BPRM_FCAPS fixes, from Richard Guy Briggs: The audit subsystem is adding a BPRM_FCAPS record when auditing setuid application execution (SYSCALL execve). This is not expected as it was supposed to be limited to when the file system actually had capabilities in an extended attribute. It lists all capabilities making the event really ugly to parse what is happening. The PATH record correctly records the setuid bit and owner. Suppress the BPRM_FCAPS record on set*id. TOMOYO: - Y2038 timestamping fixes" * 'next-general' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (28 commits) MAINTAINERS: update the IMA, EVM, trusted-keys, encrypted-keys entries Smack: Base support for overlayfs MAINTAINERS: remove David Safford as maintainer for encrypted+trusted keys tomoyo: fix timestamping for y2038 capabilities: audit log other surprising conditions capabilities: fix logic for effective root or real root capabilities: invert logic for clarity capabilities: remove a layer of conditional logic capabilities: move audit log decision to function capabilities: use intuitive names for id changes capabilities: use root_priveleged inline to clarify logic capabilities: rename has_cap to has_fcap capabilities: intuitive names for cap gain status capabilities: factor out cap_bprm_set_creds privileged root tpm, tpm_tis: use ARRAY_SIZE() to define TPM_HID_USR_IDX tpm: fix duplicate inline declaration specifier tpm: fix type of a local variables in tpm_tis_spi.c tpm: fix type of a local variable in tpm2_map_command() tpm: fix type of a local variable in tpm2_get_cc_attrs_tbl() tpm-dev-common: Reject too short writes ...
-rw-r--r--MAINTAINERS13
-rw-r--r--drivers/char/tpm/tpm-dev-common.c6
-rw-r--r--drivers/char/tpm/tpm-sysfs.c87
-rw-r--r--drivers/char/tpm/tpm.h15
-rw-r--r--drivers/char/tpm/tpm2-cmd.c73
-rw-r--r--drivers/char/tpm/tpm2-space.c4
-rw-r--r--drivers/char/tpm/tpm_crb.c59
-rw-r--r--drivers/char/tpm/tpm_tis.c5
-rw-r--r--drivers/char/tpm/tpm_tis_core.c6
-rw-r--r--drivers/char/tpm/tpm_tis_core.h4
-rw-r--r--drivers/char/tpm/tpm_tis_spi.c73
-rw-r--r--security/commoncap.c193
-rw-r--r--security/smack/smack_lsm.c79
-rw-r--r--security/tomoyo/audit.c2
-rw-r--r--security/tomoyo/common.c4
-rw-r--r--security/tomoyo/common.h2
-rw-r--r--security/tomoyo/util.c39
17 files changed, 385 insertions, 279 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 779fa6dde58b..026644adfd8f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5219,8 +5219,7 @@ F: fs/ext4/
5219 5219
5220Extended Verification Module (EVM) 5220Extended Verification Module (EVM)
5221M: Mimi Zohar <zohar@linux.vnet.ibm.com> 5221M: Mimi Zohar <zohar@linux.vnet.ibm.com>
5222L: linux-ima-devel@lists.sourceforge.net 5222L: linux-integrity@vger.kernel.org
5223L: linux-security-module@vger.kernel.org
5224S: Supported 5223S: Supported
5225F: security/integrity/evm/ 5224F: security/integrity/evm/
5226 5225
@@ -6847,9 +6846,7 @@ L: linux-crypto@vger.kernel.org
6847INTEGRITY MEASUREMENT ARCHITECTURE (IMA) 6846INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
6848M: Mimi Zohar <zohar@linux.vnet.ibm.com> 6847M: Mimi Zohar <zohar@linux.vnet.ibm.com>
6849M: Dmitry Kasatkin <dmitry.kasatkin@gmail.com> 6848M: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
6850L: linux-ima-devel@lists.sourceforge.net 6849L: linux-integrity@vger.kernel.org
6851L: linux-ima-user@lists.sourceforge.net
6852L: linux-security-module@vger.kernel.org
6853T: git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git 6850T: git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
6854S: Supported 6851S: Supported
6855F: security/integrity/ima/ 6852F: security/integrity/ima/
@@ -7632,8 +7629,7 @@ F: kernel/kexec*
7632 7629
7633KEYS-ENCRYPTED 7630KEYS-ENCRYPTED
7634M: Mimi Zohar <zohar@linux.vnet.ibm.com> 7631M: Mimi Zohar <zohar@linux.vnet.ibm.com>
7635M: David Safford <safford@us.ibm.com> 7632L: linux-integrity@vger.kernel.org
7636L: linux-security-module@vger.kernel.org
7637L: keyrings@vger.kernel.org 7633L: keyrings@vger.kernel.org
7638S: Supported 7634S: Supported
7639F: Documentation/security/keys/trusted-encrypted.rst 7635F: Documentation/security/keys/trusted-encrypted.rst
@@ -7641,9 +7637,8 @@ F: include/keys/encrypted-type.h
7641F: security/keys/encrypted-keys/ 7637F: security/keys/encrypted-keys/
7642 7638
7643KEYS-TRUSTED 7639KEYS-TRUSTED
7644M: David Safford <safford@us.ibm.com>
7645M: Mimi Zohar <zohar@linux.vnet.ibm.com> 7640M: Mimi Zohar <zohar@linux.vnet.ibm.com>
7646L: linux-security-module@vger.kernel.org 7641L: linux-integrity@vger.kernel.org
7647L: keyrings@vger.kernel.org 7642L: keyrings@vger.kernel.org
7648S: Supported 7643S: Supported
7649F: Documentation/security/keys/trusted-encrypted.rst 7644F: Documentation/security/keys/trusted-encrypted.rst
diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c
index 610638a80383..461bf0b8a094 100644
--- a/drivers/char/tpm/tpm-dev-common.c
+++ b/drivers/char/tpm/tpm-dev-common.c
@@ -110,6 +110,12 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf,
110 return -EFAULT; 110 return -EFAULT;
111 } 111 }
112 112
113 if (in_size < 6 ||
114 in_size < be32_to_cpu(*((__be32 *) (priv->data_buffer + 2)))) {
115 mutex_unlock(&priv->buffer_mutex);
116 return -EINVAL;
117 }
118
113 /* atomic tpm command send and result receive. We only hold the ops 119 /* atomic tpm command send and result receive. We only hold the ops
114 * lock during this period so that the tpm can be unregistered even if 120 * lock during this period so that the tpm can be unregistered even if
115 * the char dev is held open. 121 * the char dev is held open.
diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c
index 86f38d239476..83a77a445538 100644
--- a/drivers/char/tpm/tpm-sysfs.c
+++ b/drivers/char/tpm/tpm-sysfs.c
@@ -20,44 +20,48 @@
20#include <linux/device.h> 20#include <linux/device.h>
21#include "tpm.h" 21#include "tpm.h"
22 22
23#define READ_PUBEK_RESULT_SIZE 314 23struct tpm_readpubek_out {
24 u8 algorithm[4];
25 u8 encscheme[2];
26 u8 sigscheme[2];
27 __be32 paramsize;
28 u8 parameters[12];
29 __be32 keysize;
30 u8 modulus[256];
31 u8 checksum[20];
32} __packed;
33
24#define READ_PUBEK_RESULT_MIN_BODY_SIZE (28 + 256) 34#define READ_PUBEK_RESULT_MIN_BODY_SIZE (28 + 256)
25#define TPM_ORD_READPUBEK 124 35#define TPM_ORD_READPUBEK 124
26static const struct tpm_input_header tpm_readpubek_header = { 36
27 .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND),
28 .length = cpu_to_be32(30),
29 .ordinal = cpu_to_be32(TPM_ORD_READPUBEK)
30};
31static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, 37static ssize_t pubek_show(struct device *dev, struct device_attribute *attr,
32 char *buf) 38 char *buf)
33{ 39{
34 u8 *data; 40 struct tpm_buf tpm_buf;
35 struct tpm_cmd_t tpm_cmd; 41 struct tpm_readpubek_out *out;
36 ssize_t err; 42 ssize_t rc;
37 int i, rc; 43 int i;
38 char *str = buf; 44 char *str = buf;
39 struct tpm_chip *chip = to_tpm_chip(dev); 45 struct tpm_chip *chip = to_tpm_chip(dev);
46 char anti_replay[20];
40 47
41 memset(&tpm_cmd, 0, sizeof(tpm_cmd)); 48 memset(&anti_replay, 0, sizeof(anti_replay));
42 49
43 tpm_cmd.header.in = tpm_readpubek_header; 50 rc = tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK);
44 err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, READ_PUBEK_RESULT_SIZE, 51 if (rc)
45 READ_PUBEK_RESULT_MIN_BODY_SIZE, 0, 52 return rc;
46 "attempting to read the PUBEK"); 53
47 if (err) 54 tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay));
48 goto out; 55
49 56 rc = tpm_transmit_cmd(chip, NULL, tpm_buf.data, PAGE_SIZE,
50 /* 57 READ_PUBEK_RESULT_MIN_BODY_SIZE, 0,
51 ignore header 10 bytes 58 "attempting to read the PUBEK");
52 algorithm 32 bits (1 == RSA ) 59 if (rc) {
53 encscheme 16 bits 60 tpm_buf_destroy(&tpm_buf);
54 sigscheme 16 bits 61 return 0;
55 parameters (RSA 12->bytes: keybit, #primes, expbit) 62 }
56 keylenbytes 32 bits 63
57 256 byte modulus 64 out = (struct tpm_readpubek_out *)&tpm_buf.data[10];
58 ignore checksum 20 bytes
59 */
60 data = tpm_cmd.params.readpubek_out_buffer;
61 str += 65 str +=
62 sprintf(str, 66 sprintf(str,
63 "Algorithm: %02X %02X %02X %02X\n" 67 "Algorithm: %02X %02X %02X %02X\n"
@@ -68,21 +72,26 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr,
68 "%02X %02X %02X %02X\n" 72 "%02X %02X %02X %02X\n"
69 "Modulus length: %d\n" 73 "Modulus length: %d\n"
70 "Modulus:\n", 74 "Modulus:\n",
71 data[0], data[1], data[2], data[3], 75 out->algorithm[0], out->algorithm[1], out->algorithm[2],
72 data[4], data[5], 76 out->algorithm[3],
73 data[6], data[7], 77 out->encscheme[0], out->encscheme[1],
74 data[12], data[13], data[14], data[15], 78 out->sigscheme[0], out->sigscheme[1],
75 data[16], data[17], data[18], data[19], 79 out->parameters[0], out->parameters[1],
76 data[20], data[21], data[22], data[23], 80 out->parameters[2], out->parameters[3],
77 be32_to_cpu(*((__be32 *) (data + 24)))); 81 out->parameters[4], out->parameters[5],
82 out->parameters[6], out->parameters[7],
83 out->parameters[8], out->parameters[9],
84 out->parameters[10], out->parameters[11],
85 be32_to_cpu(out->keysize));
78 86
79 for (i = 0; i < 256; i++) { 87 for (i = 0; i < 256; i++) {
80 str += sprintf(str, "%02X ", data[i + 28]); 88 str += sprintf(str, "%02X ", out->modulus[i]);
81 if ((i + 1) % 16 == 0) 89 if ((i + 1) % 16 == 0)
82 str += sprintf(str, "\n"); 90 str += sprintf(str, "\n");
83 } 91 }
84out: 92
85 rc = str - buf; 93 rc = str - buf;
94 tpm_buf_destroy(&tpm_buf);
86 return rc; 95 return rc;
87} 96}
88static DEVICE_ATTR_RO(pubek); 97static DEVICE_ATTR_RO(pubek);
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 2d5466a72e40..528cffbd49d3 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -345,17 +345,6 @@ enum tpm_sub_capabilities {
345 TPM_CAP_PROP_TIS_DURATION = 0x120, 345 TPM_CAP_PROP_TIS_DURATION = 0x120,
346}; 346};
347 347
348struct tpm_readpubek_params_out {
349 u8 algorithm[4];
350 u8 encscheme[2];
351 u8 sigscheme[2];
352 __be32 paramsize;
353 u8 parameters[12]; /*assuming RSA*/
354 __be32 keysize;
355 u8 modulus[256];
356 u8 checksum[20];
357} __packed;
358
359typedef union { 348typedef union {
360 struct tpm_input_header in; 349 struct tpm_input_header in;
361 struct tpm_output_header out; 350 struct tpm_output_header out;
@@ -385,8 +374,6 @@ struct tpm_getrandom_in {
385} __packed; 374} __packed;
386 375
387typedef union { 376typedef union {
388 struct tpm_readpubek_params_out readpubek_out;
389 u8 readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
390 struct tpm_pcrread_in pcrread_in; 377 struct tpm_pcrread_in pcrread_in;
391 struct tpm_pcrread_out pcrread_out; 378 struct tpm_pcrread_out pcrread_out;
392 struct tpm_getrandom_in getrandom_in; 379 struct tpm_getrandom_in getrandom_in;
@@ -557,7 +544,7 @@ static inline void tpm_add_ppi(struct tpm_chip *chip)
557} 544}
558#endif 545#endif
559 546
560static inline inline u32 tpm2_rc_value(u32 rc) 547static inline u32 tpm2_rc_value(u32 rc)
561{ 548{
562 return (rc & BIT(7)) ? rc & 0xff : rc; 549 return (rc & BIT(7)) ? rc & 0xff : rc;
563} 550}
diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index e1a41b788f08..f40d20671a78 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -834,72 +834,43 @@ static const struct tpm_input_header tpm2_selftest_header = {
834}; 834};
835 835
836/** 836/**
837 * tpm2_continue_selftest() - start a self test 837 * tpm2_do_selftest() - ensure that all self tests have passed
838 *
839 * @chip: TPM chip to use
840 * @full: test all commands instead of testing only those that were not
841 * previously tested.
842 *
843 * Return: Same as with tpm_transmit_cmd with exception of RC_TESTING.
844 */
845static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
846{
847 int rc;
848 struct tpm2_cmd cmd;
849
850 cmd.header.in = tpm2_selftest_header;
851 cmd.params.selftest_in.full_test = full;
852
853 rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE, 0, 0,
854 "continue selftest");
855
856 /* At least some prototype chips seem to give RC_TESTING error
857 * immediately. This is a workaround for that.
858 */
859 if (rc == TPM2_RC_TESTING) {
860 dev_warn(&chip->dev, "Got RC_TESTING, ignoring\n");
861 rc = 0;
862 }
863
864 return rc;
865}
866
867/**
868 * tpm2_do_selftest() - run a full self test
869 * 838 *
870 * @chip: TPM chip to use 839 * @chip: TPM chip to use
871 * 840 *
872 * Return: Same as with tpm_transmit_cmd. 841 * Return: Same as with tpm_transmit_cmd.
873 * 842 *
874 * During the self test TPM2 commands return with the error code RC_TESTING. 843 * The TPM can either run all self tests synchronously and then return
875 * Waiting is done by issuing PCR read until it executes successfully. 844 * RC_SUCCESS once all tests were successful. Or it can choose to run the tests
845 * asynchronously and return RC_TESTING immediately while the self tests still
846 * execute in the background. This function handles both cases and waits until
847 * all tests have completed.
876 */ 848 */
877static int tpm2_do_selftest(struct tpm_chip *chip) 849static int tpm2_do_selftest(struct tpm_chip *chip)
878{ 850{
879 int rc; 851 int rc;
880 unsigned int loops; 852 unsigned int delay_msec = 20;
881 unsigned int delay_msec = 100; 853 long duration;
882 unsigned long duration; 854 struct tpm2_cmd cmd;
883 int i;
884
885 duration = tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST);
886 855
887 loops = jiffies_to_msecs(duration) / delay_msec; 856 duration = jiffies_to_msecs(
857 tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
888 858
889 rc = tpm2_start_selftest(chip, true); 859 while (duration > 0) {
890 if (rc) 860 cmd.header.in = tpm2_selftest_header;
891 return rc; 861 cmd.params.selftest_in.full_test = 0;
892 862
893 for (i = 0; i < loops; i++) { 863 rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE,
894 /* Attempt to read a PCR value */ 864 0, 0, "continue selftest");
895 rc = tpm2_pcr_read(chip, 0, NULL);
896 if (rc < 0)
897 break;
898 865
899 if (rc != TPM2_RC_TESTING) 866 if (rc != TPM2_RC_TESTING)
900 break; 867 break;
901 868
902 tpm_msleep(delay_msec); 869 tpm_msleep(delay_msec);
870 duration -= delay_msec;
871
872 /* wait longer the next round */
873 delay_msec *= 2;
903 } 874 }
904 875
905 return rc; 876 return rc;
@@ -1009,7 +980,7 @@ static int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip)
1009{ 980{
1010 struct tpm_buf buf; 981 struct tpm_buf buf;
1011 u32 nr_commands; 982 u32 nr_commands;
1012 u32 *attrs; 983 __be32 *attrs;
1013 u32 cc; 984 u32 cc;
1014 int i; 985 int i;
1015 int rc; 986 int rc;
@@ -1049,7 +1020,7 @@ static int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip)
1049 1020
1050 chip->nr_commands = nr_commands; 1021 chip->nr_commands = nr_commands;
1051 1022
1052 attrs = (u32 *)&buf.data[TPM_HEADER_SIZE + 9]; 1023 attrs = (__be32 *)&buf.data[TPM_HEADER_SIZE + 9];
1053 for (i = 0; i < nr_commands; i++, attrs++) { 1024 for (i = 0; i < nr_commands; i++, attrs++) {
1054 chip->cc_attrs_tbl[i] = be32_to_cpup(attrs); 1025 chip->cc_attrs_tbl[i] = be32_to_cpup(attrs);
1055 cc = chip->cc_attrs_tbl[i] & 0xFFFF; 1026 cc = chip->cc_attrs_tbl[i] & 0xFFFF;
diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c
index e2e059d8ffec..4e4014eabdb9 100644
--- a/drivers/char/tpm/tpm2-space.c
+++ b/drivers/char/tpm/tpm2-space.c
@@ -242,7 +242,7 @@ static int tpm2_map_command(struct tpm_chip *chip, u32 cc, u8 *cmd)
242 struct tpm_space *space = &chip->work_space; 242 struct tpm_space *space = &chip->work_space;
243 unsigned int nr_handles; 243 unsigned int nr_handles;
244 u32 attrs; 244 u32 attrs;
245 u32 *handle; 245 __be32 *handle;
246 int i; 246 int i;
247 247
248 i = tpm2_find_cc(chip, cc); 248 i = tpm2_find_cc(chip, cc);
@@ -252,7 +252,7 @@ static int tpm2_map_command(struct tpm_chip *chip, u32 cc, u8 *cmd)
252 attrs = chip->cc_attrs_tbl[i]; 252 attrs = chip->cc_attrs_tbl[i];
253 nr_handles = (attrs >> TPM2_CC_ATTR_CHANDLES) & GENMASK(2, 0); 253 nr_handles = (attrs >> TPM2_CC_ATTR_CHANDLES) & GENMASK(2, 0);
254 254
255 handle = (u32 *)&cmd[TPM_HEADER_SIZE]; 255 handle = (__be32 *)&cmd[TPM_HEADER_SIZE];
256 for (i = 0; i < nr_handles; i++, handle++) { 256 for (i = 0; i < nr_handles; i++, handle++) {
257 if ((be32_to_cpu(*handle) & 0xFF000000) == TPM2_HT_TRANSIENT) { 257 if ((be32_to_cpu(*handle) & 0xFF000000) == TPM2_HT_TRANSIENT) {
258 if (!tpm2_map_to_phandle(space, handle)) 258 if (!tpm2_map_to_phandle(space, handle))
diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
index 8f0a98dea327..7b3c2a8aa9de 100644
--- a/drivers/char/tpm/tpm_crb.c
+++ b/drivers/char/tpm/tpm_crb.c
@@ -92,14 +92,9 @@ enum crb_status {
92 CRB_DRV_STS_COMPLETE = BIT(0), 92 CRB_DRV_STS_COMPLETE = BIT(0),
93}; 93};
94 94
95enum crb_flags {
96 CRB_FL_ACPI_START = BIT(0),
97 CRB_FL_CRB_START = BIT(1),
98 CRB_FL_CRB_SMC_START = BIT(2),
99};
100
101struct crb_priv { 95struct crb_priv {
102 unsigned int flags; 96 u32 sm;
97 const char *hid;
103 void __iomem *iobase; 98 void __iomem *iobase;
104 struct crb_regs_head __iomem *regs_h; 99 struct crb_regs_head __iomem *regs_h;
105 struct crb_regs_tail __iomem *regs_t; 100 struct crb_regs_tail __iomem *regs_t;
@@ -128,14 +123,16 @@ struct tpm2_crb_smc {
128 * Anyhow, we do not wait here as a consequent CMD_READY request 123 * Anyhow, we do not wait here as a consequent CMD_READY request
129 * will be handled correctly even if idle was not completed. 124 * will be handled correctly even if idle was not completed.
130 * 125 *
131 * The function does nothing for devices with ACPI-start method. 126 * The function does nothing for devices with ACPI-start method
127 * or SMC-start method.
132 * 128 *
133 * Return: 0 always 129 * Return: 0 always
134 */ 130 */
135static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv) 131static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv)
136{ 132{
137 if ((priv->flags & CRB_FL_ACPI_START) || 133 if ((priv->sm == ACPI_TPM2_START_METHOD) ||
138 (priv->flags & CRB_FL_CRB_SMC_START)) 134 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD) ||
135 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC))
139 return 0; 136 return 0;
140 137
141 iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->regs_t->ctrl_req); 138 iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->regs_t->ctrl_req);
@@ -174,14 +171,16 @@ static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value,
174 * The device should respond within TIMEOUT_C. 171 * The device should respond within TIMEOUT_C.
175 * 172 *
176 * The function does nothing for devices with ACPI-start method 173 * The function does nothing for devices with ACPI-start method
174 * or SMC-start method.
177 * 175 *
178 * Return: 0 on success -ETIME on timeout; 176 * Return: 0 on success -ETIME on timeout;
179 */ 177 */
180static int __maybe_unused crb_cmd_ready(struct device *dev, 178static int __maybe_unused crb_cmd_ready(struct device *dev,
181 struct crb_priv *priv) 179 struct crb_priv *priv)
182{ 180{
183 if ((priv->flags & CRB_FL_ACPI_START) || 181 if ((priv->sm == ACPI_TPM2_START_METHOD) ||
184 (priv->flags & CRB_FL_CRB_SMC_START)) 182 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD) ||
183 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC))
185 return 0; 184 return 0;
186 185
187 iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req); 186 iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req);
@@ -325,13 +324,20 @@ static int crb_send(struct tpm_chip *chip, u8 *buf, size_t len)
325 /* Make sure that cmd is populated before issuing start. */ 324 /* Make sure that cmd is populated before issuing start. */
326 wmb(); 325 wmb();
327 326
328 if (priv->flags & CRB_FL_CRB_START) 327 /* The reason for the extra quirk is that the PTT in 4th Gen Core CPUs
328 * report only ACPI start but in practice seems to require both
329 * CRB start, hence invoking CRB start method if hid == MSFT0101.
330 */
331 if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
332 (priv->sm == ACPI_TPM2_MEMORY_MAPPED) ||
333 (!strcmp(priv->hid, "MSFT0101")))
329 iowrite32(CRB_START_INVOKE, &priv->regs_t->ctrl_start); 334 iowrite32(CRB_START_INVOKE, &priv->regs_t->ctrl_start);
330 335
331 if (priv->flags & CRB_FL_ACPI_START) 336 if ((priv->sm == ACPI_TPM2_START_METHOD) ||
337 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD))
332 rc = crb_do_acpi_start(chip); 338 rc = crb_do_acpi_start(chip);
333 339
334 if (priv->flags & CRB_FL_CRB_SMC_START) { 340 if (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) {
335 iowrite32(CRB_START_INVOKE, &priv->regs_t->ctrl_start); 341 iowrite32(CRB_START_INVOKE, &priv->regs_t->ctrl_start);
336 rc = tpm_crb_smc_start(&chip->dev, priv->smc_func_id); 342 rc = tpm_crb_smc_start(&chip->dev, priv->smc_func_id);
337 } 343 }
@@ -345,7 +351,9 @@ static void crb_cancel(struct tpm_chip *chip)
345 351
346 iowrite32(CRB_CANCEL_INVOKE, &priv->regs_t->ctrl_cancel); 352 iowrite32(CRB_CANCEL_INVOKE, &priv->regs_t->ctrl_cancel);
347 353
348 if ((priv->flags & CRB_FL_ACPI_START) && crb_do_acpi_start(chip)) 354 if (((priv->sm == ACPI_TPM2_START_METHOD) ||
355 (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD)) &&
356 crb_do_acpi_start(chip))
349 dev_err(&chip->dev, "ACPI Start failed\n"); 357 dev_err(&chip->dev, "ACPI Start failed\n");
350} 358}
351 359
@@ -458,7 +466,8 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
458 * the control area, as one nice sane region except for some older 466 * the control area, as one nice sane region except for some older
459 * stuff that puts the control area outside the ACPI IO region. 467 * stuff that puts the control area outside the ACPI IO region.
460 */ 468 */
461 if (!(priv->flags & CRB_FL_ACPI_START)) { 469 if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
470 (priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
462 if (buf->control_address == io_res.start + 471 if (buf->control_address == io_res.start +
463 sizeof(*priv->regs_h)) 472 sizeof(*priv->regs_h))
464 priv->regs_h = priv->iobase; 473 priv->regs_h = priv->iobase;
@@ -552,18 +561,6 @@ static int crb_acpi_add(struct acpi_device *device)
552 if (!priv) 561 if (!priv)
553 return -ENOMEM; 562 return -ENOMEM;
554 563
555 /* The reason for the extra quirk is that the PTT in 4th Gen Core CPUs
556 * report only ACPI start but in practice seems to require both
557 * ACPI start and CRB start.
558 */
559 if (sm == ACPI_TPM2_COMMAND_BUFFER || sm == ACPI_TPM2_MEMORY_MAPPED ||
560 !strcmp(acpi_device_hid(device), "MSFT0101"))
561 priv->flags |= CRB_FL_CRB_START;
562
563 if (sm == ACPI_TPM2_START_METHOD ||
564 sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD)
565 priv->flags |= CRB_FL_ACPI_START;
566
567 if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) { 564 if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) {
568 if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) { 565 if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) {
569 dev_err(dev, 566 dev_err(dev,
@@ -574,9 +571,11 @@ static int crb_acpi_add(struct acpi_device *device)
574 } 571 }
575 crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf, sizeof(*buf)); 572 crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf, sizeof(*buf));
576 priv->smc_func_id = crb_smc->smc_func_id; 573 priv->smc_func_id = crb_smc->smc_func_id;
577 priv->flags |= CRB_FL_CRB_SMC_START;
578 } 574 }
579 575
576 priv->sm = sm;
577 priv->hid = acpi_device_hid(device);
578
580 rc = crb_map_io(device, priv, buf); 579 rc = crb_map_io(device, priv, buf);
581 if (rc) 580 if (rc)
582 return rc; 581 return rc;
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
index 7e55aa9ce680..e2d1055fb814 100644
--- a/drivers/char/tpm/tpm_tis.c
+++ b/drivers/char/tpm/tpm_tis.c
@@ -30,6 +30,7 @@
30#include <linux/freezer.h> 30#include <linux/freezer.h>
31#include <linux/of.h> 31#include <linux/of.h>
32#include <linux/of_device.h> 32#include <linux/of_device.h>
33#include <linux/kernel.h>
33#include "tpm.h" 34#include "tpm.h"
34#include "tpm_tis_core.h" 35#include "tpm_tis_core.h"
35 36
@@ -223,7 +224,7 @@ static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
223} 224}
224 225
225static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, 226static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
226 u8 *value) 227 const u8 *value)
227{ 228{
228 struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); 229 struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
229 230
@@ -365,7 +366,7 @@ static struct pnp_driver tis_pnp_driver = {
365 }, 366 },
366}; 367};
367 368
368#define TIS_HID_USR_IDX sizeof(tpm_pnp_tbl)/sizeof(struct pnp_device_id) -2 369#define TIS_HID_USR_IDX (ARRAY_SIZE(tpm_pnp_tbl) - 2)
369module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id, 370module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id,
370 sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444); 371 sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444);
371MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe"); 372MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe");
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 63bc6c3b949e..fdde971bc810 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -252,7 +252,7 @@ out:
252 * tpm.c can skip polling for the data to be available as the interrupt is 252 * tpm.c can skip polling for the data to be available as the interrupt is
253 * waited for here 253 * waited for here
254 */ 254 */
255static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) 255static int tpm_tis_send_data(struct tpm_chip *chip, const u8 *buf, size_t len)
256{ 256{
257 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); 257 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
258 int rc, status, burstcnt; 258 int rc, status, burstcnt;
@@ -343,7 +343,7 @@ static void disable_interrupts(struct tpm_chip *chip)
343 * tpm.c can skip polling for the data to be available as the interrupt is 343 * tpm.c can skip polling for the data to be available as the interrupt is
344 * waited for here 344 * waited for here
345 */ 345 */
346static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len) 346static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
347{ 347{
348 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); 348 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
349 int rc; 349 int rc;
@@ -445,7 +445,7 @@ static int probe_itpm(struct tpm_chip *chip)
445{ 445{
446 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); 446 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
447 int rc = 0; 447 int rc = 0;
448 u8 cmd_getticks[] = { 448 static const u8 cmd_getticks[] = {
449 0x00, 0xc1, 0x00, 0x00, 0x00, 0x0a, 449 0x00, 0xc1, 0x00, 0x00, 0x00, 0x0a,
450 0x00, 0x00, 0x00, 0xf1 450 0x00, 0x00, 0x00, 0xf1
451 }; 451 };
diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
index e2212f021a02..6bbac319ff3b 100644
--- a/drivers/char/tpm/tpm_tis_core.h
+++ b/drivers/char/tpm/tpm_tis_core.h
@@ -98,7 +98,7 @@ struct tpm_tis_phy_ops {
98 int (*read_bytes)(struct tpm_tis_data *data, u32 addr, u16 len, 98 int (*read_bytes)(struct tpm_tis_data *data, u32 addr, u16 len,
99 u8 *result); 99 u8 *result);
100 int (*write_bytes)(struct tpm_tis_data *data, u32 addr, u16 len, 100 int (*write_bytes)(struct tpm_tis_data *data, u32 addr, u16 len,
101 u8 *value); 101 const u8 *value);
102 int (*read16)(struct tpm_tis_data *data, u32 addr, u16 *result); 102 int (*read16)(struct tpm_tis_data *data, u32 addr, u16 *result);
103 int (*read32)(struct tpm_tis_data *data, u32 addr, u32 *result); 103 int (*read32)(struct tpm_tis_data *data, u32 addr, u32 *result);
104 int (*write32)(struct tpm_tis_data *data, u32 addr, u32 src); 104 int (*write32)(struct tpm_tis_data *data, u32 addr, u32 src);
@@ -128,7 +128,7 @@ static inline int tpm_tis_read32(struct tpm_tis_data *data, u32 addr,
128} 128}
129 129
130static inline int tpm_tis_write_bytes(struct tpm_tis_data *data, u32 addr, 130static inline int tpm_tis_write_bytes(struct tpm_tis_data *data, u32 addr,
131 u16 len, u8 *value) 131 u16 len, const u8 *value)
132{ 132{
133 return data->phy_ops->write_bytes(data, addr, len, value); 133 return data->phy_ops->write_bytes(data, addr, len, value);
134} 134}
diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
index 88fe72ae967f..424ff2fde1f2 100644
--- a/drivers/char/tpm/tpm_tis_spi.c
+++ b/drivers/char/tpm/tpm_tis_spi.c
@@ -46,9 +46,7 @@
46struct tpm_tis_spi_phy { 46struct tpm_tis_spi_phy {
47 struct tpm_tis_data priv; 47 struct tpm_tis_data priv;
48 struct spi_device *spi_device; 48 struct spi_device *spi_device;
49 49 u8 *iobuf;
50 u8 tx_buf[4];
51 u8 rx_buf[4];
52}; 50};
53 51
54static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *data) 52static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *data)
@@ -57,7 +55,7 @@ static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *da
57} 55}
58 56
59static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len, 57static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
60 u8 *buffer, u8 direction) 58 u8 *in, const u8 *out)
61{ 59{
62 struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data); 60 struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
63 int ret = 0; 61 int ret = 0;
@@ -71,14 +69,14 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
71 while (len) { 69 while (len) {
72 transfer_len = min_t(u16, len, MAX_SPI_FRAMESIZE); 70 transfer_len = min_t(u16, len, MAX_SPI_FRAMESIZE);
73 71
74 phy->tx_buf[0] = direction | (transfer_len - 1); 72 phy->iobuf[0] = (in ? 0x80 : 0) | (transfer_len - 1);
75 phy->tx_buf[1] = 0xd4; 73 phy->iobuf[1] = 0xd4;
76 phy->tx_buf[2] = addr >> 8; 74 phy->iobuf[2] = addr >> 8;
77 phy->tx_buf[3] = addr; 75 phy->iobuf[3] = addr;
78 76
79 memset(&spi_xfer, 0, sizeof(spi_xfer)); 77 memset(&spi_xfer, 0, sizeof(spi_xfer));
80 spi_xfer.tx_buf = phy->tx_buf; 78 spi_xfer.tx_buf = phy->iobuf;
81 spi_xfer.rx_buf = phy->rx_buf; 79 spi_xfer.rx_buf = phy->iobuf;
82 spi_xfer.len = 4; 80 spi_xfer.len = 4;
83 spi_xfer.cs_change = 1; 81 spi_xfer.cs_change = 1;
84 82
@@ -88,9 +86,9 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
88 if (ret < 0) 86 if (ret < 0)
89 goto exit; 87 goto exit;
90 88
91 if ((phy->rx_buf[3] & 0x01) == 0) { 89 if ((phy->iobuf[3] & 0x01) == 0) {
92 // handle SPI wait states 90 // handle SPI wait states
93 phy->tx_buf[0] = 0; 91 phy->iobuf[0] = 0;
94 92
95 for (i = 0; i < TPM_RETRY; i++) { 93 for (i = 0; i < TPM_RETRY; i++) {
96 spi_xfer.len = 1; 94 spi_xfer.len = 1;
@@ -99,7 +97,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
99 ret = spi_sync_locked(phy->spi_device, &m); 97 ret = spi_sync_locked(phy->spi_device, &m);
100 if (ret < 0) 98 if (ret < 0)
101 goto exit; 99 goto exit;
102 if (phy->rx_buf[0] & 0x01) 100 if (phy->iobuf[0] & 0x01)
103 break; 101 break;
104 } 102 }
105 103
@@ -113,12 +111,12 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
113 spi_xfer.len = transfer_len; 111 spi_xfer.len = transfer_len;
114 spi_xfer.delay_usecs = 5; 112 spi_xfer.delay_usecs = 5;
115 113
116 if (direction) { 114 if (in) {
117 spi_xfer.tx_buf = NULL; 115 spi_xfer.tx_buf = NULL;
118 spi_xfer.rx_buf = buffer; 116 } else if (out) {
119 } else {
120 spi_xfer.tx_buf = buffer;
121 spi_xfer.rx_buf = NULL; 117 spi_xfer.rx_buf = NULL;
118 memcpy(phy->iobuf, out, transfer_len);
119 out += transfer_len;
122 } 120 }
123 121
124 spi_message_init(&m); 122 spi_message_init(&m);
@@ -127,8 +125,12 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
127 if (ret < 0) 125 if (ret < 0)
128 goto exit; 126 goto exit;
129 127
128 if (in) {
129 memcpy(in, phy->iobuf, transfer_len);
130 in += transfer_len;
131 }
132
130 len -= transfer_len; 133 len -= transfer_len;
131 buffer += transfer_len;
132 } 134 }
133 135
134exit: 136exit:
@@ -139,40 +141,51 @@ exit:
139static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr, 141static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
140 u16 len, u8 *result) 142 u16 len, u8 *result)
141{ 143{
142 return tpm_tis_spi_transfer(data, addr, len, result, 0x80); 144 return tpm_tis_spi_transfer(data, addr, len, result, NULL);
143} 145}
144 146
145static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr, 147static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
146 u16 len, u8 *value) 148 u16 len, const u8 *value)
147{ 149{
148 return tpm_tis_spi_transfer(data, addr, len, value, 0); 150 return tpm_tis_spi_transfer(data, addr, len, NULL, value);
149} 151}
150 152
151static int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result) 153static int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
152{ 154{
155 __le16 result_le;
153 int rc; 156 int rc;
154 157
155 rc = data->phy_ops->read_bytes(data, addr, sizeof(u16), (u8 *)result); 158 rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
159 (u8 *)&result_le);
156 if (!rc) 160 if (!rc)
157 *result = le16_to_cpu(*result); 161 *result = le16_to_cpu(result_le);
162
158 return rc; 163 return rc;
159} 164}
160 165
161static int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result) 166static int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result)
162{ 167{
168 __le32 result_le;
163 int rc; 169 int rc;
164 170
165 rc = data->phy_ops->read_bytes(data, addr, sizeof(u32), (u8 *)result); 171 rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
172 (u8 *)&result_le);
166 if (!rc) 173 if (!rc)
167 *result = le32_to_cpu(*result); 174 *result = le32_to_cpu(result_le);
175
168 return rc; 176 return rc;
169} 177}
170 178
171static int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value) 179static int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value)
172{ 180{
173 value = cpu_to_le32(value); 181 __le32 value_le;
174 return data->phy_ops->write_bytes(data, addr, sizeof(u32), 182 int rc;
175 (u8 *)&value); 183
184 value_le = cpu_to_le32(value);
185 rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
186 (u8 *)&value_le);
187
188 return rc;
176} 189}
177 190
178static const struct tpm_tis_phy_ops tpm_spi_phy_ops = { 191static const struct tpm_tis_phy_ops tpm_spi_phy_ops = {
@@ -194,6 +207,10 @@ static int tpm_tis_spi_probe(struct spi_device *dev)
194 207
195 phy->spi_device = dev; 208 phy->spi_device = dev;
196 209
210 phy->iobuf = devm_kmalloc(&dev->dev, MAX_SPI_FRAMESIZE, GFP_KERNEL);
211 if (!phy->iobuf)
212 return -ENOMEM;
213
197 return tpm_tis_core_init(&dev->dev, &phy->priv, -1, &tpm_spi_phy_ops, 214 return tpm_tis_core_init(&dev->dev, &phy->priv, -1, &tpm_spi_phy_ops,
198 NULL); 215 NULL);
199} 216}
diff --git a/security/commoncap.c b/security/commoncap.c
index fc46f5b85251..4f8e09340956 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -536,7 +536,7 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size)
536static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps, 536static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
537 struct linux_binprm *bprm, 537 struct linux_binprm *bprm,
538 bool *effective, 538 bool *effective,
539 bool *has_cap) 539 bool *has_fcap)
540{ 540{
541 struct cred *new = bprm->cred; 541 struct cred *new = bprm->cred;
542 unsigned i; 542 unsigned i;
@@ -546,7 +546,7 @@ static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
546 *effective = true; 546 *effective = true;
547 547
548 if (caps->magic_etc & VFS_CAP_REVISION_MASK) 548 if (caps->magic_etc & VFS_CAP_REVISION_MASK)
549 *has_cap = true; 549 *has_fcap = true;
550 550
551 CAP_FOR_EACH_U32(i) { 551 CAP_FOR_EACH_U32(i) {
552 __u32 permitted = caps->permitted.cap[i]; 552 __u32 permitted = caps->permitted.cap[i];
@@ -653,7 +653,7 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data
653 * its xattrs and, if present, apply them to the proposed credentials being 653 * its xattrs and, if present, apply them to the proposed credentials being
654 * constructed by execve(). 654 * constructed by execve().
655 */ 655 */
656static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_cap) 656static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_fcap)
657{ 657{
658 int rc = 0; 658 int rc = 0;
659 struct cpu_vfs_cap_data vcaps; 659 struct cpu_vfs_cap_data vcaps;
@@ -684,7 +684,7 @@ static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_c
684 goto out; 684 goto out;
685 } 685 }
686 686
687 rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_cap); 687 rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_fcap);
688 if (rc == -EINVAL) 688 if (rc == -EINVAL)
689 printk(KERN_NOTICE "%s: cap_from_disk returned %d for %s\n", 689 printk(KERN_NOTICE "%s: cap_from_disk returned %d for %s\n",
690 __func__, rc, bprm->filename); 690 __func__, rc, bprm->filename);
@@ -696,6 +696,115 @@ out:
696 return rc; 696 return rc;
697} 697}
698 698
699static inline bool root_privileged(void) { return !issecure(SECURE_NOROOT); }
700
701static inline bool __is_real(kuid_t uid, struct cred *cred)
702{ return uid_eq(cred->uid, uid); }
703
704static inline bool __is_eff(kuid_t uid, struct cred *cred)
705{ return uid_eq(cred->euid, uid); }
706
707static inline bool __is_suid(kuid_t uid, struct cred *cred)
708{ return !__is_real(uid, cred) && __is_eff(uid, cred); }
709
710/*
711 * handle_privileged_root - Handle case of privileged root
712 * @bprm: The execution parameters, including the proposed creds
713 * @has_fcap: Are any file capabilities set?
714 * @effective: Do we have effective root privilege?
715 * @root_uid: This namespace' root UID WRT initial USER namespace
716 *
717 * Handle the case where root is privileged and hasn't been neutered by
718 * SECURE_NOROOT. If file capabilities are set, they won't be combined with
719 * set UID root and nothing is changed. If we are root, cap_permitted is
720 * updated. If we have become set UID root, the effective bit is set.
721 */
722static void handle_privileged_root(struct linux_binprm *bprm, bool has_fcap,
723 bool *effective, kuid_t root_uid)
724{
725 const struct cred *old = current_cred();
726 struct cred *new = bprm->cred;
727
728 if (!root_privileged())
729 return;
730 /*
731 * If the legacy file capability is set, then don't set privs
732 * for a setuid root binary run by a non-root user. Do set it
733 * for a root user just to cause least surprise to an admin.
734 */
735 if (has_fcap && __is_suid(root_uid, new)) {
736 warn_setuid_and_fcaps_mixed(bprm->filename);
737 return;
738 }
739 /*
740 * To support inheritance of root-permissions and suid-root
741 * executables under compatibility mode, we override the
742 * capability sets for the file.
743 */
744 if (__is_eff(root_uid, new) || __is_real(root_uid, new)) {
745 /* pP' = (cap_bset & ~0) | (pI & ~0) */
746 new->cap_permitted = cap_combine(old->cap_bset,
747 old->cap_inheritable);
748 }
749 /*
750 * If only the real uid is 0, we do not set the effective bit.
751 */
752 if (__is_eff(root_uid, new))
753 *effective = true;
754}
755
756#define __cap_gained(field, target, source) \
757 !cap_issubset(target->cap_##field, source->cap_##field)
758#define __cap_grew(target, source, cred) \
759 !cap_issubset(cred->cap_##target, cred->cap_##source)
760#define __cap_full(field, cred) \
761 cap_issubset(CAP_FULL_SET, cred->cap_##field)
762
763static inline bool __is_setuid(struct cred *new, const struct cred *old)
764{ return !uid_eq(new->euid, old->uid); }
765
766static inline bool __is_setgid(struct cred *new, const struct cred *old)
767{ return !gid_eq(new->egid, old->gid); }
768
769/*
770 * 1) Audit candidate if current->cap_effective is set
771 *
772 * We do not bother to audit if 3 things are true:
773 * 1) cap_effective has all caps
774 * 2) we became root *OR* are were already root
775 * 3) root is supposed to have all caps (SECURE_NOROOT)
776 * Since this is just a normal root execing a process.
777 *
778 * Number 1 above might fail if you don't have a full bset, but I think
779 * that is interesting information to audit.
780 *
781 * A number of other conditions require logging:
782 * 2) something prevented setuid root getting all caps
783 * 3) non-setuid root gets fcaps
784 * 4) non-setuid root gets ambient
785 */
786static inline bool nonroot_raised_pE(struct cred *new, const struct cred *old,
787 kuid_t root, bool has_fcap)
788{
789 bool ret = false;
790
791 if ((__cap_grew(effective, ambient, new) &&
792 !(__cap_full(effective, new) &&
793 (__is_eff(root, new) || __is_real(root, new)) &&
794 root_privileged())) ||
795 (root_privileged() &&
796 __is_suid(root, new) &&
797 !__cap_full(effective, new)) ||
798 (!__is_setuid(new, old) &&
799 ((has_fcap &&
800 __cap_gained(permitted, new, old)) ||
801 __cap_gained(ambient, new, old))))
802
803 ret = true;
804
805 return ret;
806}
807
699/** 808/**
700 * cap_bprm_set_creds - Set up the proposed credentials for execve(). 809 * cap_bprm_set_creds - Set up the proposed credentials for execve().
701 * @bprm: The execution parameters, including the proposed creds 810 * @bprm: The execution parameters, including the proposed creds
@@ -708,61 +817,33 @@ int cap_bprm_set_creds(struct linux_binprm *bprm)
708{ 817{
709 const struct cred *old = current_cred(); 818 const struct cred *old = current_cred();
710 struct cred *new = bprm->cred; 819 struct cred *new = bprm->cred;
711 bool effective, has_cap = false, is_setid; 820 bool effective = false, has_fcap = false, is_setid;
712 int ret; 821 int ret;
713 kuid_t root_uid; 822 kuid_t root_uid;
714 823
715 if (WARN_ON(!cap_ambient_invariant_ok(old))) 824 if (WARN_ON(!cap_ambient_invariant_ok(old)))
716 return -EPERM; 825 return -EPERM;
717 826
718 effective = false; 827 ret = get_file_caps(bprm, &effective, &has_fcap);
719 ret = get_file_caps(bprm, &effective, &has_cap);
720 if (ret < 0) 828 if (ret < 0)
721 return ret; 829 return ret;
722 830
723 root_uid = make_kuid(new->user_ns, 0); 831 root_uid = make_kuid(new->user_ns, 0);
724 832
725 if (!issecure(SECURE_NOROOT)) { 833 handle_privileged_root(bprm, has_fcap, &effective, root_uid);
726 /*
727 * If the legacy file capability is set, then don't set privs
728 * for a setuid root binary run by a non-root user. Do set it
729 * for a root user just to cause least surprise to an admin.
730 */
731 if (has_cap && !uid_eq(new->uid, root_uid) && uid_eq(new->euid, root_uid)) {
732 warn_setuid_and_fcaps_mixed(bprm->filename);
733 goto skip;
734 }
735 /*
736 * To support inheritance of root-permissions and suid-root
737 * executables under compatibility mode, we override the
738 * capability sets for the file.
739 *
740 * If only the real uid is 0, we do not set the effective bit.
741 */
742 if (uid_eq(new->euid, root_uid) || uid_eq(new->uid, root_uid)) {
743 /* pP' = (cap_bset & ~0) | (pI & ~0) */
744 new->cap_permitted = cap_combine(old->cap_bset,
745 old->cap_inheritable);
746 }
747 if (uid_eq(new->euid, root_uid))
748 effective = true;
749 }
750skip:
751 834
752 /* if we have fs caps, clear dangerous personality flags */ 835 /* if we have fs caps, clear dangerous personality flags */
753 if (!cap_issubset(new->cap_permitted, old->cap_permitted)) 836 if (__cap_gained(permitted, new, old))
754 bprm->per_clear |= PER_CLEAR_ON_SETID; 837 bprm->per_clear |= PER_CLEAR_ON_SETID;
755 838
756
757 /* Don't let someone trace a set[ug]id/setpcap binary with the revised 839 /* Don't let someone trace a set[ug]id/setpcap binary with the revised
758 * credentials unless they have the appropriate permit. 840 * credentials unless they have the appropriate permit.
759 * 841 *
760 * In addition, if NO_NEW_PRIVS, then ensure we get no new privs. 842 * In addition, if NO_NEW_PRIVS, then ensure we get no new privs.
761 */ 843 */
762 is_setid = !uid_eq(new->euid, old->uid) || !gid_eq(new->egid, old->gid); 844 is_setid = __is_setuid(new, old) || __is_setgid(new, old);
763 845
764 if ((is_setid || 846 if ((is_setid || __cap_gained(permitted, new, old)) &&
765 !cap_issubset(new->cap_permitted, old->cap_permitted)) &&
766 ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) || 847 ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) ||
767 !ptracer_capable(current, new->user_ns))) { 848 !ptracer_capable(current, new->user_ns))) {
768 /* downgrade; they get no more than they had, and maybe less */ 849 /* downgrade; they get no more than they had, and maybe less */
@@ -779,7 +860,7 @@ skip:
779 new->sgid = new->fsgid = new->egid; 860 new->sgid = new->fsgid = new->egid;
780 861
781 /* File caps or setid cancels ambient. */ 862 /* File caps or setid cancels ambient. */
782 if (has_cap || is_setid) 863 if (has_fcap || is_setid)
783 cap_clear(new->cap_ambient); 864 cap_clear(new->cap_ambient);
784 865
785 /* 866 /*
@@ -800,26 +881,10 @@ skip:
800 if (WARN_ON(!cap_ambient_invariant_ok(new))) 881 if (WARN_ON(!cap_ambient_invariant_ok(new)))
801 return -EPERM; 882 return -EPERM;
802 883
803 /* 884 if (nonroot_raised_pE(new, old, root_uid, has_fcap)) {
804 * Audit candidate if current->cap_effective is set 885 ret = audit_log_bprm_fcaps(bprm, new, old);
805 * 886 if (ret < 0)
806 * We do not bother to audit if 3 things are true: 887 return ret;
807 * 1) cap_effective has all caps
808 * 2) we are root
809 * 3) root is supposed to have all caps (SECURE_NOROOT)
810 * Since this is just a normal root execing a process.
811 *
812 * Number 1 above might fail if you don't have a full bset, but I think
813 * that is interesting information to audit.
814 */
815 if (!cap_issubset(new->cap_effective, new->cap_ambient)) {
816 if (!cap_issubset(CAP_FULL_SET, new->cap_effective) ||
817 !uid_eq(new->euid, root_uid) || !uid_eq(new->uid, root_uid) ||
818 issecure(SECURE_NOROOT)) {
819 ret = audit_log_bprm_fcaps(bprm, new, old);
820 if (ret < 0)
821 return ret;
822 }
823 } 888 }
824 889
825 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS); 890 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
@@ -829,13 +894,11 @@ skip:
829 894
830 /* Check for privilege-elevated exec. */ 895 /* Check for privilege-elevated exec. */
831 bprm->cap_elevated = 0; 896 bprm->cap_elevated = 0;
832 if (is_setid) { 897 if (is_setid ||
898 (!__is_real(root_uid, new) &&
899 (effective ||
900 __cap_grew(permitted, ambient, new))))
833 bprm->cap_elevated = 1; 901 bprm->cap_elevated = 1;
834 } else if (!uid_eq(new->uid, root_uid)) {
835 if (effective ||
836 !cap_issubset(new->cap_permitted, new->cap_ambient))
837 bprm->cap_elevated = 1;
838 }
839 902
840 return 0; 903 return 0;
841} 904}
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index 286171a16ed2..14cc7940b36d 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -4600,6 +4600,82 @@ static int smack_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
4600 return 0; 4600 return 0;
4601} 4601}
4602 4602
4603static int smack_inode_copy_up(struct dentry *dentry, struct cred **new)
4604{
4605
4606 struct task_smack *tsp;
4607 struct smack_known *skp;
4608 struct inode_smack *isp;
4609 struct cred *new_creds = *new;
4610
4611 if (new_creds == NULL) {
4612 new_creds = prepare_creds();
4613 if (new_creds == NULL)
4614 return -ENOMEM;
4615 }
4616
4617 tsp = new_creds->security;
4618
4619 /*
4620 * Get label from overlay inode and set it in create_sid
4621 */
4622 isp = d_inode(dentry->d_parent)->i_security;
4623 skp = isp->smk_inode;
4624 tsp->smk_task = skp;
4625 *new = new_creds;
4626 return 0;
4627}
4628
4629static int smack_inode_copy_up_xattr(const char *name)
4630{
4631 /*
4632 * Return 1 if this is the smack access Smack attribute.
4633 */
4634 if (strcmp(name, XATTR_NAME_SMACK) == 0)
4635 return 1;
4636
4637 return -EOPNOTSUPP;
4638}
4639
4640static int smack_dentry_create_files_as(struct dentry *dentry, int mode,
4641 struct qstr *name,
4642 const struct cred *old,
4643 struct cred *new)
4644{
4645 struct task_smack *otsp = old->security;
4646 struct task_smack *ntsp = new->security;
4647 struct inode_smack *isp;
4648 int may;
4649
4650 /*
4651 * Use the process credential unless all of
4652 * the transmuting criteria are met
4653 */
4654 ntsp->smk_task = otsp->smk_task;
4655
4656 /*
4657 * the attribute of the containing directory
4658 */
4659 isp = d_inode(dentry->d_parent)->i_security;
4660
4661 if (isp->smk_flags & SMK_INODE_TRANSMUTE) {
4662 rcu_read_lock();
4663 may = smk_access_entry(otsp->smk_task->smk_known,
4664 isp->smk_inode->smk_known,
4665 &otsp->smk_task->smk_rules);
4666 rcu_read_unlock();
4667
4668 /*
4669 * If the directory is transmuting and the rule
4670 * providing access is transmuting use the containing
4671 * directory label instead of the process label.
4672 */
4673 if (may > 0 && (may & MAY_TRANSMUTE))
4674 ntsp->smk_task = isp->smk_inode;
4675 }
4676 return 0;
4677}
4678
4603static struct security_hook_list smack_hooks[] __lsm_ro_after_init = { 4679static struct security_hook_list smack_hooks[] __lsm_ro_after_init = {
4604 LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), 4680 LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check),
4605 LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), 4681 LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme),
@@ -4735,6 +4811,9 @@ static struct security_hook_list smack_hooks[] __lsm_ro_after_init = {
4735 LSM_HOOK_INIT(inode_notifysecctx, smack_inode_notifysecctx), 4811 LSM_HOOK_INIT(inode_notifysecctx, smack_inode_notifysecctx),
4736 LSM_HOOK_INIT(inode_setsecctx, smack_inode_setsecctx), 4812 LSM_HOOK_INIT(inode_setsecctx, smack_inode_setsecctx),
4737 LSM_HOOK_INIT(inode_getsecctx, smack_inode_getsecctx), 4813 LSM_HOOK_INIT(inode_getsecctx, smack_inode_getsecctx),
4814 LSM_HOOK_INIT(inode_copy_up, smack_inode_copy_up),
4815 LSM_HOOK_INIT(inode_copy_up_xattr, smack_inode_copy_up_xattr),
4816 LSM_HOOK_INIT(dentry_create_files_as, smack_dentry_create_files_as),
4738}; 4817};
4739 4818
4740 4819
diff --git a/security/tomoyo/audit.c b/security/tomoyo/audit.c
index d330b060dcff..0f73fe30e37a 100644
--- a/security/tomoyo/audit.c
+++ b/security/tomoyo/audit.c
@@ -157,7 +157,7 @@ static char *tomoyo_print_header(struct tomoyo_request_info *r)
157 if (!buffer) 157 if (!buffer)
158 return NULL; 158 return NULL;
159 159
160 tomoyo_convert_time(get_seconds(), &stamp); 160 tomoyo_convert_time(ktime_get_real_seconds(), &stamp);
161 161
162 pos = snprintf(buffer, tomoyo_buffer_len - 1, 162 pos = snprintf(buffer, tomoyo_buffer_len - 1,
163 "#%04u/%02u/%02u %02u:%02u:%02u# profile=%u mode=%s " 163 "#%04u/%02u/%02u %02u:%02u:%02u# profile=%u mode=%s "
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
index 21691b99e61f..25eed4b0b0e8 100644
--- a/security/tomoyo/common.c
+++ b/security/tomoyo/common.c
@@ -2257,7 +2257,7 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = {
2257/* Timestamp counter for last updated. */ 2257/* Timestamp counter for last updated. */
2258static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; 2258static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT];
2259/* Counter for number of updates. */ 2259/* Counter for number of updates. */
2260static unsigned int tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; 2260static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT];
2261 2261
2262/** 2262/**
2263 * tomoyo_update_stat - Update statistic counters. 2263 * tomoyo_update_stat - Update statistic counters.
@@ -2272,7 +2272,7 @@ void tomoyo_update_stat(const u8 index)
2272 * I don't use atomic operations because race condition is not fatal. 2272 * I don't use atomic operations because race condition is not fatal.
2273 */ 2273 */
2274 tomoyo_stat_updated[index]++; 2274 tomoyo_stat_updated[index]++;
2275 tomoyo_stat_modified[index] = get_seconds(); 2275 tomoyo_stat_modified[index] = ktime_get_real_seconds();
2276} 2276}
2277 2277
2278/** 2278/**
diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h
index e4097d7994b1..7adccdd8e36d 100644
--- a/security/tomoyo/common.h
+++ b/security/tomoyo/common.h
@@ -1037,7 +1037,7 @@ void tomoyo_check_acl(struct tomoyo_request_info *r,
1037 bool (*check_entry) (struct tomoyo_request_info *, 1037 bool (*check_entry) (struct tomoyo_request_info *,
1038 const struct tomoyo_acl_info *)); 1038 const struct tomoyo_acl_info *));
1039void tomoyo_check_profile(void); 1039void tomoyo_check_profile(void);
1040void tomoyo_convert_time(time_t time, struct tomoyo_time *stamp); 1040void tomoyo_convert_time(time64_t time, struct tomoyo_time *stamp);
1041void tomoyo_del_condition(struct list_head *element); 1041void tomoyo_del_condition(struct list_head *element);
1042void tomoyo_fill_path_info(struct tomoyo_path_info *ptr); 1042void tomoyo_fill_path_info(struct tomoyo_path_info *ptr);
1043void tomoyo_get_attributes(struct tomoyo_obj_info *obj); 1043void tomoyo_get_attributes(struct tomoyo_obj_info *obj);
diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c
index 580b318910f1..d3d9d9f1edb0 100644
--- a/security/tomoyo/util.c
+++ b/security/tomoyo/util.c
@@ -87,38 +87,17 @@ const u8 tomoyo_index2category[TOMOYO_MAX_MAC_INDEX] = {
87 * @stamp: Pointer to "struct tomoyo_time". 87 * @stamp: Pointer to "struct tomoyo_time".
88 * 88 *
89 * Returns nothing. 89 * Returns nothing.
90 *
91 * This function does not handle Y2038 problem.
92 */ 90 */
93void tomoyo_convert_time(time_t time, struct tomoyo_time *stamp) 91void tomoyo_convert_time(time64_t time64, struct tomoyo_time *stamp)
94{ 92{
95 static const u16 tomoyo_eom[2][12] = { 93 struct tm tm;
96 { 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, 94 time64_to_tm(time64, 0, &tm);
97 { 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } 95 stamp->sec = tm.tm_sec;
98 }; 96 stamp->min = tm.tm_min;
99 u16 y; 97 stamp->hour = tm.tm_hour;
100 u8 m; 98 stamp->day = tm.tm_mday;
101 bool r; 99 stamp->month = tm.tm_mon + 1;
102 stamp->sec = time % 60; 100 stamp->year = tm.tm_year + 1900;
103 time /= 60;
104 stamp->min = time % 60;
105 time /= 60;
106 stamp->hour = time % 24;
107 time /= 24;
108 for (y = 1970; ; y++) {
109 const unsigned short days = (y & 3) ? 365 : 366;
110 if (time < days)
111 break;
112 time -= days;
113 }
114 r = (y & 3) == 0;
115 for (m = 0; m < 11 && time >= tomoyo_eom[r][m]; m++)
116 ;
117 if (m)
118 time -= tomoyo_eom[r][m - 1];
119 stamp->year = y;
120 stamp->month = ++m;
121 stamp->day = ++time;
122} 101}
123 102
124/** 103/**