From: Stefano Stabellini <sstabellini@kernel.org>
To: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Cc: jgross@suse.com, sstabellini@kernel.org,
oleksandr_tyshchenko@epam.com, boris.ostrovsky@oracle.com,
xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH 1/2] xen/pvcalls: unwind pvcalls_new_active_socket() step by step
Date: Mon, 9 Nov 2026 16:55:45 -0800 (PST) [thread overview]
Message-ID: <ce00c906-e984-4363-a2cf-447d21339a67@kernel.org> (raw)
In-Reply-To: <20261109122324.30134-2-yhlee@isslab.korea.ac.kr>
On Mon, 9 Nov 2026, Yehyeong Lee wrote:
> Every error path in pvcalls_new_active_socket() jumps to one shared label
> that does list_del(&map->list) and then hands map to
> pvcalls_back_release_active(). But map comes from kzalloc() and its
> list_head is only published at the very end of the function, after the last
> of those jumps:
>
> down(&fedata->socket_lock);
> list_add_tail(&map->list, &fedata->socket_mappings);
> up(&fedata->socket_lock);
>
> so on the error path map->list is still {NULL, NULL} and __list_del()
> writes through a NULL pointer.
>
> A frontend gets there with one value it owns: the ring_order field of the
> page it granted. Anything above MAX_RING_ORDER takes the second goto, and
> nothing else in the function has run by then.
>
> The result is an oops in whichever context handled the request - the
> pvcalls-back threaded IRQ handler for PVCALLS_CONNECT, mappass->wq for
> PVCALLS_ACCEPT - and because it happens after down(&fedata->socket_lock)
> that semaphore is never released, so every later operation on the frontend
> blocks on it and the backend never completes backend_disconnect(). (With
> CONFIG_DEBUG_LIST the list_del() only reports and returns, and
> pvcalls_back_release_active() then runs on a map whose irq is still 0 and
> whose bytes, ioworker.wq and saved_data_ready are all NULL.)
>
> A frontend asking for ring_order 5, on a dom0 built with KASAN
> (the request was issued by a test-only change to the frontend):
>
> [ 133.728877] pvcalls_new_active_socket frontend requested ring_order 5, which is > MAX (4)
> [ 133.732868] Oops: general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] SMP KASAN NOPTI
> [ 133.737910] KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
> [ 133.741666] CPU: 0 UID: 0 PID: 133 Comm: irq/39-pvcalls- Not tainted 7.3.0-kCTLblk2-15482-g21a7f44fd076-dirty #1 PREEMPT(full)
> [ 133.746986] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
> [ 133.751512] RIP: 0010:pvcalls_new_active_socket+0x821/0xb90
> [ 133.754237] Code: 48 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 f6 01 00 00 48 8d 79 08 4c 8b 6b 08 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 14 02 00 00 4c 89 ea 4c 89 69 08 48 b8 00 00 00
> [ 133.763126] RSP: 0018:ffffc900004afb38 EFLAGS: 00010202
> [ 133.765861] RAX: dffffc0000000000 RBX: ffff88810886c900 RCX: 0000000000000000
> [ 133.769348] RDX: 0000000000000001 RSI: 0000000000000246 RDI: 0000000000000008
> [ 133.772787] RBP: 1ffff92000095f6b R08: 0000000000000001 R09: fffff52000095f58
> [ 133.776260] R10: 0000000000000003 R11: ffff888100077320 R12: ffff88810858b410
> [ 133.779823] R13: 0000000000000000 R14: ffff88810858b460 R15: ffff88810858b400
> [ 133.783382] FS: 0000000000000000(0000) GS:ffff8881b034c000(0000) knlGS:0000000000000000
> [ 133.787351] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 133.790308] CR2: 00000000006042c0 CR3: 0000000108400001 CR4: 0000000000770ef0
> [ 133.793822] PKRU: 55555554
> [ 133.795347] Call Trace:
> [ 133.796778] <TASK>
> [ 133.798082] ? __pfx_pvcalls_new_active_socket+0x10/0x10
> [ 133.800801] ? security_socket_post_create+0x4d/0x60
> [ 133.803275] ? release_sock+0x1a/0x1d0
> [ 133.805182] pvcalls_back_event+0x1b09/0x23e0
> [ 133.807431] ? __pfx_pvcalls_back_event+0x10/0x10
> [ 133.809814] ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> [ 133.812251] ? __pfx_pvcalls_back_event+0x10/0x10
> [ 133.814554] irq_thread_fn+0x86/0x150
> [ 133.816468] irq_thread+0x2da/0x580
> [ 133.818363] ? __pfx_irq_thread_fn+0x10/0x10
> [ 133.820586] ? __pfx_irq_thread+0x10/0x10
> [ 133.822670] ? __kthread_parkme+0x88/0x170
> [ 133.824803] ? __pfx_irq_thread+0x10/0x10
> [ 133.827153] ? __pfx_irq_thread+0x10/0x10
> [ 133.829304] kthread+0x2c8/0x3b0
> [ 133.831176] ? recalc_sigpending+0x15c/0x1e0
> [ 133.833570] ? __pfx_kthread+0x10/0x10
> [ 133.835572] ret_from_fork+0x373/0x5b0
> [ 133.837581] ? __pfx_ret_from_fork+0x10/0x10
> [ 133.839978] ? __switch_to+0x3c4/0xb40
> [ 133.841984] ? __pfx_kthread+0x10/0x10
> [ 133.843970] ret_from_fork_asm+0x1a/0x30
> [ 133.846031] </TASK>
> [ 133.847420] Modules linked in:
> [ 133.849240] ---[ end trace 0000000000000000 ]---
>
> Give each failure its own label, so that only resources that were actually
> acquired are released and the list the map was never added to is left
> alone. The map is not published anywhere at that point, so the error path
> needs no socket_lock at all. sock_release() stays in the callee on every
> error path, the way
> commit 8fafac202d18 ("xen/pvcalls-back: fix double frees with pvcalls_new_active_socket()")
> arranged it.
>
> Fixes: 5db4d286a8ef ("xen/pvcalls: implement connect command")
> Cc: stable@vger.kernel.org
> Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
next prev parent reply other threads:[~2026-11-10 1:01 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 12:23 [PATCH 0/2] xen/pvcalls: fix the backend error path and a workqueue leak Yehyeong Lee
2026-11-09 12:23 ` [PATCH 1/2] xen/pvcalls: unwind pvcalls_new_active_socket() step by step Yehyeong Lee
2026-11-10 0:55 ` Stefano Stabellini [this message]
2026-11-09 12:23 ` [PATCH 2/2] xen/pvcalls: destroy the per-socket workqueue on release Yehyeong Lee
2026-11-10 0:56 ` Stefano Stabellini
2026-11-10 12:55 ` Yehyeong Lee
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=ce00c906-e984-4363-a2cf-447d21339a67@kernel.org \
--to=sstabellini@kernel.org \
--cc=boris.ostrovsky@oracle.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleksandr_tyshchenko@epam.com \
--cc=stable@vger.kernel.org \
--cc=xen-devel@lists.xenproject.org \
--cc=yhlee@isslab.korea.ac.kr \
/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.