Commit 2e1deaad authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security

Pull security subsystem update from James Morris:
 "Just some minor updates across the subsystem"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
  ima: eliminate passing d_name.name to process_measurement()
  TPM: Retry SaveState command in suspend path
  tpm/tpm_i2c_infineon: Add small comment about return value of __i2c_transfer
  tpm/tpm_i2c_infineon.c: Add OF attributes type and name to the of_device_id table entries
  tpm_i2c_stm_st33: Remove duplicate inclusion of header files
  tpm: Add support for new Infineon I2C TPM (SLB 9645 TT 1.2 I2C)
  char/tpm: Convert struct i2c_msg initialization to C99 format
  drivers/char/tpm/tpm_ppi: use strlcpy instead of strncpy
  tpm/tpm_i2c_stm_st33: formatting and white space changes
  Smack: include magic.h in smackfs.c
  selinux: make security_sb_clone_mnt_opts return an error on context mismatch
  seccomp: allow BPF_XOR based ALU instructions.
  Fix NULL pointer dereference in smack_inode_unlink() and smack_inode_rmdir()
  Smack: add support for modification of existing rules
  smack: SMACK_MAGIC to include/uapi/linux/magic.h
  Smack: add missing support for transmute bit in smack_str_from_perm()
  Smack: prevent revoke-subject from failing when unseen label is written to it
  tomoyo: use DEFINE_SRCU() to define tomoyo_ss
  tomoyo: use DEFINE_SRCU() to define tomoyo_ss
