diff options
author | Richard Weinberger <richard@nod.at> | 2018-10-18 16:36:46 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2018-11-01 12:38:15 +0100 |
commit | a1bd316e23e0098e44829b0e238ee5408996dd75 (patch) | |
tree | 3a5613af1f392f37dfb645171f2fca2d83222f28 | |
parent | cc6034721a6990f3bc51921c12be907743af9545 (diff) |
mkfs.ubifs: Implement fscrypto context store as xattr
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | ubifs-utils/mkfs.ubifs/mkfs.ubifs.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c index 349f68a..e391cda 100644 --- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c +++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c @@ -1156,36 +1156,45 @@ static int add_node(union ubifs_key *key, char *name, void *node, int len) return 0; } -static int add_xattr(struct stat *st, ino_t inum, const void *data, - unsigned int data_len, struct qstr *nm) +static int add_xattr(struct ubifs_ino_node *host_ino, struct stat *st, ino_t inum, + char *name, const void *data, unsigned int data_len) { struct ubifs_ino_node *ino; struct ubifs_dent_node *xent; + struct qstr nm; union ubifs_key xkey, nkey; int len, ret; - xent = xzalloc(sizeof(*xent) + nm->len + 1); + nm.name = name; + nm.len = strlen(name); + + host_ino->xattr_cnt++; + host_ino->xattr_size += CALC_DENT_SIZE(nm.len); + host_ino->xattr_size += CALC_XATTR_BYTES(data_len); + host_ino->xattr_names += nm.len; + + xent = xzalloc(sizeof(*xent) + nm.len + 1); ino = xzalloc(sizeof(*ino) + data_len); - xent_key_init(c, &xkey, inum, nm); + xent_key_init(c, &xkey, inum, &nm); xent->ch.node_type = UBIFS_XENT_NODE; key_write(&xkey, &xent->key); - len = UBIFS_XENT_NODE_SZ + nm->len + 1; + len = UBIFS_XENT_NODE_SZ + nm.len + 1; xent->ch.len = len; xent->padding1 = 0; xent->type = UBIFS_ITYPE_DIR; - xent->nlen = cpu_to_le16(nm->len); + xent->nlen = cpu_to_le16(nm.len); - memcpy(xent->name, nm->name, nm->len + 1); + memcpy(xent->name, nm.name, nm.len + 1); inum = ++c->highest_inum; creat_sqnum = ++c->max_sqnum; xent->inum = cpu_to_le64(inum); - ret = add_node(&xkey, nm->name, xent, len); + ret = add_node(&xkey, nm.name, xent, len); if (ret) goto out; @@ -1217,7 +1226,7 @@ static int add_xattr(struct stat *st, ino_t inum, const void *data, if (data_len) memcpy(&ino->data, data, data_len); - ret = add_node(&nkey, nm->name, ino, UBIFS_INO_NODE_SZ + data_len) ; + ret = add_node(&nkey, nm.name, ino, UBIFS_INO_NODE_SZ + data_len) ; out: free(xent); @@ -1270,7 +1279,6 @@ static int inode_add_xattr(struct ubifs_ino_node *host_ino, const char *path_name, struct stat *st, ino_t inum) { int ret; - struct qstr nm; void *buf = NULL; ssize_t len; ssize_t pos = 0; @@ -1327,15 +1335,7 @@ static int inode_add_xattr(struct ubifs_ino_node *host_ino, continue; } - nm.name = name; - nm.len = strlen(name); - - host_ino->xattr_cnt++; - host_ino->xattr_size += CALC_DENT_SIZE(nm.len); - host_ino->xattr_size += CALC_XATTR_BYTES(attrsize); - host_ino->xattr_names += nm.len; - - ret = add_xattr(st, inum, attrbuf, attrsize, &nm); + ret = add_xattr(host_ino, st, inum, name, attrbuf, attrsize); if (ret < 0) goto out_free; } @@ -1415,6 +1415,15 @@ static inline int inode_add_selinux_xattr(struct ubifs_ino_node *host_ino, } #endif +static int set_fscrypt_context(struct ubifs_ino_node *host_ino, ino_t inum, + struct stat *host_st, + struct fscrypt_context *fctx) +{ + return add_xattr(host_ino, host_st, inum, + UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT, + fctx, sizeof(*fctx)); +} + /** * add_inode - write an inode. * @st: stat information of source inode @@ -1484,6 +1493,12 @@ static int add_inode(struct stat *st, ino_t inum, void *data, return ret; } + if (fctx) { + ret = set_fscrypt_context(ino, inum, st, fctx); + if (ret < 0) + return ret; + } + return add_node(&key, NULL, ino, len); } |