When set posix acl, it maybe call posix_acl_update_mode in some filesystem, eg. ext4. It may set acl to NULL, so, we can't free the acl which allocated in posix_acl_xattr_set. Use an temp value to store the acl address for posix_acl_release. Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@xxxxxxxxxx> --- fs/posix_acl.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 84ad1c90d535..0a359d06274c 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -882,7 +882,7 @@ posix_acl_xattr_set(const struct xattr_handler *handler, const char *name, const void *value, size_t size, int flags) { - struct posix_acl *acl = NULL; + struct posix_acl *acl = NULL, *p = NULL; int ret; if (value) { @@ -890,8 +890,15 @@ posix_acl_xattr_set(const struct xattr_handler *handler, if (IS_ERR(acl)) return PTR_ERR(acl); } + + /* + * when call set_posix_acl, posix_acl_update_mode may set acl + * to NULL,use temporary variables p for posix_acl_release. + */ + p = acl; ret = set_posix_acl(inode, handler->flags, acl); - posix_acl_release(acl); + + posix_acl_release(p); return ret; } -- 2.17.2