Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp1690832ybm; Thu, 23 May 2019 05:23:23 -0700 (PDT) X-Google-Smtp-Source: APXvYqx42ngrc5QaLJnT4a/8vYo2LCsGMjHWnemTVM17Uc2ueXmY9raAv/aGSluHdkdxyZp183Gh X-Received: by 2002:a17:902:7488:: with SMTP id h8mr62568918pll.315.1558614203226; Thu, 23 May 2019 05:23:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558614203; cv=none; d=google.com; s=arc-20160816; b=iAnsHraqiE6DEd53PDsrtuY63aAomYYYSte95EQRoiaLI4aE+tCiT7hjGxtiGy55AO EBOw82R0qvRIk7zeal09RjciROIIS5/4B060lsMCDuj1thGv+iBezzU5z1MbFtyCr6fU zf6bLLzTzWj2QqviEOK5ilULxD6pVF31TGe1q2u0G6QyzdEFYoGjvATAqNXK3TPL2hfb dAberKN8pLbfFQBelFs4iakRc0k0x49mIfjGX8EZIdRdYfH69/bEj7lkcGnjxQEXRnCw jrgbQ5s2miIPjzCzOgObA0mMywKbO3lkS9ScEHQgyYDNRMCRTKs5CGEIiePlY8fwQfPZ flmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=QYEEFYuFyIszNWj5u8s6lDJ4VqGoXQzc7Rx4yF6mcJo=; b=rMZSpiFmFmG0gayqlLtHBKhbjyGemIsyjVn4h1Uyb+uJsttf5iiMIDJGRnSPNEayzn wDV6Q7+JBsXRGekPlir+s7E4cWtP5C3mkowvSqkJMk37wOCbKKDdU1NcCIDEdjh846OA V7Mx1mrwdXrjqNMHbE2HfyiBGrWNfL/cZxivySVzG7rrcoR2u1PxAUVzdH59h0LHR6QE e9lXgyJpBMJjoi2cmaH1qbIul7NQRgPJ/K82wktdxgXXgwM2HlQTHkpDlKOS+iZcjqCi C4INotFz4/m4v9LfMr6cOS2KuXW5d4McIh/2wvnZWFE/l9VDvo+nHrfY9IkXd012lyzc 6jcw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l70si28339358pgd.174.2019.05.23.05.23.06; Thu, 23 May 2019 05:23:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730608AbfEWMVz (ORCPT + 99 others); Thu, 23 May 2019 08:21:55 -0400 Received: from lhrrgout.huawei.com ([185.176.76.210]:32963 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728309AbfEWMVz (ORCPT ); Thu, 23 May 2019 08:21:55 -0400 Received: from lhreml705-cah.china.huawei.com (unknown [172.18.7.108]) by Forcepoint Email with ESMTP id 1393C3ED738B108B2461; Thu, 23 May 2019 13:21:51 +0100 (IST) Received: from roberto-HP-EliteDesk-800-G2-DM-65W.huawei.com (10.204.65.154) by smtpsuk.huawei.com (10.201.108.46) with Microsoft SMTP Server (TLS) id 14.3.408.0; Thu, 23 May 2019 13:21:43 +0100 From: Roberto Sassu To: CC: , , , , , , , , , , , , , , , , , Roberto Sassu Subject: [PATCH v4 1/3] initramfs: add file metadata Date: Thu, 23 May 2019 14:18:01 +0200 Message-ID: <20190523121803.21638-2-roberto.sassu@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190523121803.21638-1-roberto.sassu@huawei.com> References: <20190523121803.21638-1-roberto.sassu@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.204.65.154] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mimi Zohar This patch adds metadata to a file from a supplied buffer. The buffer might contains multiple metadata records. The format of each record is: For now, only the TYPE_XATTR metadata type is supported. The specific format of this metadata type is: \0 [kamensky: fixed restoring of xattrs for symbolic links by using sys_lsetxattr() instead of sys_setxattr()] [sassu: removed state management, kept only do_setxattrs(), added support for generic file metadata, replaced sys_lsetxattr() with vfs_setxattr(), added check for entry_size, added check for hdr->c_size, replaced strlen() with strnlen(); moved do_setxattrs() before do_name()] Signed-off-by: Mimi Zohar Signed-off-by: Victor Kamensky Signed-off-by: Taras Kondratiuk Signed-off-by: Roberto Sassu --- include/linux/initramfs.h | 21 ++++++++++ init/initramfs.c | 88 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 include/linux/initramfs.h diff --git a/include/linux/initramfs.h b/include/linux/initramfs.h new file mode 100644 index 000000000000..2f8cee441236 --- /dev/null +++ b/include/linux/initramfs.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * include/linux/initramfs.h + * + * Include file for file metadata in the initial ram disk. + */ +#ifndef _LINUX_INITRAMFS_H +#define _LINUX_INITRAMFS_H + +#define METADATA_FILENAME "METADATA!!!" + +enum metadata_types { TYPE_NONE, TYPE_XATTR, TYPE__LAST }; + +struct metadata_hdr { + char c_size[8]; /* total size including c_size field */ + char c_version; /* header version */ + char c_type; /* metadata type */ + char c_metadata[]; /* metadata */ +} __packed; + +#endif /*LINUX_INITRAMFS_H*/ diff --git a/init/initramfs.c b/init/initramfs.c index 178130fd61c2..5de396a6aac0 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -10,6 +10,9 @@ #include #include #include +#include +#include +#include static ssize_t __init xwrite(int fd, const char *p, size_t count) { @@ -146,7 +149,7 @@ static __initdata time64_t mtime; static __initdata unsigned long ino, major, minor, nlink; static __initdata umode_t mode; -static __initdata unsigned long body_len, name_len; +static __initdata unsigned long body_len, name_len, metadata_len; static __initdata uid_t uid; static __initdata gid_t gid; static __initdata unsigned rdev; @@ -218,7 +221,7 @@ static void __init read_into(char *buf, unsigned size, enum state next) } } -static __initdata char *header_buf, *symlink_buf, *name_buf; +static __initdata char *header_buf, *symlink_buf, *name_buf, *metadata_buf; static int __init do_start(void) { @@ -315,6 +318,87 @@ static int __init maybe_link(void) return 0; } +static int __init do_setxattrs(char *pathname, char *buf, size_t size) +{ + struct path path; + char *xattr_name, *xattr_value; + size_t xattr_name_size, xattr_value_size; + int ret; + + xattr_name = buf; + xattr_name_size = strnlen(xattr_name, size); + if (xattr_name_size == size) { + error("malformed xattrs"); + return -EINVAL; + } + + xattr_value = xattr_name + xattr_name_size + 1; + xattr_value_size = buf + size - xattr_value; + + ret = kern_path(pathname, 0, &path); + if (!ret) { + ret = vfs_setxattr(path.dentry, xattr_name, xattr_value, + xattr_value_size, 0); + + path_put(&path); + } + + pr_debug("%s: %s size: %lu val: %s (ret: %d)\n", pathname, + xattr_name, xattr_value_size, xattr_value, ret); + + return ret; +} + +static int __init __maybe_unused do_parse_metadata(char *pathname) +{ + char *buf = metadata_buf; + char *bufend = metadata_buf + metadata_len; + struct metadata_hdr *hdr; + char str[sizeof(hdr->c_size) + 1]; + size_t entry_size; + + if (!metadata_len) + return 0; + + str[sizeof(hdr->c_size)] = 0; + + while (buf < bufend) { + int ret; + + if (buf + sizeof(*hdr) > bufend) { + error("malformed metadata"); + break; + } + + hdr = (struct metadata_hdr *)buf; + if (hdr->c_version != 1) { + pr_debug("Unsupported header version\n"); + break; + } + + memcpy(str, hdr->c_size, sizeof(hdr->c_size)); + ret = kstrtoul(str, 16, &entry_size); + if (ret || buf + entry_size > bufend || !entry_size) { + error("malformed xattrs"); + break; + } + + switch (hdr->c_type) { + case TYPE_XATTR: + do_setxattrs(pathname, buf + sizeof(*hdr), + entry_size - sizeof(*hdr)); + break; + default: + pr_debug("Unsupported metadata type\n"); + break; + } + + buf += entry_size; + } + + return 0; +} + static __initdata int wfd; static int __init do_name(void) -- 2.17.1