Commit 6b26285f authored by Roberto Sassu's avatar Roberto Sassu Committed by Mimi Zohar

ima/evm: Fix type mismatch

The endianness of a variable written to the measurement list cannot be
determined at compile time, as it depends on the value of the
ima_canonical_fmt global variable (set through a kernel option with the
same name if the machine is big endian).

If ima_canonical_fmt is false, the endianness of a variable is the same as
the machine; if ima_canonical_fmt is true, the endianness is little endian.
The warning arises due to this type of instruction:

var = cpu_to_leXX(var)

which tries to assign a value in little endian to a variable with native
endianness (little or big endian).

Given that the variables set with this instruction are not used in any
operation but just written to a buffer, it is safe to force the type of the
value being set to be the same of the type of the variable with:

var = (__force <var type>)cpu_to_leXX(var)
Reported-by: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarRoberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: default avatarMimi Zohar <zohar@linux.ibm.com>
parent 24c9ae23
...@@ -360,7 +360,7 @@ int evm_read_protected_xattrs(struct dentry *dentry, u8 *buffer, ...@@ -360,7 +360,7 @@ int evm_read_protected_xattrs(struct dentry *dentry, u8 *buffer,
size = sizeof(u32); size = sizeof(u32);
if (buffer) { if (buffer) {
if (canonical_fmt) if (canonical_fmt)
rc = cpu_to_le32(rc); rc = (__force int)cpu_to_le32(rc);
*(u32 *)(buffer + total_size) = rc; *(u32 *)(buffer + total_size) = rc;
} }
......
...@@ -598,8 +598,8 @@ static int ima_calc_field_array_hash_tfm(struct ima_field_data *field_data, ...@@ -598,8 +598,8 @@ static int ima_calc_field_array_hash_tfm(struct ima_field_data *field_data,
u8 buffer[IMA_EVENT_NAME_LEN_MAX + 1] = { 0 }; u8 buffer[IMA_EVENT_NAME_LEN_MAX + 1] = { 0 };
u8 *data_to_hash = field_data[i].data; u8 *data_to_hash = field_data[i].data;
u32 datalen = field_data[i].len; u32 datalen = field_data[i].len;
u32 datalen_to_hash = u32 datalen_to_hash = !ima_canonical_fmt ?
!ima_canonical_fmt ? datalen : cpu_to_le32(datalen); datalen : (__force u32)cpu_to_le32(datalen);
if (strcmp(td->name, IMA_TEMPLATE_IMA_NAME) != 0) { if (strcmp(td->name, IMA_TEMPLATE_IMA_NAME) != 0) {
rc = crypto_shash_update(shash, rc = crypto_shash_update(shash,
......
...@@ -147,7 +147,7 @@ int ima_measurements_show(struct seq_file *m, void *v) ...@@ -147,7 +147,7 @@ int ima_measurements_show(struct seq_file *m, void *v)
* PCR used defaults to the same (config option) in * PCR used defaults to the same (config option) in
* little-endian format, unless set in policy * little-endian format, unless set in policy
*/ */
pcr = !ima_canonical_fmt ? e->pcr : cpu_to_le32(e->pcr); pcr = !ima_canonical_fmt ? e->pcr : (__force u32)cpu_to_le32(e->pcr);
ima_putc(m, &pcr, sizeof(e->pcr)); ima_putc(m, &pcr, sizeof(e->pcr));
/* 2nd: template digest */ /* 2nd: template digest */
...@@ -155,7 +155,7 @@ int ima_measurements_show(struct seq_file *m, void *v) ...@@ -155,7 +155,7 @@ int ima_measurements_show(struct seq_file *m, void *v)
/* 3rd: template name size */ /* 3rd: template name size */
namelen = !ima_canonical_fmt ? strlen(template_name) : namelen = !ima_canonical_fmt ? strlen(template_name) :
cpu_to_le32(strlen(template_name)); (__force u32)cpu_to_le32(strlen(template_name));
ima_putc(m, &namelen, sizeof(namelen)); ima_putc(m, &namelen, sizeof(namelen));
/* 4th: template name */ /* 4th: template name */
...@@ -167,7 +167,7 @@ int ima_measurements_show(struct seq_file *m, void *v) ...@@ -167,7 +167,7 @@ int ima_measurements_show(struct seq_file *m, void *v)
if (!is_ima_template) { if (!is_ima_template) {
template_data_len = !ima_canonical_fmt ? e->template_data_len : template_data_len = !ima_canonical_fmt ? e->template_data_len :
cpu_to_le32(e->template_data_len); (__force u32)cpu_to_le32(e->template_data_len);
ima_putc(m, &template_data_len, sizeof(e->template_data_len)); ima_putc(m, &template_data_len, sizeof(e->template_data_len));
} }
......
...@@ -133,7 +133,8 @@ static void ima_show_template_data_binary(struct seq_file *m, ...@@ -133,7 +133,8 @@ static void ima_show_template_data_binary(struct seq_file *m,
strlen(field_data->data) : field_data->len; strlen(field_data->data) : field_data->len;
if (show != IMA_SHOW_BINARY_NO_FIELD_LEN) { if (show != IMA_SHOW_BINARY_NO_FIELD_LEN) {
u32 field_len = !ima_canonical_fmt ? len : cpu_to_le32(len); u32 field_len = !ima_canonical_fmt ?
len : (__force u32)cpu_to_le32(len);
ima_putc(m, &field_len, sizeof(field_len)); ima_putc(m, &field_len, sizeof(field_len));
} }
...@@ -570,9 +571,9 @@ static int ima_eventinodedac_init_common(struct ima_event_data *event_data, ...@@ -570,9 +571,9 @@ static int ima_eventinodedac_init_common(struct ima_event_data *event_data,
if (ima_canonical_fmt) { if (ima_canonical_fmt) {
if (sizeof(id) == sizeof(u16)) if (sizeof(id) == sizeof(u16))
id = cpu_to_le16(id); id = (__force u16)cpu_to_le16(id);
else else
id = cpu_to_le32(id); id = (__force u32)cpu_to_le32(id);
} }
return ima_write_template_field_data((void *)&id, sizeof(id), return ima_write_template_field_data((void *)&id, sizeof(id),
...@@ -607,7 +608,7 @@ int ima_eventinodemode_init(struct ima_event_data *event_data, ...@@ -607,7 +608,7 @@ int ima_eventinodemode_init(struct ima_event_data *event_data,
struct ima_field_data *field_data) struct ima_field_data *field_data)
{ {
struct inode *inode; struct inode *inode;
umode_t mode; u16 mode;
if (!event_data->file) if (!event_data->file)
return 0; return 0;
...@@ -615,7 +616,7 @@ int ima_eventinodemode_init(struct ima_event_data *event_data, ...@@ -615,7 +616,7 @@ int ima_eventinodemode_init(struct ima_event_data *event_data,
inode = file_inode(event_data->file); inode = file_inode(event_data->file);
mode = inode->i_mode; mode = inode->i_mode;
if (ima_canonical_fmt) if (ima_canonical_fmt)
mode = cpu_to_le16(mode); mode = (__force u16)cpu_to_le16(mode);
return ima_write_template_field_data((char *)&mode, sizeof(mode), return ima_write_template_field_data((char *)&mode, sizeof(mode),
DATA_FMT_UINT, field_data); DATA_FMT_UINT, field_data);
......
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