On Sun, May 13, 2018 at 9:41 AM Mimi Zohar <zohar@xxxxxxxxxxxxxxxxxx> wrote: > On Fri, 2018-05-11 at 16:12 -0700, Matthew Garrett wrote: > + > > + if (strcmp(xattr->name, ".") == 0) { > > + evm_xattrs_locked = 1; > > + inode = evm_xattrs->d_inode; > > + inode_lock(inode); > > + newattrs.ia_mode = S_IFREG | 0440; > > + newattrs.ia_valid = ATTR_MODE; > > + err = notify_change(evm_xattrs, &newattrs, NULL); > > + inode_unlock(inode); > > + audit_log_format(ab, "locked"); > > + if (!err) > > + err = count; > > + goto out; > > + } > > + > > + audit_log_format(ab, "xattr="); > > + audit_log_untrustedstring(ab, xattr->name); > > + > > + if (strncmp(xattr->name, XATTR_SECURITY_PREFIX, > > + XATTR_SECURITY_PREFIX_LEN) != 0) { > > + err = -EINVAL; > > + goto out; > > + } > This test now prevents locking the xattr names list. Making this an > else clause will fix it. Are you sure? The check for "." happens before this, and jumps over the rest of the function.