Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2162204yba; Fri, 17 May 2019 11:34:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqxhISLvv8zzviQ7QDH0kyass8IbK6GfuCzEiUN80QDIJ+R+ofi1su4fKQzL2tkzBXZazkWg X-Received: by 2002:a17:902:7d90:: with SMTP id a16mr57086266plm.122.1558118092772; Fri, 17 May 2019 11:34:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558118092; cv=none; d=google.com; s=arc-20160816; b=VaRef1fUZK+zseLfsklO6NOSz0o6dfiRDpKMcTsu3It5NmKt+N4/2nXaahielXd/7U ygVUp4dv0P/0PAsIlF2imBPAJNiRa64S9cIo5ZZdYSHiYgsGW33SvEzniYw95zQ/3XJ3 vsttUtsd8JX4ZDqc2mGZ0yseeIq0nzoCbd2aFJxQ6gvB036VtjQYLEcjc7cA8XfHF8PX G1CPy02XcxNtdi/OKuztJLLYs4xA0aDGkNz2u4zejU7XJWmvM7KNJl64qT2Z34flnZsq bJGxL0pFXuPoNMIkFj3c8sGSF+5X7tuI0UgwpYJYaUkuh9HQzBRiqbGSZGBVhe5wpCDr YowQ== 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=S+rvQ2cLlLkyjL0B5HqwmeFvqVQ22COUOSUAGiAmZ+g=; b=tCR3CL8wJjGSpkUUfh7LrKOgK5SSAJg6vacnwOpUWmPv/5SMnHrUhQThVHn1ozxQ7I lKDEOKp4DXxYEy9O0CDO72bl+iZ/S13vdBKpgBiDjr19Hka83QSYYU0VXqJbMVLNdyKM 9MgfmpMhJ8xX41fMeM9xjvojnsiFHAjR9YSdzy7VG4OIVmegcUveUH/S9F5TYBWXnU9Z Ztv1UrClbrgQ5LJYRmGI3aD1/Uk/tzmzmqOO/6F8sy6dZFzdwsVyYRG3ghDXSQtdfIOw +a6debsiLqSBmyZTMC7RujBuCDZ03NO30e2CvVnxoGCDs73rdI9j9w+6ekkSEZNBFcsU uSSg== 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 v21si8373090plo.34.2019.05.17.11.34.38; Fri, 17 May 2019 11:34:52 -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 S1727936AbfEQQ7i (ORCPT + 99 others); Fri, 17 May 2019 12:59:38 -0400 Received: from lhrrgout.huawei.com ([185.176.76.210]:32952 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726575AbfEQQ7i (ORCPT ); Fri, 17 May 2019 12:59:38 -0400 Received: from lhreml707-cah.china.huawei.com (unknown [172.18.7.106]) by Forcepoint Email with ESMTP id 603483F45E49C5D0A908; Fri, 17 May 2019 17:59:36 +0100 (IST) Received: from roberto-HP-EliteDesk-800-G2-DM-65W.huawei.com (10.204.65.154) by smtpsuk.huawei.com (10.201.108.48) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 17 May 2019 17:59:25 +0100 From: Roberto Sassu To: CC: , , , , , , , , , , , , , , , , Roberto Sassu Subject: [PATCH v3 1/2] initramfs: set extended attributes Date: Fri, 17 May 2019 18:55:18 +0200 Message-ID: <20190517165519.11507-2-roberto.sassu@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190517165519.11507-1-roberto.sassu@huawei.com> References: <20190517165519.11507-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 xattrs to a file, with name and value taken from a supplied buffer. The data format 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(), replaced sys_lsetxattr() with vfs_setxattr(), added check for xattr_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 --- init/initramfs.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/init/initramfs.c b/init/initramfs.c index 435a428c2af1..0c6dd1d5d3f6 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include static ssize_t __init xwrite(int fd, const char *p, size_t count) { @@ -146,7 +148,8 @@ 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 u32 name_len, xattr_len; +static __initdata u64 body_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, *xattr_buf; static int __init do_start(void) { @@ -315,6 +318,70 @@ static int __init maybe_link(void) return 0; } +struct xattr_hdr { + char c_size[8]; /* total size including c_size field */ + char c_data[]; /* \0 */ +}; + +static int __init __maybe_unused do_setxattrs(char *pathname) +{ + char *buf = xattr_buf; + char *bufend = buf + xattr_len; + struct xattr_hdr *hdr; + char str[sizeof(hdr->c_size) + 1]; + struct path path; + + if (!xattr_len) + return 0; + + str[sizeof(hdr->c_size)] = 0; + + while (buf < bufend) { + char *xattr_name, *xattr_value; + unsigned long xattr_entry_size; + unsigned long xattr_name_size, xattr_value_size; + int ret; + + if (buf + sizeof(hdr->c_size) > bufend) { + error("malformed xattrs"); + break; + } + + hdr = (struct xattr_hdr *)buf; + memcpy(str, hdr->c_size, sizeof(hdr->c_size)); + ret = kstrtoul(str, 16, &xattr_entry_size); + buf += xattr_entry_size; + if (ret || buf > bufend || !xattr_entry_size) { + error("malformed xattrs"); + break; + } + + xattr_name = hdr->c_data; + xattr_name_size = strnlen(xattr_name, + xattr_entry_size - sizeof(hdr->c_size)); + if (xattr_name_size == xattr_entry_size - sizeof(hdr->c_size)) { + error("malformed xattrs"); + break; + } + + xattr_value = xattr_name + xattr_name_size + 1; + xattr_value_size = buf - 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 0; +} + static __initdata int wfd; static int __init do_name(void) -- 2.17.1