|
@@ -378,10 +378,14 @@ int ima_inode_setxattr(struct dentry *dentry, const char *xattr_name,
|
|
|
result = ima_protect_xattr(dentry, xattr_name, xattr_value,
|
|
|
xattr_value_len);
|
|
|
if (result == 1) {
|
|
|
+ bool digsig;
|
|
|
+
|
|
|
if (!xattr_value_len || (xvalue->type >= IMA_XATTR_LAST))
|
|
|
return -EINVAL;
|
|
|
- ima_reset_appraise_flags(d_backing_inode(dentry),
|
|
|
- (xvalue->type == EVM_IMA_XATTR_DIGSIG) ? 1 : 0);
|
|
|
+ digsig = (xvalue->type == EVM_IMA_XATTR_DIGSIG);
|
|
|
+ if (!digsig && (ima_appraise & IMA_APPRAISE_ENFORCE))
|
|
|
+ return -EPERM;
|
|
|
+ ima_reset_appraise_flags(d_backing_inode(dentry), digsig);
|
|
|
result = 0;
|
|
|
}
|
|
|
return result;
|