From 11e126b1627d8c74887c85dffd9cda7671893066 Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Fri, 6 Sep 2019 09:58:46 +0000 Subject: [PATCH] btrfs-progs: mkfs: fix xattr enumeration Use the return value of listxattr instead of tokenizing. The end of the extended attribute list is indicated by the return value, not an empty list item (two consecutive NULs). Using strtok in this way thus sometimes caused add_xattr_item to reuse stack data in xattr_list from the previous invocation, thus querying attributes that are not actually in the file's xattr list. Issue: #194 Reviewed-by: Nikolay Borisov Signed-off-by: Vladimir Panteleev Signed-off-by: David Sterba --- mkfs/rootdir.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/mkfs/rootdir.c b/mkfs/rootdir.c index 51411e02..c86159e7 100644 --- a/mkfs/rootdir.c +++ b/mkfs/rootdir.c @@ -228,10 +228,9 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, int ret; int cur_name_len; char xattr_list[XATTR_LIST_MAX]; + char *xattr_list_end; char *cur_name; char cur_value[XATTR_SIZE_MAX]; - char delimiter = '\0'; - char *next_location = xattr_list; ret = llistxattr(file_name, xattr_list, XATTR_LIST_MAX); if (ret < 0) { @@ -243,10 +242,10 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, if (ret == 0) return ret; - cur_name = strtok(xattr_list, &delimiter); - while (cur_name != NULL) { + xattr_list_end = xattr_list + ret; + cur_name = xattr_list; + while (cur_name < xattr_list_end) { cur_name_len = strlen(cur_name); - next_location += cur_name_len + 1; ret = lgetxattr(file_name, cur_name, cur_value, XATTR_SIZE_MAX); if (ret < 0) { @@ -266,7 +265,7 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, file_name); } - cur_name = strtok(next_location, &delimiter); + cur_name += cur_name_len + 1; } return ret;