From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=74.125.82.53 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793394620; b=rvYE1oEjwiGCfiimqm3q2Ayiu8lhK1yVVAI+RkOV0QtlnyOZH4qzQ+SeUjyX2UkVTptK 0mNM+3iKyo9rQTmVxt+lFVH38MHcHGej5PttT0XwdaiXESwp/E7D7Re4UgfI20nh2vHAb wm74wJO6TQrHt/wg9Yofz0oMnFKOghDNz8Jkw2pJex5OTQQ/Yv2nat/q9RRnrf8W8rNHX OC1wy6SrjBaxm3ViMzZqmmPzQkUzqygJzzXDWtMiJg/EYfivFNVKNb2hZLfLI0ENYpiXY D40goYYY7yRfbzYgpApzX1WV9Czag05Pp73a1wEiizpxQAm8h0qppAGU+Zk99ZlzyoQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793394620; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding; bh=NRj5hwEzENLjlsB+UAcfFJohIr0Hf4YgXfYZEvjse4o=; b=DEKkCPyvk8iKkcYsU2VGiId6S7lW86C0PTrdjutsQdAPk/HIxlf/gJI+qN3iYVk0t3+U 0IbYHv+k3RS8PFzB6aISQ+ql3wstp3bJIYG2EPceSW9oASCPISYJLEf6IZb3VEeJAyBq7 YuWIpSPwPI+hxd2qAgUmc5rVp8XssVAAda1YQwZaaGjW25wBJrkHmO3Uvh5FE+OE5pnso ptUfq1AlNS62L5Fn9AWUXmyyL/HTF05YnkuXF+WM53j9PPZDPpGvY1rpMjUWXXfECLstZ CaU0REVfltCZHqTpBUrkEgm0NMcQZmbW6OXk63L142/q27TBZ6cpK3/ZFn46nJfh1Iw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=arista.com; spf=pass smtp.mailfrom=arista.com; dkim=pass header.d=arista.com header.i=@arista.com header.a=rsa-sha256 header.s=google header.b=Q+l1mbbi; arc=none smtp.remote-ip=74.125.82.53 Received: from mail-dl1-f53.google.com (mail-dl1-f53.google.com [74.125.82.53]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9C0160A2629 for ; Fri, 30 Oct 2026 21:10:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org D9C0160A2629 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=arista.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arista.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=arista.com header.i=@arista.com header.a=rsa-sha256 header.s=google header.b=Q+l1mbbi Received: by mail-dl1-f53.google.com with SMTP id a92af1059eb24-1846bc43c28so1413029c88.0 for ; Fri, 30 Oct 2026 14:10:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=google; t=1793394618; x=1793999418; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=NRj5hwEzENLjlsB+UAcfFJohIr0Hf4YgXfYZEvjse4o=; b=Q+l1mbbiKUvjbillm6pdJDpPjF2pQbA9OXFE3js3iBgUUgRIvYtGZk1vlSB8K/HTYA JHLWZiJdKozGA+8AxwHbiJNr/oGfNBn1ferC3KPHky9ffn1z68fIGBbdcJkXju0iMcjW D7U+S4awiVjIJvkF7oc3ImP0tcsgng9AgW3ZnSKa67rHNurXCk1N9rZPBacfFZaYkbNf GLpXVaw0Vn7aHSe6c1RH7FMY2Y0M8a9KhDUI6N/CNshZuvHLimKPE9hD1zC08ZX9FBNm tiLFtax3PWuUY+9ZwdfpCHLjjYVGmkIWm3+1+49K8AAuIDQ6MaoqvIsBm3lhULlRz9Og 7KMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793394618; x=1793999418; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=NRj5hwEzENLjlsB+UAcfFJohIr0Hf4YgXfYZEvjse4o=; b=nzu3n9yLkJHCO2iNci9V+1tnu1XOzoRzIdsJPiWbuukEwKhQGk+pjsbbMHFqxT7pqM SHiFyMl+1X7tKcZmNOAUjk6t4xei9skyK73xPIMxN8MX6IBPyvQYjkw0qyywBqIZTx6l PpijRCF9MELqu4uK7cAMbAgkL+cYAfjuHf0reSK9YtNDaezNR6+/4k9oBMDpvo89bAXw avHkLwhRP/2Cr8/c/WvWjWYYcsOkbSwEkqLx+pBX6Aoo2NvsiFoszlU7/ARr+VksfyG6 4nYdch3MfITshNuIgW1i8rox7kSn1a92F1XhUTR35uHTvlKtmGK1n0C4/Eg3HNmwGiXC EUQg== X-Forwarded-Encrypted: i=1; AKwUvBxcigfO3Ch+xXIiIby6FD5+ekA6lylsq6XcVOdBZBHdq9wz8qJGwbiV7z0RFJ4L/Bvc6IMKCqm/7eQKDNo=@vger.kernel.org X-Gm-Message-State: AFq9FYKSTrn37s6baJZ3X+aht5TBnEu0RxYQsyMGff+R28WctohmkQKC QKq2NsncD51KOfycY/RftcusJVelCzBocMm1tAqBZ2OzSVcmAymzeU17pWamNVfZsw== X-Gm-Gg: AYBFou2YoIz4UypkNvUcYSVa3TCQpNvcUa/HGBJLH2ZvBC73s6YsCiPhHTJp6/Qro97 16dGcDcZsYN2MRUzfuUR/ouYr2l+SL7ED19aZArOFLSCLBL/+ewCnEuQ3lT87trqytIJUDtsw1R umsVbmDmTdLfL/FnJAUHGfSisMq3mPhotYQdcY4wp/WP9TZdLpkVKluXGKQyybHjkE5KNz9vIOT 6mKQ2+HDXk1D8sG7kDqEdgxr/KUwCKz0OKLrcgFLK9in63rZLI4jx+U9Lhk43NB/pix/EhrMUO/ 7lAGOGXLBwCBV0ulBu6D7hu7lkqfBo71sddCxfg5vmfYALgOgBlZnKOl2SekjJNV3mlL+Zg1JBG UZFnys0V4TuG09JdM6G4aRw5bA4onT0V3J9kiSnfvgyheXWrBo1fL0PDjpiAqaaD8/GK8gf1Ib7 ICM/OkPH/tsmWub1GJrTfn5d4HVu4M2kBDC06ek+LZ37dqdB7vf9msLPtYIc2Y0bNfPpJ8hAXQH Zob5MlSXdivR1hvJHLlIuOiqoP8KwENa4hp+LpICqQuzD+oGjUpr6dYN4fH3X1AU6yZWqCskLO2 79h9ttqdrpwI/77bS9XA6AvrENbp7fnK5yka4X5QSXXLJREB64tpcSNilEVx0/nzuVaGUFKpVHU t9KvZvohgn5+Kwy59PWdOOQE= X-Received: by 2002:a05:7022:2581:b0:1a8:7b58:6f1b with SMTP id a92af1059eb24-1ac5cfe587cmr5911022c88.19.1793394617878; Fri, 30 Oct 2026 14:10:17 -0700 (PDT) Received: from dannyhu-upstreamLinux.sjc.aristanetworks.com ([74.123.28.18]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-1ac1abcf67csm9471777c88.21.2026.10.30.14.10.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Oct 2026 14:10:17 -0700 (PDT) From: Danny Hu To: Alexander Viro , Christian Brauner Cc: Mimi Zohar , Roberto Sassu , Dmitry Kasatkin , Eric Snowberg , Jan Kara , Victor Kamensky , Taras Kondratiuk , Tianxing Zhang , Zheng Zengkai , zhoushuiqing , zhangguangzhi , Danny Hu , Jason Yan , silviu.vlasceanu@huawei.com, hpa@zytor.com, arnd@arndb.de, rob@landley.net, james.w.mcmechan@gmail.com, niveditas98@gmail.com, pierre@arista.com, julien@arista.com, kbharathi@arista.com, erosca@de.adit-jv.com, alexandr.lobakin@intel.com, jim_baxter@mentor.com, linux-fsdevel@vger.kernel.org, linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kbuild@vger.kernel.org, initramfs@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org, bug-cpio@gnu.org Subject: [PATCH v5 3/4] initramfs: read metadata from special file METADATA!!! Date: Fri, 30 Oct 2026 14:09:42 -0700 Message-ID: <20261030210944.2143778-4-dannyhu@arista.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20261030210944.2143778-1-dannyhu@arista.com> References: <20261030210944.2143778-1-dannyhu@arista.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Roberto Sassu Instead of changing the CPIO format, metadata are parsed from regular files with special name 'METADATA!!!'. This file immediately follows the file metadata are added to. This patch checks if the file being extracted has the special name and, if yes, creates a buffer with the content of that file and calls do_parse_metadata() to parse metadata from the buffer. Signed-off-by: Roberto Sassu Reported-by: kbuild test robot Signed-off-by: Tianxing Zhang Reviewed-by: Jason Yan Signed-off-by: Zheng Zengkai Signed-off-by: zhoushuiqing Signed-off-by: zhangguangzhi Signed-off-by: Danny Hu --- v5 changes: - clean up metadata buffer when returning from unpack_to_rootfs() init/initramfs.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/init/initramfs.c b/init/initramfs.c index 36254dba7822..a1744cc9523c 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -265,8 +265,8 @@ static void __init read_into(char *buf, unsigned size, enum state next) } } -static __initdata char *header_buf, *symlink_buf, *name_buf; -static __initdata char *metadata_buf; +static __initdata char *header_buf, *symlink_buf, *name_buf, *previous_name_buf; +static __initdata char *metadata_buf, *metadata_buf_ptr; static int __init do_start(void) { @@ -454,6 +454,7 @@ static int __init __maybe_unused do_parse_metadata(char *pathname) static __initdata struct file *wfile; static __initdata loff_t wfile_pos; +static __initdata int metadata; static int __init do_name(void) { @@ -471,6 +472,10 @@ static int __init do_name(void) if (strcmp(collected, "TRAILER!!!") == 0) { free_hash(); return 0; + } else if (strcmp(collected, METADATA_FILENAME) == 0) { + metadata = 1; + } else { + memcpy(previous_name_buf, collected, strlen(collected) + 1); } clean_path(collected, mode); if (S_ISREG(mode)) { @@ -508,11 +513,47 @@ static int __init do_name(void) return 0; } +static int __init do_process_metadata(char *buf, int len, bool last) +{ + int ret = 0; + + if (!metadata_buf) { + metadata_buf_ptr = metadata_buf = kmalloc(body_len, GFP_KERNEL); + if (!metadata_buf_ptr) { + ret = -ENOMEM; + goto out; + } + + metadata_len = body_len; + } + + if (metadata_buf_ptr + len > metadata_buf + metadata_len) { + ret = -EINVAL; + goto out; + } + + memcpy(metadata_buf_ptr, buf, len); + metadata_buf_ptr += len; + + if (last) + do_parse_metadata(previous_name_buf); +out: + if (ret < 0 || last) { + kfree(metadata_buf); + metadata_buf = NULL; + metadata = 0; + } + + return ret; +} + static int __init do_copy(void) { if (byte_count >= body_len) { if (xwrite(wfile, victim, body_len, &wfile_pos) != body_len) error("write error"); + if (metadata) + do_process_metadata(victim, body_len, true); do_utime_path(&wfile->f_path, mtime); fput(wfile); @@ -524,6 +565,8 @@ static int __init do_copy(void) } else { if (xwrite(wfile, victim, byte_count, &wfile_pos) != byte_count) error("write error"); + if (metadata) + do_process_metadata(victim, byte_count, false); body_len -= byte_count; eat(byte_count); return 1; @@ -539,6 +582,7 @@ static int __init do_symlink(void) return 1; } collected[N_ALIGN(name_len) + body_len] = '\0'; + memcpy(previous_name_buf, collected, strlen(collected) + 1); clean_path(collected, 0); init_symlink(collected + N_ALIGN(name_len), collected); init_chown(collected, uid, gid, AT_SYMLINK_NOFOLLOW); @@ -614,6 +658,7 @@ char * __init unpack_to_rootfs(char *buf, unsigned long len) char header[CPIO_HDRLEN]; char symlink[PATH_MAX + N_ALIGN(PATH_MAX) + 1]; char name[N_ALIGN(PATH_MAX)]; + char prev_name[PATH_MAX + N_ALIGN(PATH_MAX) + 1]; } *bufs = kmalloc_obj(*bufs); if (!bufs) @@ -622,6 +667,7 @@ char * __init unpack_to_rootfs(char *buf, unsigned long len) header_buf = bufs->header; symlink_buf = bufs->symlink; name_buf = bufs->name; + previous_name_buf = bufs->prev_name; state = Start; this_header = 0; @@ -664,6 +710,9 @@ char * __init unpack_to_rootfs(char *buf, unsigned long len) dir_utime(); /* free any hardlink state collected without optional TRAILER!!! */ free_hash(); + kfree(metadata_buf); + metadata_buf = NULL; + metadata = 0; kfree(bufs); return message; } -- 2.51.0