parents 50528fab b7ae9f06
...@@ -35,6 +35,8 @@ fsl,mc13892 MC13892: Power Management Integrated Circuit (PMIC) for i.MX35/51 ...@@ -35,6 +35,8 @@ fsl,mc13892 MC13892: Power Management Integrated Circuit (PMIC) for i.MX35/51
fsl,mma8450 MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer fsl,mma8450 MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
fsl,mpr121 MPR121: Proximity Capacitive Touch Sensor Controller fsl,mpr121 MPR121: Proximity Capacitive Touch Sensor Controller
fsl,sgtl5000 SGTL5000: Ultra Low-Power Audio Codec fsl,sgtl5000 SGTL5000: Ultra Low-Power Audio Codec
infineon,slb9635tt Infineon SLB9635 (Soft-) I2C TPM (old protocol, max 100khz)
infineon,slb9645tt Infineon SLB9645 I2C TPM (new protocol, max 400khz)
maxim,ds1050 5 Bit Programmable, Pulse-Width Modulator maxim,ds1050 5 Bit Programmable, Pulse-Width Modulator
maxim,max1237 Low-Power, 4-/12-Channel, 2-Wire Serial, 12-Bit ADCs maxim,max1237 Low-Power, 4-/12-Channel, 2-Wire Serial, 12-Bit ADCs
maxim,max6625 9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface maxim,max6625 9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface
......
...@@ -117,6 +117,17 @@ access2 ...@@ -117,6 +117,17 @@ access2
ambient ambient
This contains the Smack label applied to unlabeled network This contains the Smack label applied to unlabeled network
packets. packets.
change-rule
This interface allows modification of existing access control rules.
The format accepted on write is:
"%s %s %s %s"
where the first string is the subject label, the second the
object label, the third the access to allow and the fourth the
access to deny. The access strings may contain only the characters
"rwxat-". If a rule for a given subject and object exists it will be
modified by enabling the permissions in the third string and disabling
those in the fourth string. If there is no such rule it will be
created using the access specified in the third and the fourth strings.
cipso cipso
This interface allows a specific CIPSO header to be assigned This interface allows a specific CIPSO header to be assigned
to a Smack label. The format accepted on write is: to a Smack label. The format accepted on write is:
......
...@@ -1337,7 +1337,7 @@ int tpm_pm_suspend(struct device *dev) ...@@ -1337,7 +1337,7 @@ int tpm_pm_suspend(struct device *dev)
{ {
struct tpm_chip *chip = dev_get_drvdata(dev); struct tpm_chip *chip = dev_get_drvdata(dev);
struct tpm_cmd_t cmd; struct tpm_cmd_t cmd;
int rc; int rc, try;
u8 dummy_hash[TPM_DIGEST_SIZE] = { 0 }; u8 dummy_hash[TPM_DIGEST_SIZE] = { 0 };
...@@ -1355,9 +1355,32 @@ int tpm_pm_suspend(struct device *dev) ...@@ -1355,9 +1355,32 @@ int tpm_pm_suspend(struct device *dev)
} }
/* now do the actual savestate */ /* now do the actual savestate */
cmd.header.in = savestate_header; for (try = 0; try < TPM_RETRY; try++) {
rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, cmd.header.in = savestate_header;
"sending savestate before suspend"); rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, NULL);
/*
* If the TPM indicates that it is too busy to respond to
* this command then retry before giving up. It can take
* several seconds for this TPM to be ready.
*
* This can happen if the TPM has already been sent the
* SaveState command before the driver has loaded. TCG 1.2
* specification states that any communication after SaveState
* may cause the TPM to invalidate previously saved state.
*/
if (rc != TPM_WARN_RETRY)
break;
msleep(TPM_TIMEOUT_RETRY);
}
if (rc)
dev_err(chip->dev,
"Error (%d) sending savestate before suspend\n", rc);
else if (try > 0)
dev_warn(chip->dev, "TPM savestate took %dms\n",
try * TPM_TIMEOUT_RETRY);
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(tpm_pm_suspend); EXPORT_SYMBOL_GPL(tpm_pm_suspend);
......
...@@ -32,10 +32,12 @@ enum tpm_const { ...@@ -32,10 +32,12 @@ enum tpm_const {
TPM_MINOR = 224, /* officially assigned */ TPM_MINOR = 224, /* officially assigned */
TPM_BUFSIZE = 4096, TPM_BUFSIZE = 4096,
TPM_NUM_DEVICES = 256, TPM_NUM_DEVICES = 256,
TPM_RETRY = 50, /* 5 seconds */
}; };
enum tpm_timeout { enum tpm_timeout {
TPM_TIMEOUT = 5, /* msecs */ TPM_TIMEOUT = 5, /* msecs */
TPM_TIMEOUT_RETRY = 100 /* msecs */
}; };
/* TPM addresses */ /* TPM addresses */
...@@ -44,6 +46,7 @@ enum tpm_addr { ...@@ -44,6 +46,7 @@ enum tpm_addr {
TPM_ADDR = 0x4E, TPM_ADDR = 0x4E,
}; };
#define TPM_WARN_RETRY 0x800
#define TPM_WARN_DOING_SELFTEST 0x802 #define TPM_WARN_DOING_SELFTEST 0x802
#define TPM_ERR_DEACTIVATED 0x6 #define TPM_ERR_DEACTIVATED 0x6
#define TPM_ERR_DISABLED 0x7 #define TPM_ERR_DISABLED 0x7
......
/* /*
* Copyright (C) 2012 Infineon Technologies * Copyright (C) 2012,2013 Infineon Technologies
* *
* Authors: * Authors:
* Peter Huewe <peter.huewe@infineon.com> * Peter Huewe <peter.huewe@infineon.com>
...@@ -56,13 +56,21 @@ ...@@ -56,13 +56,21 @@
#define TPM_TIMEOUT_US_HI (TPM_TIMEOUT_US_LOW + 2000) #define TPM_TIMEOUT_US_HI (TPM_TIMEOUT_US_LOW + 2000)
/* expected value for DIDVID register */ /* expected value for DIDVID register */
#define TPM_TIS_I2C_DID_VID 0x000b15d1L #define TPM_TIS_I2C_DID_VID_9635 0xd1150b00L
#define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
enum i2c_chip_type {
SLB9635,
SLB9645,
UNKNOWN,
};
/* Structure to store I2C TPM specific stuff */ /* Structure to store I2C TPM specific stuff */
struct tpm_inf_dev { struct tpm_inf_dev {
struct i2c_client *client; struct i2c_client *client;
u8 buf[TPM_BUFSIZE + sizeof(u8)]; /* max. buffer size + addr */ u8 buf[TPM_BUFSIZE + sizeof(u8)]; /* max. buffer size + addr */
struct tpm_chip *chip; struct tpm_chip *chip;
enum i2c_chip_type chip_type;
}; };
static struct tpm_inf_dev tpm_dev; static struct tpm_inf_dev tpm_dev;
...@@ -90,10 +98,20 @@ static struct i2c_driver tpm_tis_i2c_driver; ...@@ -90,10 +98,20 @@ static struct i2c_driver tpm_tis_i2c_driver;
static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
{ {
struct i2c_msg msg1 = { tpm_dev.client->addr, 0, 1, &addr }; struct i2c_msg msg1 = {
struct i2c_msg msg2 = { tpm_dev.client->addr, I2C_M_RD, len, buffer }; .addr = tpm_dev.client->addr,
.len = 1,
.buf = &addr
};
struct i2c_msg msg2 = {
.addr = tpm_dev.client->addr,
.flags = I2C_M_RD,
.len = len,
.buf = buffer
};
struct i2c_msg msgs[] = {msg1, msg2};
int rc; int rc = 0;
int count; int count;
/* Lock the adapter for the duration of the whole sequence. */ /* Lock the adapter for the duration of the whole sequence. */
...@@ -101,30 +119,53 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) ...@@ -101,30 +119,53 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
return -EOPNOTSUPP; return -EOPNOTSUPP;
i2c_lock_adapter(tpm_dev.client->adapter); i2c_lock_adapter(tpm_dev.client->adapter);
for (count = 0; count < MAX_COUNT; count++) { if (tpm_dev.chip_type == SLB9645) {
rc = __i2c_transfer(tpm_dev.client->adapter, &msg1, 1); /* use a combined read for newer chips
if (rc > 0) * unfortunately the smbus functions are not suitable due to
break; /* break here to skip sleep */ * the 32 byte limit of the smbus.
* retries should usually not be needed, but are kept just to
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI); * be on the safe side.
} */
for (count = 0; count < MAX_COUNT; count++) {
if (rc <= 0) rc = __i2c_transfer(tpm_dev.client->adapter, msgs, 2);
goto out; if (rc > 0)
break; /* break here to skip sleep */
/* After the TPM has successfully received the register address it needs usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
* some time, thus we're sleeping here again, before retrieving the data }
*/ } else {
for (count = 0; count < MAX_COUNT; count++) { /* slb9635 protocol should work in all cases */
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI); for (count = 0; count < MAX_COUNT; count++) {
rc = __i2c_transfer(tpm_dev.client->adapter, &msg2, 1); rc = __i2c_transfer(tpm_dev.client->adapter, &msg1, 1);
if (rc > 0) if (rc > 0)
break; break; /* break here to skip sleep */
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
}
if (rc <= 0)
goto out;
/* After the TPM has successfully received the register address
* it needs some time, thus we're sleeping here again, before
* retrieving the data
*/
for (count = 0; count < MAX_COUNT; count++) {
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
rc = __i2c_transfer(tpm_dev.client->adapter, &msg2, 1);
if (rc > 0)
break;
}
} }
out: out:
i2c_unlock_adapter(tpm_dev.client->adapter); i2c_unlock_adapter(tpm_dev.client->adapter);
/* take care of 'guard time' */
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
/* __i2c_transfer returns the number of successfully transferred
* messages.
* So rc should be greater than 0 here otherwise we have an error.
*/
if (rc <= 0) if (rc <= 0)
return -EIO; return -EIO;
...@@ -138,7 +179,11 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, ...@@ -138,7 +179,11 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
int rc = -EIO; int rc = -EIO;
int count; int count;
struct i2c_msg msg1 = { tpm_dev.client->addr, 0, len + 1, tpm_dev.buf }; struct i2c_msg msg1 = {
.addr = tpm_dev.client->addr,
.len = len + 1,
.buf = tpm_dev.buf
};
if (len > TPM_BUFSIZE) if (len > TPM_BUFSIZE)
return -EINVAL; return -EINVAL;
...@@ -154,16 +199,24 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, ...@@ -154,16 +199,24 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
/* /*
* NOTE: We have to use these special mechanisms here and unfortunately * NOTE: We have to use these special mechanisms here and unfortunately
* cannot rely on the standard behavior of i2c_transfer. * cannot rely on the standard behavior of i2c_transfer.
* Even for newer chips the smbus functions are not
* suitable due to the 32 byte limit of the smbus.
*/ */
for (count = 0; count < max_count; count++) { for (count = 0; count < max_count; count++) {
rc = __i2c_transfer(tpm_dev.client->adapter, &msg1, 1); rc = __i2c_transfer(tpm_dev.client->adapter, &msg1, 1);
if (rc > 0) if (rc > 0)
break; break;
usleep_range(sleep_low, sleep_hi); usleep_range(sleep_low, sleep_hi);
} }
i2c_unlock_adapter(tpm_dev.client->adapter); i2c_unlock_adapter(tpm_dev.client->adapter);
/* take care of 'guard time' */
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
/* __i2c_transfer returns the number of successfully transferred
* messages.
* So rc should be greater than 0 here otherwise we have an error.
*/
if (rc <= 0) if (rc <= 0)
return -EIO; return -EIO;
...@@ -283,11 +336,18 @@ static int request_locality(struct tpm_chip *chip, int loc) ...@@ -283,11 +336,18 @@ static int request_locality(struct tpm_chip *chip, int loc)
static u8 tpm_tis_i2c_status(struct tpm_chip *chip) static u8 tpm_tis_i2c_status(struct tpm_chip *chip)
{ {
/* NOTE: since I2C read may fail, return 0 in this case --> time-out */ /* NOTE: since I2C read may fail, return 0 in this case --> time-out */
u8 buf; u8 buf = 0xFF;
if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0) u8 i = 0;
return 0;
else do {
return buf; if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
return 0;
i++;
/* if locallity is set STS should not be 0xFF */
} while ((buf == 0xFF) && i < 10);
return buf;
} }
static void tpm_tis_i2c_ready(struct tpm_chip *chip) static void tpm_tis_i2c_ready(struct tpm_chip *chip)
...@@ -328,7 +388,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout, ...@@ -328,7 +388,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
/* check current status */ /* check current status */
*status = tpm_tis_i2c_status(chip); *status = tpm_tis_i2c_status(chip);
if ((*status & mask) == mask) if ((*status != 0xFF) && (*status & mask) == mask)
return 0; return 0;
stop = jiffies + timeout; stop = jiffies + timeout;
...@@ -372,7 +432,6 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) ...@@ -372,7 +432,6 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
/* avoid endless loop in case of broken HW */ /* avoid endless loop in case of broken HW */
if (retries > MAX_COUNT_LONG) if (retries > MAX_COUNT_LONG)
return -EIO; return -EIO;
} }
return size; return size;
} }
...@@ -480,7 +539,6 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len) ...@@ -480,7 +539,6 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
rc = -EIO; rc = -EIO;
goto out_err; goto out_err;
} }
} }
/* write last byte */ /* write last byte */
...@@ -568,6 +626,7 @@ static int tpm_tis_i2c_init(struct device *dev) ...@@ -568,6 +626,7 @@ static int tpm_tis_i2c_init(struct device *dev)
chip = tpm_register_hardware(dev, &tpm_tis_i2c); chip = tpm_register_hardware(dev, &tpm_tis_i2c);
if (!chip) { if (!chip) {
dev_err(dev, "could not register hardware\n");
rc = -ENODEV; rc = -ENODEV;
goto out_err; goto out_err;
} }
...@@ -582,20 +641,24 @@ static int tpm_tis_i2c_init(struct device *dev) ...@@ -582,20 +641,24 @@ static int tpm_tis_i2c_init(struct device *dev)
chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
if (request_locality(chip, 0) != 0) { if (request_locality(chip, 0) != 0) {
dev_err(dev, "could not request locality\n");
rc = -ENODEV; rc = -ENODEV;
goto out_vendor; goto out_vendor;
} }
/* read four bytes from DID_VID register */ /* read four bytes from DID_VID register */
if (iic_tpm_read(TPM_DID_VID(0), (u8 *)&vendor, 4) < 0) { if (iic_tpm_read(TPM_DID_VID(0), (u8 *)&vendor, 4) < 0) {
dev_err(dev, "could not read vendor id\n");
rc = -EIO; rc = -EIO;
goto out_release; goto out_release;
} }
/* create DID_VID register value, after swapping to little-endian */ if (vendor == TPM_TIS_I2C_DID_VID_9645) {
vendor = be32_to_cpu((__be32) vendor); tpm_dev.chip_type = SLB9645;
} else if (vendor == TPM_TIS_I2C_DID_VID_9635) {
if (vendor != TPM_TIS_I2C_DID_VID) { tpm_dev.chip_type = SLB9635;
} else {
dev_err(dev, "vendor id did not match! ID was %08x\n", vendor);
rc = -ENODEV; rc = -ENODEV;
goto out_release; goto out_release;
} }
...@@ -631,22 +694,53 @@ static int tpm_tis_i2c_init(struct device *dev) ...@@ -631,22 +694,53 @@ static int tpm_tis_i2c_init(struct device *dev)
static const struct i2c_device_id tpm_tis_i2c_table[] = { static const struct i2c_device_id tpm_tis_i2c_table[] = {
{"tpm_i2c_infineon", 0}, {"tpm_i2c_infineon", 0},
{"slb9635tt", 0},
{"slb9645tt", 1},
{}, {},
}; };
MODULE_DEVICE_TABLE(i2c, tpm_tis_i2c_table); MODULE_DEVICE_TABLE(i2c, tpm_tis_i2c_table);
#ifdef CONFIG_OF
static const struct of_device_id tpm_tis_i2c_of_match[] = {
{
.name = "tpm_i2c_infineon",
.type = "tpm",
.compatible = "infineon,tpm_i2c_infineon",
.data = (void *)0
},
{
.name = "slb9635tt",
.type = "tpm",
.compatible = "infineon,slb9635tt",
.data = (void *)0
},
{
.name = "slb9645tt",
.type = "tpm",
.compatible = "infineon,slb9645tt",
.data = (void *)1
},
{},
};
MODULE_DEVICE_TABLE(of, tpm_tis_i2c_of_match);
#endif
static SIMPLE_DEV_PM_OPS(tpm_tis_i2c_ops, tpm_pm_suspend, tpm_pm_resume); static SIMPLE_DEV_PM_OPS(tpm_tis_i2c_ops, tpm_pm_suspend, tpm_pm_resume);
static int tpm_tis_i2c_probe(struct i2c_client *client, static int tpm_tis_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
int rc; int rc;
if (tpm_dev.client != NULL) struct device *dev = &(client->dev);
if (tpm_dev.client != NULL) {
dev_err(dev, "This driver only supports one client at a time\n");
return -EBUSY; /* We only support one client */ return -EBUSY; /* We only support one client */
}
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
dev_err(&client->dev, dev_err(dev, "no algorithms associated to the i2c bus\n");
"no algorithms associated to the i2c bus\n");
return -ENODEV; return -ENODEV;
} }
...@@ -682,7 +776,6 @@ static int tpm_tis_i2c_remove(struct i2c_client *client) ...@@ -682,7 +776,6 @@ static int tpm_tis_i2c_remove(struct i2c_client *client)
} }
static struct i2c_driver tpm_tis_i2c_driver = { static struct i2c_driver tpm_tis_i2c_driver = {
.id_table = tpm_tis_i2c_table, .id_table = tpm_tis_i2c_table,
.probe = tpm_tis_i2c_probe, .probe = tpm_tis_i2c_probe,
.remove = tpm_tis_i2c_remove, .remove = tpm_tis_i2c_remove,
...@@ -690,11 +783,12 @@ static struct i2c_driver tpm_tis_i2c_driver = { ...@@ -690,11 +783,12 @@ static struct i2c_driver tpm_tis_i2c_driver = {
.name = "tpm_i2c_infineon", .name = "tpm_i2c_infineon",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &tpm_tis_i2c_ops, .pm = &tpm_tis_i2c_ops,
.of_match_table = of_match_ptr(tpm_tis_i2c_of_match),
}, },
}; };
module_i2c_driver(tpm_tis_i2c_driver); module_i2c_driver(tpm_tis_i2c_driver);
MODULE_AUTHOR("Peter Huewe <peter.huewe@infineon.com>"); MODULE_AUTHOR("Peter Huewe <peter.huewe@infineon.com>");
MODULE_DESCRIPTION("TPM TIS I2C Infineon Driver"); MODULE_DESCRIPTION("TPM TIS I2C Infineon Driver");
MODULE_VERSION("2.1.5"); MODULE_VERSION("2.2.0");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -50,7 +49,6 @@ ...@@ -50,7 +49,6 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched.h>
#include "tpm.h" #include "tpm.h"
#include "tpm_i2c_stm_st33.h" #include "tpm_i2c_stm_st33.h"
...@@ -178,7 +176,7 @@ static long _wait_for_interrupt_serirq_timeout(struct tpm_chip *chip, ...@@ -178,7 +176,7 @@ static long _wait_for_interrupt_serirq_timeout(struct tpm_chip *chip,
struct i2c_client *client; struct i2c_client *client;
struct st33zp24_platform_data *pin_infos; struct st33zp24_platform_data *pin_infos;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
pin_infos = client->dev.platform_data; pin_infos = client->dev.platform_data;
status = wait_for_completion_interruptible_timeout( status = wait_for_completion_interruptible_timeout(
...@@ -197,12 +195,12 @@ static int wait_for_serirq_timeout(struct tpm_chip *chip, bool condition, ...@@ -197,12 +195,12 @@ static int wait_for_serirq_timeout(struct tpm_chip *chip, bool condition,
int status = 2; int status = 2;
struct i2c_client *client; struct i2c_client *client;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
status = _wait_for_interrupt_serirq_timeout(chip, timeout); status = _wait_for_interrupt_serirq_timeout(chip, timeout);
if (!status) { if (!status) {
status = -EBUSY; status = -EBUSY;
} else{ } else {
clear_interruption(client); clear_interruption(client);
if (condition) if (condition)
status = 1; status = 1;
...@@ -219,7 +217,7 @@ static void tpm_stm_i2c_cancel(struct tpm_chip *chip) ...@@ -219,7 +217,7 @@ static void tpm_stm_i2c_cancel(struct tpm_chip *chip)
struct i2c_client *client; struct i2c_client *client;
u8 data; u8 data;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
data = TPM_STS_COMMAND_READY; data = TPM_STS_COMMAND_READY;
I2C_WRITE_DATA(client, TPM_STS, &data, 1); I2C_WRITE_DATA(client, TPM_STS, &data, 1);
...@@ -236,7 +234,7 @@ static u8 tpm_stm_i2c_status(struct tpm_chip *chip) ...@@ -236,7 +234,7 @@ static u8 tpm_stm_i2c_status(struct tpm_chip *chip)
{ {
struct i2c_client *client; struct i2c_client *client;
u8 data; u8 data;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
I2C_READ_DATA(client, TPM_STS, &data, 1); I2C_READ_DATA(client, TPM_STS, &data, 1);
return data; return data;
...@@ -254,7 +252,7 @@ static int check_locality(struct tpm_chip *chip) ...@@ -254,7 +252,7 @@ static int check_locality(struct tpm_chip *chip)
u8 data; u8 data;
u8 status; u8 status;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
status = I2C_READ_DATA(client, TPM_ACCESS, &data, 1); status = I2C_READ_DATA(client, TPM_ACCESS, &data, 1);
if (status && (data & if (status && (data &
...@@ -278,7 +276,7 @@ static int request_locality(struct tpm_chip *chip) ...@@ -278,7 +276,7 @@ static int request_locality(struct tpm_chip *chip)
struct i2c_client *client; struct i2c_client *client;
u8 data; u8 data;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
if (check_locality(chip) == chip->vendor.locality) if (check_locality(chip) == chip->vendor.locality)
return chip->vendor.locality; return chip->vendor.locality;
...@@ -294,7 +292,7 @@ static int request_locality(struct tpm_chip *chip) ...@@ -294,7 +292,7 @@ static int request_locality(struct tpm_chip *chip)
chip->vendor.timeout_a); chip->vendor.timeout_a);
if (rc > 0) if (rc > 0)
return chip->vendor.locality; return chip->vendor.locality;
} else{ } else {
stop = jiffies + chip->vendor.timeout_a; stop = jiffies + chip->vendor.timeout_a;
do { do {
if (check_locality(chip) >= 0) if (check_locality(chip) >= 0)
...@@ -316,7 +314,7 @@ static void release_locality(struct tpm_chip *chip) ...@@ -316,7 +314,7 @@ static void release_locality(struct tpm_chip *chip)
struct i2c_client *client; struct i2c_client *client;
u8 data; u8 data;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
data = TPM_ACCESS_ACTIVE_LOCALITY; data = TPM_ACCESS_ACTIVE_LOCALITY;
I2C_WRITE_DATA(client, TPM_ACCESS, &data, 1); I2C_WRITE_DATA(client, TPM_ACCESS, &data, 1);
...@@ -333,7 +331,7 @@ static int get_burstcount(struct tpm_chip *chip) ...@@ -333,7 +331,7 @@ static int get_burstcount(struct tpm_chip *chip)
int burstcnt, status; int burstcnt, status;
u8 tpm_reg, temp; u8 tpm_reg, temp;
struct i2c_client *client = (struct i2c_client *) TPM_VPRIV(chip); struct i2c_client *client = (struct i2c_client *)TPM_VPRIV(chip);
stop = jiffies + chip->vendor.timeout_d; stop = jiffies + chip->vendor.timeout_d;
do { do {
...@@ -379,7 +377,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout, ...@@ -379,7 +377,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
mask), timeout); mask), timeout);
if (rc > 0) if (rc > 0)
return 0; return 0;
} else{ } else {
stop = jiffies + timeout; stop = jiffies + timeout;
do { do {
msleep(TPM_TIMEOUT); msleep(TPM_TIMEOUT);
...@@ -403,7 +401,7 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) ...@@ -403,7 +401,7 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
int size = 0, burstcnt, len; int size = 0, burstcnt, len;
struct i2c_client *client; struct i2c_client *client;
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
while (size < count && while (size < count &&
wait_for_stat(chip, wait_for_stat(chip,
...@@ -433,7 +431,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id) ...@@ -433,7 +431,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
disable_irq_nosync(irq); disable_irq_nosync(irq);
client = (struct i2c_client *) TPM_VPRIV(chip); client = (struct i2c_client *)TPM_VPRIV(chip);
pin_infos = client->dev.platform_data; pin_infos = client->dev.platform_data;
complete(&pin_infos->irq_detection); complete(&pin_infos->irq_detection);
...@@ -453,8 +451,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id) ...@@ -453,8 +451,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf, static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
size_t len) size_t len)
{ {
u32 status, u32 status, burstcnt = 0, i, size;
burstcnt = 0, i, size;
int ret; int ret;
u8 data; u8 data;
struct i2c_client *client; struct i2c_client *client;
...@@ -483,7 +480,7 @@ static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf, ...@@ -483,7 +480,7 @@ static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
} }
} }
for (i = 0 ; i < len - 1 ;) { for (i = 0; i < len - 1;) {
burstcnt = get_burstcount(chip); burstcnt = get_burstcount(chip);
size = min_t(int, len - i - 1, burstcnt); size = min_t(int, len - i - 1, burstcnt);
ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size); ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size);
...@@ -547,7 +544,7 @@ static int tpm_stm_i2c_recv(struct tpm_chip *chip, unsigned char *buf, ...@@ -547,7 +544,7 @@ static int tpm_stm_i2c_recv(struct tpm_chip *chip, unsigned char *buf,
goto out; goto out;
} }
expected = be32_to_cpu(*(__be32 *) (buf + 2)); expected = be32_to_cpu(*(__be32 *)(buf + 2));
if (expected > count) { if (expected > count) {
size = -EIO; size = -EIO;
goto out; goto out;
...@@ -569,7 +566,7 @@ static int tpm_stm_i2c_recv(struct tpm_chip *chip, unsigned char *buf, ...@@ -569,7 +566,7 @@ static int tpm_stm_i2c_recv(struct tpm_chip *chip, unsigned char *buf,
static bool tpm_st33_i2c_req_canceled(struct tpm_chip *chip, u8 status) static bool tpm_st33_i2c_req_canceled(struct tpm_chip *chip, u8 status)
{ {
return (status == TPM_STS_COMMAND_READY); return (status == TPM_STS_COMMAND_READY);
} }
static const struct file_operations tpm_st33_i2c_fops = { static const struct file_operations tpm_st33_i2c_fops = {
...@@ -617,7 +614,7 @@ static struct tpm_vendor_specific st_i2c_tpm = { ...@@ -617,7 +614,7 @@ static struct tpm_vendor_specific st_i2c_tpm = {
.miscdev = {.fops = &tpm_st33_i2c_fops,}, .miscdev = {.fops = &tpm_st33_i2c_fops,},
}; };
static int interrupts ; static int interrupts;
module_param(interrupts, int, 0444); module_param(interrupts, int, 0444);
MODULE_PARM_DESC(interrupts, "Enable interrupts"); MODULE_PARM_DESC(interrupts, "Enable interrupts");
...@@ -714,7 +711,7 @@ tpm_st33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -714,7 +711,7 @@ tpm_st33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
"TPM SERIRQ management", chip); "TPM SERIRQ management", chip);
if (err < 0) { if (err < 0) {
dev_err(chip->dev , "TPM SERIRQ signals %d not available\n", dev_err(chip->dev , "TPM SERIRQ signals %d not available\n",
gpio_to_irq(platform_data->io_serirq)); gpio_to_irq(platform_data->io_serirq));
goto _irq_set; goto _irq_set;
} }
...@@ -754,7 +751,7 @@ tpm_st33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -754,7 +751,7 @@ tpm_st33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
dev_info(chip->dev, "TPM I2C Initialized\n"); dev_info(chip->dev, "TPM I2C Initialized\n");
return 0; return 0;
_irq_set: _irq_set:
free_irq(gpio_to_irq(platform_data->io_serirq), (void *) chip); free_irq(gpio_to_irq(platform_data->io_serirq), (void *)chip);
_gpio_init2: _gpio_init2:
if (interrupts) if (interrupts)
gpio_free(platform_data->io_serirq); gpio_free(platform_data->io_serirq);
...@@ -784,7 +781,7 @@ static int tpm_st33_i2c_remove(struct i2c_client *client) ...@@ -784,7 +781,7 @@ static int tpm_st33_i2c_remove(struct i2c_client *client)
{ {
struct tpm_chip *chip = (struct tpm_chip *)i2c_get_clientdata(client); struct tpm_chip *chip = (struct tpm_chip *)i2c_get_clientdata(client);
struct st33zp24_platform_data *pin_infos = struct st33zp24_platform_data *pin_infos =
((struct i2c_client *) TPM_VPRIV(chip))->dev.platform_data; ((struct i2c_client *)TPM_VPRIV(chip))->dev.platform_data;
if (pin_infos != NULL) { if (pin_infos != NULL) {
free_irq(pin_infos->io_serirq, chip); free_irq(pin_infos->io_serirq, chip);
...@@ -823,9 +820,9 @@ static int tpm_st33_i2c_pm_suspend(struct device *dev) ...@@ -823,9 +820,9 @@ static int tpm_st33_i2c_pm_suspend(struct device *dev)
struct st33zp24_platform_data *pin_infos = dev->platform_data; struct st33zp24_platform_data *pin_infos = dev->platform_data;
int ret = 0; int ret = 0;
if (power_mgt) if (power_mgt) {
gpio_set_value(pin_infos->io_lpcpd, 0); gpio_set_value(pin_infos->io_lpcpd, 0);
else{ } else {
if (chip->data_buffer == NULL) if (chip->data_buffer == NULL)
chip->data_buffer = pin_infos->tpm_i2c_buffer[0]; chip->data_buffer = pin_infos->tpm_i2c_buffer[0];
ret = tpm_pm_suspend(dev); ret = tpm_pm_suspend(dev);
...@@ -851,12 +848,12 @@ static int tpm_st33_i2c_pm_resume(struct device *dev) ...@@ -851,12 +848,12 @@ static int tpm_st33_i2c_pm_resume(struct device *dev)
(chip->vendor.status(chip) & (chip->vendor.status(chip) &
TPM_STS_VALID) == TPM_STS_VALID, TPM_STS_VALID) == TPM_STS_VALID,
chip->vendor.timeout_b); chip->vendor.timeout_b);
} else{ } else {
if (chip->data_buffer == NULL) if (chip->data_buffer == NULL)
chip->data_buffer = pin_infos->tpm_i2c_buffer[0]; chip->data_buffer = pin_infos->tpm_i2c_buffer[0];
ret = tpm_pm_resume(dev); ret = tpm_pm_resume(dev);
if (!ret) if (!ret)
tpm_do_selftest(chip); tpm_do_selftest(chip);
} }
return ret; return ret;
} /* tpm_st33_i2c_pm_resume() */ } /* tpm_st33_i2c_pm_resume() */
...@@ -867,7 +864,8 @@ static const struct i2c_device_id tpm_st33_i2c_id[] = { ...@@ -867,7 +864,8 @@ static const struct i2c_device_id tpm_st33_i2c_id[] = {
{} {}
}; };
MODULE_DEVICE_TABLE(i2c, tpm_st33_i2c_id); MODULE_DEVICE_TABLE(i2c, tpm_st33_i2c_id);
static SIMPLE_DEV_PM_OPS(tpm_st33_i2c_ops, tpm_st33_i2c_pm_suspend, tpm_st33_i2c_pm_resume); static SIMPLE_DEV_PM_OPS(tpm_st33_i2c_ops, tpm_st33_i2c_pm_suspend,
tpm_st33_i2c_pm_resume);
static struct i2c_driver tpm_st33_i2c_driver = { static struct i2c_driver tpm_st33_i2c_driver = {
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -158,9 +158,9 @@ static ssize_t tpm_store_ppi_request(struct device *dev, ...@@ -158,9 +158,9 @@ static ssize_t tpm_store_ppi_request(struct device *dev,
ACPI_TYPE_STRING); ACPI_TYPE_STRING);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENOMEM; return -ENOMEM;
strncpy(version, strlcpy(version,
((union acpi_object *)output.pointer)->string.pointer, ((union acpi_object *)output.pointer)->string.pointer,
PPI_VERSION_LEN); PPI_VERSION_LEN + 1);
kfree(output.pointer); kfree(output.pointer);
output.length = ACPI_ALLOCATE_BUFFER; output.length = ACPI_ALLOCATE_BUFFER;
output.pointer = NULL; output.pointer = NULL;
...@@ -237,9 +237,9 @@ static ssize_t tpm_show_ppi_transition_action(struct device *dev, ...@@ -237,9 +237,9 @@ static ssize_t tpm_show_ppi_transition_action(struct device *dev,
ACPI_TYPE_STRING); ACPI_TYPE_STRING);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENOMEM; return -ENOMEM;
strncpy(version, strlcpy(version,
((union acpi_object *)output.pointer)->string.pointer, ((union acpi_object *)output.pointer)->string.pointer,
PPI_VERSION_LEN); PPI_VERSION_LEN + 1);
/* /*
* PPI spec defines params[3].type as empty package, but some platforms * PPI spec defines params[3].type as empty package, but some platforms
* (e.g. Capella with PPI 1.0) need integer/string/buffer type, so for * (e.g. Capella with PPI 1.0) need integer/string/buffer type, so for
...@@ -351,7 +351,7 @@ static ssize_t tpm_show_ppi_response(struct device *dev, ...@@ -351,7 +351,7 @@ static ssize_t tpm_show_ppi_response(struct device *dev,
static ssize_t show_ppi_operations(char *buf, u32 start, u32 end) static ssize_t show_ppi_operations(char *buf, u32 start, u32 end)
{ {
char *str = buf; char *str = buf;
char version[PPI_VERSION_LEN]; char version[PPI_VERSION_LEN + 1];
acpi_handle handle; acpi_handle handle;
acpi_status status; acpi_status status;
struct acpi_object_list input; struct acpi_object_list input;
...@@ -381,9 +381,9 @@ static ssize_t show_ppi_operations(char *buf, u32 start, u32 end) ...@@ -381,9 +381,9 @@ static ssize_t show_ppi_operations(char *buf, u32 start, u32 end)
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENOMEM; return -ENOMEM;
strncpy(version, strlcpy(version,
((union acpi_object *)output.pointer)->string.pointer, ((union acpi_object *)output.pointer)->string.pointer,
PPI_VERSION_LEN); PPI_VERSION_LEN + 1);
kfree(output.pointer); kfree(output.pointer);
output.length = ACPI_ALLOCATE_BUFFER; output.length = ACPI_ALLOCATE_BUFFER;
output.pointer = NULL; output.pointer = NULL;
......
...@@ -2385,10 +2385,9 @@ int nfs_clone_sb_security(struct super_block *s, struct dentry *mntroot, ...@@ -2385,10 +2385,9 @@ int nfs_clone_sb_security(struct super_block *s, struct dentry *mntroot,
struct nfs_mount_info *mount_info) struct nfs_mount_info *mount_info)
{ {
/* clone any lsm security options from the parent to the new sb */ /* clone any lsm security options from the parent to the new sb */
security_sb_clone_mnt_opts(mount_info->cloned->sb, s);
if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops)
return -ESTALE; return -ESTALE;
return 0; return security_sb_clone_mnt_opts(mount_info->cloned->sb, s);
} }
EXPORT_SYMBOL_GPL(nfs_clone_sb_security); EXPORT_SYMBOL_GPL(nfs_clone_sb_security);
......
...@@ -1440,7 +1440,7 @@ struct security_operations { ...@@ -1440,7 +1440,7 @@ struct security_operations {
struct path *new_path); struct path *new_path);
int (*sb_set_mnt_opts) (struct super_block *sb, int (*sb_set_mnt_opts) (struct super_block *sb,
struct security_mnt_opts *opts); struct security_mnt_opts *opts);
void (*sb_clone_mnt_opts) (const struct super_block *oldsb, int (*sb_clone_mnt_opts) (const struct super_block *oldsb,
struct super_block *newsb); struct super_block *newsb);
int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts); int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts);
...@@ -1726,7 +1726,7 @@ int security_sb_mount(const char *dev_name, struct path *path, ...@@ -1726,7 +1726,7 @@ int security_sb_mount(const char *dev_name, struct path *path,
int security_sb_umount(struct vfsmount *mnt, int flags); int security_sb_umount(struct vfsmount *mnt, int flags);
int security_sb_pivotroot(struct path *old_path, struct path *new_path); int security_sb_pivotroot(struct path *old_path, struct path *new_path);
int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts); int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts);
void security_sb_clone_mnt_opts(const struct super_block *oldsb, int security_sb_clone_mnt_opts(const struct super_block *oldsb,
struct super_block *newsb); struct super_block *newsb);
int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts);
...@@ -2016,9 +2016,11 @@ static inline int security_sb_set_mnt_opts(struct super_block *sb, ...@@ -2016,9 +2016,11 @@ static inline int security_sb_set_mnt_opts(struct super_block *sb,
return 0; return 0;
} }
static inline void security_sb_clone_mnt_opts(const struct super_block *oldsb, static inline int security_sb_clone_mnt_opts(const struct super_block *oldsb,
struct super_block *newsb) struct super_block *newsb)
{ } {
return 0;
}
static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts) static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
{ {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define DEBUGFS_MAGIC 0x64626720 #define DEBUGFS_MAGIC 0x64626720
#define SECURITYFS_MAGIC 0x73636673 #define SECURITYFS_MAGIC 0x73636673
#define SELINUX_MAGIC 0xf97cff8c #define SELINUX_MAGIC 0xf97cff8c
#define SMACK_MAGIC 0x43415d53 /* "SMAC" */
#define RAMFS_MAGIC 0x858458f6 /* some random number */ #define RAMFS_MAGIC 0x858458f6 /* some random number */
#define TMPFS_MAGIC 0x01021994 #define TMPFS_MAGIC 0x01021994
#define HUGETLBFS_MAGIC 0x958458f6 /* some random number */ #define HUGETLBFS_MAGIC 0x958458f6 /* some random number */
......
...@@ -160,6 +160,8 @@ static int seccomp_check_filter(struct sock_filter *filter, unsigned int flen) ...@@ -160,6 +160,8 @@ static int seccomp_check_filter(struct sock_filter *filter, unsigned int flen)
case BPF_S_ALU_AND_X: case BPF_S_ALU_AND_X:
case BPF_S_ALU_OR_K: case BPF_S_ALU_OR_K:
case BPF_S_ALU_OR_X: case BPF_S_ALU_OR_X:
case BPF_S_ALU_XOR_K:
case BPF_S_ALU_XOR_X:
case BPF_S_ALU_LSH_K: case BPF_S_ALU_LSH_K:
case BPF_S_ALU_LSH_X: case BPF_S_ALU_LSH_X:
case BPF_S_ALU_RSH_K: case BPF_S_ALU_RSH_K:
......
...@@ -98,9 +98,10 @@ static int cap_sb_set_mnt_opts(struct super_block *sb, ...@@ -98,9 +98,10 @@ static int cap_sb_set_mnt_opts(struct super_block *sb,
return 0; return 0;
} }
static void cap_sb_clone_mnt_opts(const struct super_block *oldsb, static int cap_sb_clone_mnt_opts(const struct super_block *oldsb,
struct super_block *newsb) struct super_block *newsb)
{ {
return 0;
} }
static int cap_sb_parse_opts_str(char *options, struct security_mnt_opts *opts) static int cap_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
......
...@@ -189,11 +189,9 @@ static int process_measurement(struct file *file, const char *filename, ...@@ -189,11 +189,9 @@ static int process_measurement(struct file *file, const char *filename,
if (rc != 0) if (rc != 0)
goto out_digsig; goto out_digsig;
if (function != BPRM_CHECK) pathname = !filename ? ima_d_path(&file->f_path, &pathbuf) : filename;
pathname = ima_d_path(&file->f_path, &pathbuf);
if (!pathname) if (!pathname)
pathname = filename; pathname = (const char *)file->f_dentry->d_name.name;
if (action & IMA_MEASURE) if (action & IMA_MEASURE)
ima_store_measurement(iint, file, pathname); ima_store_measurement(iint, file, pathname);
...@@ -226,8 +224,7 @@ static int process_measurement(struct file *file, const char *filename, ...@@ -226,8 +224,7 @@ static int process_measurement(struct file *file, const char *filename,
int ima_file_mmap(struct file *file, unsigned long prot) int ima_file_mmap(struct file *file, unsigned long prot)
{ {
if (file && (prot & PROT_EXEC)) if (file && (prot & PROT_EXEC))
return process_measurement(file, file->f_dentry->d_name.name, return process_measurement(file, NULL, MAY_EXEC, MMAP_CHECK);
MAY_EXEC, MMAP_CHECK);
return 0; return 0;
} }
...@@ -265,7 +262,7 @@ int ima_bprm_check(struct linux_binprm *bprm) ...@@ -265,7 +262,7 @@ int ima_bprm_check(struct linux_binprm *bprm)
int ima_file_check(struct file *file, int mask) int ima_file_check(struct file *file, int mask)
{ {
ima_rdwr_violation_check(file); ima_rdwr_violation_check(file);
return process_measurement(file, file->f_dentry->d_name.name, return process_measurement(file, NULL,
mask & (MAY_READ | MAY_WRITE | MAY_EXEC), mask & (MAY_READ | MAY_WRITE | MAY_EXEC),
FILE_CHECK); FILE_CHECK);
} }
...@@ -290,8 +287,7 @@ int ima_module_check(struct file *file) ...@@ -290,8 +287,7 @@ int ima_module_check(struct file *file)
#endif #endif
return 0; /* We rely on module signature checking */ return 0; /* We rely on module signature checking */
} }
return process_measurement(file, file->f_dentry->d_name.name, return process_measurement(file, NULL, MAY_EXEC, MODULE_CHECK);
MAY_EXEC, MODULE_CHECK);
} }
static int __init init_ima(void) static int __init init_ima(void)
......
...@@ -299,10 +299,10 @@ int security_sb_set_mnt_opts(struct super_block *sb, ...@@ -299,10 +299,10 @@ int security_sb_set_mnt_opts(struct super_block *sb,
} }
EXPORT_SYMBOL(security_sb_set_mnt_opts); EXPORT_SYMBOL(security_sb_set_mnt_opts);
void security_sb_clone_mnt_opts(const struct super_block *oldsb, int security_sb_clone_mnt_opts(const struct super_block *oldsb,
struct super_block *newsb) struct super_block *newsb)
{ {
security_ops->sb_clone_mnt_opts(oldsb, newsb); return security_ops->sb_clone_mnt_opts(oldsb, newsb);
} }
EXPORT_SYMBOL(security_sb_clone_mnt_opts); EXPORT_SYMBOL(security_sb_clone_mnt_opts);
......
...@@ -751,7 +751,37 @@ static int selinux_set_mnt_opts(struct super_block *sb, ...@@ -751,7 +751,37 @@ static int selinux_set_mnt_opts(struct super_block *sb,
goto out; goto out;
} }
static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb, static int selinux_cmp_sb_context(const struct super_block *oldsb,
const struct super_block *newsb)
{
struct superblock_security_struct *old = oldsb->s_security;
struct superblock_security_struct *new = newsb->s_security;
char oldflags = old->flags & SE_MNTMASK;
char newflags = new->flags & SE_MNTMASK;
if (oldflags != newflags)
goto mismatch;
if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
goto mismatch;
if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
goto mismatch;
if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
goto mismatch;
if (oldflags & ROOTCONTEXT_MNT) {
struct inode_security_struct *oldroot = oldsb->s_root->d_inode->i_security;
struct inode_security_struct *newroot = newsb->s_root->d_inode->i_security;
if (oldroot->sid != newroot->sid)
goto mismatch;
}
return 0;
mismatch:
printk(KERN_WARNING "SELinux: mount invalid. Same superblock, "
"different security settings for (dev %s, "
"type %s)\n", newsb->s_id, newsb->s_type->name);
return -EBUSY;
}
static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
struct super_block *newsb) struct super_block *newsb)
{ {
const struct superblock_security_struct *oldsbsec = oldsb->s_security; const struct superblock_security_struct *oldsbsec = oldsb->s_security;
...@@ -766,14 +796,14 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb, ...@@ -766,14 +796,14 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
* mount options. thus we can safely deal with this superblock later * mount options. thus we can safely deal with this superblock later
*/ */
if (!ss_initialized) if (!ss_initialized)
return; return 0;
/* how can we clone if the old one wasn't set up?? */ /* how can we clone if the old one wasn't set up?? */
BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED)); BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
/* if fs is reusing a sb, just let its options stand... */ /* if fs is reusing a sb, make sure that the contexts match */
if (newsbsec->flags & SE_SBINITIALIZED) if (newsbsec->flags & SE_SBINITIALIZED)
return; return selinux_cmp_sb_context(oldsb, newsb);
mutex_lock(&newsbsec->lock); mutex_lock(&newsbsec->lock);
...@@ -806,6 +836,7 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb, ...@@ -806,6 +836,7 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
sb_finish_set_opts(newsb); sb_finish_set_opts(newsb);
mutex_unlock(&newsbsec->lock); mutex_unlock(&newsbsec->lock);
return 0;
} }
static int selinux_parse_opts_str(char *options, static int selinux_parse_opts_str(char *options,
......
...@@ -148,11 +148,6 @@ struct smack_known { ...@@ -148,11 +148,6 @@ struct smack_known {
#define SMACK_UNLABELED_SOCKET 0 #define SMACK_UNLABELED_SOCKET 0
#define SMACK_CIPSO_SOCKET 1 #define SMACK_CIPSO_SOCKET 1
/*
* smackfs magic number
*/
#define SMACK_MAGIC 0x43415d53 /* "SMAC" */
/* /*
* CIPSO defaults. * CIPSO defaults.
*/ */
......
...@@ -252,6 +252,8 @@ static inline void smack_str_from_perm(char *string, int access) ...@@ -252,6 +252,8 @@ static inline void smack_str_from_perm(char *string, int access)
string[i++] = 'x'; string[i++] = 'x';
if (access & MAY_APPEND) if (access & MAY_APPEND)
string[i++] = 'a'; string[i++] = 'a';
if (access & MAY_TRANSMUTE)
string[i++] = 't';
string[i] = '\0'; string[i] = '\0';
} }
/** /**
......
...@@ -654,7 +654,7 @@ static int smack_inode_unlink(struct inode *dir, struct dentry *dentry) ...@@ -654,7 +654,7 @@ static int smack_inode_unlink(struct inode *dir, struct dentry *dentry)
/* /*
* You also need write access to the containing directory * You also need write access to the containing directory
*/ */
smk_ad_setfield_u_fs_path_dentry(&ad, NULL); smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE);
smk_ad_setfield_u_fs_inode(&ad, dir); smk_ad_setfield_u_fs_inode(&ad, dir);
rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad); rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad);
} }
...@@ -685,7 +685,7 @@ static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry) ...@@ -685,7 +685,7 @@ static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry)
/* /*
* You also need write access to the containing directory * You also need write access to the containing directory
*/ */
smk_ad_setfield_u_fs_path_dentry(&ad, NULL); smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE);
smk_ad_setfield_u_fs_inode(&ad, dir); smk_ad_setfield_u_fs_inode(&ad, dir);
rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad); rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad);
} }
......
This diff is collapsed.
...@@ -536,7 +536,7 @@ static struct security_operations tomoyo_security_ops = { ...@@ -536,7 +536,7 @@ static struct security_operations tomoyo_security_ops = {
}; };
/* Lock for GC. */ /* Lock for GC. */
struct srcu_struct tomoyo_ss; DEFINE_SRCU(tomoyo_ss);
/** /**
* tomoyo_init - Register TOMOYO Linux as a LSM module. * tomoyo_init - Register TOMOYO Linux as a LSM module.
...@@ -550,8 +550,7 @@ static int __init tomoyo_init(void) ...@@ -550,8 +550,7 @@ static int __init tomoyo_init(void)
if (!security_module_enable(&tomoyo_security_ops)) if (!security_module_enable(&tomoyo_security_ops))
return 0; return 0;
/* register ourselves with the security framework */ /* register ourselves with the security framework */
if (register_security(&tomoyo_security_ops) || if (register_security(&tomoyo_security_ops))
init_srcu_struct(&tomoyo_ss))
panic("Failure registering TOMOYO Linux"); panic("Failure registering TOMOYO Linux");
printk(KERN_INFO "TOMOYO Linux initialized\n"); printk(KERN_INFO "TOMOYO Linux initialized\n");
cred->security = &tomoyo_kernel_domain; cred->security = &tomoyo_kernel_domain;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment