}
item = malloc(sizeof(*item));
- if (!item) {
- free(kvbuf);
+ if (!item)
return ERR_PTR(-ENOMEM);
- }
if (!match_prefix(kvbuf, &item->base_index, &item->prefix_len)) {
free(item);
- free(kvbuf);
return ERR_PTR(-ENODATA);
}
DBG_BUGON(len[0] < item->prefix_len);
unsigned int keylen)
{
ssize_t ret;
+ struct xattr_item *item;
unsigned int len[2];
char *kvbuf;
ret = getxattr(path, key, kvbuf + EROFS_XATTR_KSIZE(len),
len[1], 0, XATTR_NOFOLLOW);
#else
- free(kvbuf);
- return ERR_PTR(-EOPNOTSUPP);
+ ret = -EOPNOTSUPP;
+ goto out;
#endif
if (ret < 0) {
- free(kvbuf);
- return ERR_PTR(-errno);
+ ret = -errno;
+ goto out;
}
if (len[1] != ret) {
- erofs_err("size of xattr value got changed just now (%u-> %ld)",
+ erofs_warn("size of xattr value got changed just now (%u-> %ld)",
len[1], (long)ret);
len[1] = ret;
}
}
- return get_xattritem(kvbuf, len);
+
+ item = get_xattritem(kvbuf, len);
+ if (!IS_ERR(item))
+ return item;
+ if (item == ERR_PTR(-ENODATA)) {
+ erofs_warn("skipped unidentified xattr: %s", key);
+ ret = 0;
+ } else {
+ ret = PTR_ERR(item);
+ }
+out:
+ free(kvbuf);
+ return ERR_PTR(ret);
}
static struct xattr_item *erofs_get_selabel_xattr(const char *srcpath,
int ret;
unsigned int len[2];
char *kvbuf, *fspath;
+ struct xattr_item *item;
if (cfg.mount_point)
ret = asprintf(&fspath, "/%s/%s", cfg.mount_point,
sprintf(kvbuf, "%s", XATTR_NAME_SECURITY_SELINUX);
memcpy(kvbuf + EROFS_XATTR_KSIZE(len), secontext, len[1]);
freecon(secontext);
- return get_xattritem(kvbuf, len);
+ item = get_xattritem(kvbuf, len);
+ if (IS_ERR(item))
+ free(kvbuf);
+ return item;
}
#endif
return NULL;
if (cfg.sehnd && !strcmp(key, XATTR_SECURITY_PREFIX "selinux"))
return true;
#endif
-
- /* skip xattrs with unidentified "system." prefix */
- if (!strncmp(key, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) {
- if (!strcmp(key, XATTR_NAME_POSIX_ACL_ACCESS) ||
- !strcmp(key, XATTR_NAME_POSIX_ACL_DEFAULT)) {
- return false;
- } else {
- erofs_warn("skip unidentified xattr: %s", key);
- return true;
- }
- }
-
return false;
}
memcpy(kvbuf + EROFS_XATTR_KSIZE(len), value, size);
item = get_xattritem(kvbuf, len);
- if (IS_ERR(item))
+ if (IS_ERR(item)) {
+ free(kvbuf);
return PTR_ERR(item);
+ }
DBG_BUGON(!item);
return erofs_xattr_add(&inode->i_xattrs, item);
memcpy(kvbuf + EROFS_XATTR_KSIZE(len), &caps, len[1]);
item = get_xattritem(kvbuf, len);
- if (IS_ERR(item))
+ if (IS_ERR(item)) {
+ free(kvbuf);
return PTR_ERR(item);
+ }
DBG_BUGON(!item);
return erofs_xattr_add(&inode->i_xattrs, item);