[PATCH] erofs-utils: sort shared xattr
Gao Xiang
hsiangkao at linux.alibaba.com
Thu Oct 21 18:25:49 AEDT 2021
Hi Jianan,
On Thu, Oct 21, 2021 at 10:58:47AM +0800, Huang Jianan via Linux-erofs wrote:
> Sort shared xattr before writing to disk to ensure the consistency
> of reproducible builds.
How about adding it as an option?
> ---
> lib/xattr.c | 34 ++++++++++++++++++++++++++++++----
> 1 file changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/lib/xattr.c b/lib/xattr.c
> index 196133a..f17e57e 100644
> --- a/lib/xattr.c
> +++ b/lib/xattr.c
> @@ -171,7 +171,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key,
> /* allocate key-value buffer */
> len[0] = keylen - prefixlen;
>
> - kvbuf = malloc(len[0] + len[1]);
> + kvbuf = malloc(len[0] + len[1] + 1);
> if (!kvbuf)
> return ERR_PTR(-ENOMEM);
> memcpy(kvbuf, key + prefixlen, len[0]);
> @@ -196,6 +196,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key,
> len[1] = ret;
> }
> }
> + kvbuf[len[0] + len[1]] = '\0';
> return get_xattritem(prefix, kvbuf, len);
> }
>
> @@ -398,7 +399,7 @@ static int erofs_droid_xattr_set_caps(struct erofs_inode *inode)
> len[0] = sizeof("capability") - 1;
> len[1] = sizeof(caps);
>
> - kvbuf = malloc(len[0] + len[1]);
> + kvbuf = malloc(len[0] + len[1] + 1);
> if (!kvbuf)
> return -ENOMEM;
>
> @@ -409,6 +410,7 @@ static int erofs_droid_xattr_set_caps(struct erofs_inode *inode)
> caps.data[1].permitted = (u32) (capabilities >> 32);
> caps.data[1].inheritable = 0;
> memcpy(kvbuf + len[0], &caps, len[1]);
> + kvbuf[len[0] + len[1]] = '\0';
>
> item = get_xattritem(EROFS_XATTR_INDEX_SECURITY, kvbuf, len);
> if (IS_ERR(item))
> @@ -562,13 +564,23 @@ static struct erofs_bhops erofs_write_shared_xattrs_bhops = {
> .flush = erofs_bh_flush_write_shared_xattrs,
> };
>
> +static int comp_xattr_item(const void *a, const void *b)
> +{
> + const struct xattr_item *ia, *ib;
> +
> + ia = (*((const struct inode_xattr_node **)a))->item;
> + ib = (*((const struct inode_xattr_node **)b))->item;
> +
> + return strcmp(ia->kvbuf, ib->kvbuf);
could we use strncmp (len[0] + len[1]) instead?
Thanks,
Gao Xiang
More information about the Linux-erofs
mailing list