From: sashiko-bot@kernel.org
To: "Tarun Sahu" <tarunsahu@google.com>,
"Pasha Tatashin" <pasha.tatashin@soleen.com>,
"Mike Rapoport" <rppt@kernel.org>,
robin.murphy@arm.com, maz@kernel.org, will@kernel.org,
"David Matlack" <dmatlack@google.com>,
"Alexander Graf" <graf@amazon.com>,
seanjc@google.com, jgg@nvidia.com, loganodell@google.com,
arnd@arndb.de, dwmw2@infradead.org, baolu.lu@linux.intel.com,
"Bjorn Helgaas" <bhelgaas@google.com>,
oupton@kernel.org, alex@shazbot.org, gle.com@google.com,
pbonzini@redhat.com, "Andrew Morton" <akpm@linux-foundation.org>,
kevin.tian@intel.com, joro@8bytes.org
Cc: kvmarm@lists.linux.dev, linux-pci@vger.kernel.org,
"Pratyush Yadav" <pratyush@kernel.org>,
kexec@lists.infradead.org, kvm@vger.kernel.org,
skhawaja@google.com, sagis@google.com, linux-mm@kvack.org
Subject: Re: [PATCH v4 18/19] mm: memfd_luo: Add feature header to struct memfd_luo_folio_ser
Date: Wed, 11 Nov 2026 06:16:57 +0000 [thread overview]
Message-ID: <sashiko-outbox-208421@kernel.org> (raw)
In-Reply-To: <20261110050202.529473-19-tarunsahu@google.com>
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] mm: memfd_luo: folio leak on kho_ser_validate() failure in
retrieve/discard
--
commit c3d8dd278c3f1e63ea2c973472e060bae843ec49
Author: Tarun Sahu <tarunsahu@google.com>
mm: memfd_luo: Add feature header to struct memfd_luo_folio_ser
This commit adds a struct kho_ser_hdr feature header to each serialized
memfd folio entry and validates it during retrieve and discard.
> diff --git a/mm/memfd_luo.c b/mm/memfd_luo.c
> index 94510f73a6069..c00daa8a508e1 100644
> --- a/mm/memfd_luo.c
> +++ b/mm/memfd_luo.c
[ ... ]
> @@ -384,16 +391,23 @@ static void memfd_luo_unpreserve(struct liveupdate_file_op_args *args)
> inode_unlock(inode);
> }
>
> -static void memfd_luo_discard_folios(const struct memfd_luo_folio_ser *folios_ser,
> +static void memfd_luo_discard_folios(const DECLARE_KHO_SER_HDR(memfd_luo_folio_ser, *folios_ser),
> u64 nr_folios)
> {
> + const DECLARE_KHO_SER_HDR(memfd_luo_folio_ser, *fhdr) = folios_ser;
> u64 i;
>
> - for (i = 0; i < nr_folios; i++) {
> - const struct memfd_luo_folio_ser *pfolio = &folios_ser[i];
> + for (i = 0; i < nr_folios; i++, fhdr = (const void *)fhdr + fhdr->size) {
> + const struct memfd_luo_folio_ser *pfolio;
> struct folio *folio;
> phys_addr_t phys;
>
> + if (kho_ser_validate(fhdr, memfd_luo_folio_ser)) {
> + pr_warn("invalid folio feature header, folios not discarded\n");
> + return;
> + }
> +
> + pfolio = kho_ser_payload(fhdr, memfd_luo_folio_ser);
> if (!pfolio->pfn)
> continue;
[ ... ]
> @@ -447,9 +461,10 @@ static void memfd_luo_finish(struct liveupdate_file_op_args *args)
> }
>
> static int memfd_luo_retrieve_folios(struct file *file,
> - struct memfd_luo_folio_ser *folios_ser,
> + const DECLARE_KHO_SER_HDR(memfd_luo_folio_ser, *folios_ser),
> u64 nr_folios)
> {
> + const DECLARE_KHO_SER_HDR(memfd_luo_folio_ser, *fhdr) = folios_ser;
> struct inode *inode = file_inode(file);
> struct address_space *mapping = inode->i_mapping;
> struct folio *folio;
> @@ -457,12 +472,20 @@ static int memfd_luo_retrieve_folios(struct file *file,
> int err = -EIO;
> long i;
>
> - for (i = 0; i < nr_folios; i++) {
> - const struct memfd_luo_folio_ser *pfolio = &folios_ser[i];
> + for (i = 0; i < nr_folios; i++, fhdr = (const void *)fhdr + fhdr->size) {
> + const struct memfd_luo_folio_ser *pfolio;
> phys_addr_t phys;
> u64 index;
> int flags;
>
> + err = kho_ser_validate(fhdr, memfd_luo_folio_ser);
> + if (err) {
> + pr_err("memfd_luo_folio_ser feature validation failed: %pe\n",
> + ERR_PTR(err));
> + goto put_folios;
> + }
> +
> + pfolio = kho_ser_payload(fhdr, memfd_luo_folio_ser);
> if (!pfolio->pfn)
> continue;
>
> @@ -472,7 +495,7 @@ static int memfd_luo_retrieve_folios(struct file *file,
> pr_err("Unable to restore folio at physical address: %llx\n",
> phys);
> err = -EIO;
> - goto put_folios;
> + goto next_put_folios;
> }
> index = pfolio->index;
> flags = pfolio->flags;
> @@ -524,15 +547,22 @@ static int memfd_luo_retrieve_folios(struct file *file,
> unlock_folio:
> folio_unlock(folio);
> folio_put(folio);
> +next_put_folios:
> + i++;
> + fhdr = (const void *)fhdr + fhdr->size;
> put_folios:
> /*
> * Note: don't free the folios already added to the file. They will be
> * freed when the file is freed. Free the ones not added yet here.
> */
> - for (long j = i + 1; j < nr_folios; j++) {
> - const struct memfd_luo_folio_ser *pfolio = &folios_ser[j];
> + for (; i < nr_folios; i++, fhdr = (const void *)fhdr + fhdr->size) {
> + const struct memfd_luo_folio_ser *pfolio;
> phys_addr_t phys;
>
> + if (kho_ser_validate(fhdr, memfd_luo_folio_ser))
> + break;
> +
> + pfolio = kho_ser_payload(fhdr, memfd_luo_folio_ser);
> if (!pfolio->pfn)
> continue;
[Severity: Medium]
Does this leak the remaining preserved folios when kho_ser_validate()
fails?
When kho_ser_validate() fails on entry i in memfd_luo_retrieve_folios(),
it jumps to put_folios with fhdr still pointing at entry i. The cleanup
loop then calls kho_ser_validate(fhdr, memfd_luo_folio_ser) on that same
entry and immediately breaks, leaving entry i and all subsequent entries
un-restored and permanently leaked.
Similarly, memfd_luo_discard_folios() returns on the first validation
failure instead of continuing or still restoring pfolio->pfn across the
array using fhdr->size, which only checks for unknown required feature
bits while the base payload and entry stride remain valid.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261110050202.529473-1-tarunsahu@google.com?part=18
next prev parent reply other threads:[~2026-11-11 6:17 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 5:01 [PATCH v4 00/19] kho, liveupdate: Add feature header for fine-grained ABI compatibility Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 01/19] liveupdate, kho: Remove __packed from KHO, LUO and memfd ABI structures Tarun Sahu
2026-11-10 12:56 ` Pasha Tatashin
2026-11-10 17:28 ` tarunsahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 02/19] kho: block: Record the entry size in the block header Tarun Sahu
2026-11-10 13:10 ` Pasha Tatashin
2026-11-11 5:45 ` tarunsahu
2026-11-10 17:03 ` David Matlack
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 03/19] kho, memfd_luo: Reference struct kho_vmalloc via serialized pointer Tarun Sahu
2026-11-10 14:23 ` Pasha Tatashin
2026-11-11 6:20 ` tarunsahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 04/19] liveupdate: Reference struct luo_file_set_ser " Tarun Sahu
2026-11-10 14:47 ` Pasha Tatashin
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 05/19] kho: Add feature header for fine-grained ABI compatibility Tarun Sahu
2026-11-10 14:47 ` Pasha Tatashin
2026-11-10 18:13 ` tarunsahu
2026-11-10 15:12 ` Pasha Tatashin
2026-11-10 18:25 ` tarunsahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 06/19] kho: kexec_metadata: Add the feature header Tarun Sahu
2026-11-10 15:08 ` Pasha Tatashin
2026-11-11 6:33 ` tarunsahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 07/19] kho: vmalloc: " Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 08/19] kho: block: Add the feature header to blocks Tarun Sahu
2026-11-10 17:07 ` David Matlack
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 09/19] liveupdate: Add feature header to struct luo_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 10/19] liveupdate: Add feature header to struct luo_session_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 11/19] liveupdate: Add feature header to struct luo_file_set_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 12/19] liveupdate: Add feature header to struct luo_file_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 13/19] liveupdate: Add feature header to struct luo_flb_header_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 14/19] liveupdate: Add feature header to struct luo_flb_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 15/19] PCI: liveupdate: Add feature header to struct pci_ser Tarun Sahu
2026-11-10 16:39 ` David Matlack
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:01 ` [PATCH v4 16/19] PCI: liveupdate: Add feature header to struct pci_dev_ser Tarun Sahu
2026-11-10 16:23 ` David Matlack
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:02 ` [PATCH v4 17/19] mm: memfd_luo: Add feature header to struct memfd_luo_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 5:02 ` [PATCH v4 18/19] mm: memfd_luo: Add feature header to struct memfd_luo_folio_ser Tarun Sahu
2026-11-11 6:16 ` sashiko-bot [this message]
2026-11-10 5:02 ` [PATCH v4 19/19] kho: Add KUnit test for the feature header helpers Tarun Sahu
2026-11-11 6:16 ` sashiko-bot
2026-11-10 12:48 ` [PATCH v4 00/19] kho, liveupdate: Add feature header for fine-grained ABI compatibility Pasha Tatashin
2026-11-11 5:36 ` tarunsahu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-208421@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alex@shazbot.org \
--cc=arnd@arndb.de \
--cc=baolu.lu@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=dmatlack@google.com \
--cc=dwmw2@infradead.org \
--cc=gle.com@google.com \
--cc=graf@amazon.com \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kexec@lists.infradead.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-mm@kvack.org \
--cc=linux-pci@vger.kernel.org \
--cc=loganodell@google.com \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=pasha.tatashin@soleen.com \
--cc=pbonzini@redhat.com \
--cc=pratyush@kernel.org \
--cc=robin.murphy@arm.com \
--cc=rppt@kernel.org \
--cc=sagis@google.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=seanjc@google.com \
--cc=skhawaja@google.com \
--cc=tarunsahu@google.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.