Commit 2dd8c166 authored by DaeMyung Kang's avatar DaeMyung Kang Committed by Namjae Jeon
Browse files

ntfs: fix WSL symlink target leak on reparse failure



ntfs_reparse_set_wsl_symlink() converts the symlink target into an
allocated NLS string and transfers ownership to ni->target only after
ntfs_set_ntfs_reparse_data() succeeds. If setting the reparse data fails,
the converted target is left unreferenced and leaks.

Free the converted target on the reparse update failure path. Use kfree()
for the other local failure path as well, matching the ntfs_ucstonls()
allocation contract.

Fixes: fc053f05 ("ntfs: add reparse and ea operations")
Signed-off-by: default avatarDaeMyung Kang <charsyam@gmail.com>
Reviewed-by: default avatarHyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
parent b5198fcd
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -505,7 +505,6 @@ int ntfs_reparse_set_wsl_symlink(struct ntfs_inode *ni,
	struct reparse_point *reparse;
	struct wsl_link_reparse_data *data;

	utarget = (char *)NULL;
	len = ntfs_ucstonls(ni->vol, target, target_len, &utarget, 0);
	if (len <= 0)
		return -EINVAL;
@@ -514,7 +513,7 @@ int ntfs_reparse_set_wsl_symlink(struct ntfs_inode *ni,
	reparse = kvzalloc(reparse_len, GFP_NOFS);
	if (!reparse) {
		err = -ENOMEM;
		kvfree(utarget);
		kfree(utarget);
	} else {
		data = (struct wsl_link_reparse_data *)reparse->reparse_data;
		reparse->reparse_tag = IO_REPARSE_TAG_LX_SYMLINK;
@@ -528,6 +527,8 @@ int ntfs_reparse_set_wsl_symlink(struct ntfs_inode *ni,
		kvfree(reparse);
		if (!err)
			ni->target = utarget;
		else
			kfree(utarget);
	}
	return err;
}