all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH proxmox-backup] tape: virtual drive: fix endless recursion in changer status
@ 2026-11-09 21:59 Jakob-Tobias Winter
  2026-11-11 10:21 ` Christian Ebner
  0 siblings, 1 reply; 2+ messages in thread
From: Jakob-Tobias Winter @ 2026-11-09 21:59 UTC (permalink / raw)
  To: tobias, pbs-devel; +Cc: Jakob-Tobias Winter

The virtual tape drive, which exists for tests and debugging only, also
acts as its own changer and reports every virtual tape in its directory
as a slot. To build that status it asked for the list of online media,
but got the generic variant of that list, which is derived from the
changer status. The two called each other until the stack overflowed, so
every operation that needs the changer status of a virtual drive, like
loading or unloading a tape, crashed the process.

Use the list of tapes in the directory of the drive instead, as it was
intended, for the status and for loading a tape from a slot.

Signed-off-by: Jakob-Tobias Winter <tobias@stuttgart.de>
---
The recursion has been there since 46a1863f8 ("tape: improve MediaChange
trait").

Reproducer, with a virtual drive 'vtape' in tape.cfg and an empty file
'tape-demo1.json' in its directory:

  proxmox-backup-debug api create /tape/drive/vtape/load-slot \
      --source-slot 1

Tested with debug builds of current master and of 4.2.8, calling the API
in-process (PROXMOX_DEBUG_API_CODE=1): the call aborts with a stack
overflow without the patch and loads the tape with it.

 src/tape/drive/virtual_tape.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tape/drive/virtual_tape.rs b/src/tape/drive/virtual_tape.rs
index a17916bab..b2febaed5 100644
--- a/src/tape/drive/virtual_tape.rs
+++ b/src/tape/drive/virtual_tape.rs
@@ -499,7 +499,7 @@ impl MediaChange for VirtualTapeHandle {
         // slot-assignment here.
 
         let mut slots = Vec::new();
-        let label_texts = self.online_media_label_texts()?;
+        let label_texts = VirtualTapeHandle::online_media_label_texts(self)?;
         let max_slots = label_texts.len().div_ceil(8) * 8;
 
         for i in 0..max_slots {
@@ -535,7 +535,7 @@ impl MediaChange for VirtualTapeHandle {
             bail!("invalid slot ID {}", slot);
         }
 
-        let label_texts = self.online_media_label_texts()?;
+        let label_texts = VirtualTapeHandle::online_media_label_texts(self)?;
 
         if slot > label_texts.len() as u64 {
             bail!("slot {} is empty", slot);
-- 
2.53.0




^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH proxmox-backup] tape: virtual drive: fix endless recursion in changer status
  2026-11-09 21:59 [PATCH proxmox-backup] tape: virtual drive: fix endless recursion in changer status Jakob-Tobias Winter
@ 2026-11-11 10:21 ` Christian Ebner
  0 siblings, 0 replies; 2+ messages in thread
From: Christian Ebner @ 2026-11-11 10:21 UTC (permalink / raw)
  To: Jakob-Tobias Winter, tobias, pbs-devel

On 11/9/26 11:07 PM, Jakob-Tobias Winter wrote:
> The virtual tape drive, which exists for tests and debugging only, also
> acts as its own changer and reports every virtual tape in its directory
> as a slot. To build that status it asked for the list of online media,
> but got the generic variant of that list, which is derived from the
> changer status. The two called each other until the stack overflowed, so
> every operation that needs the changer status of a virtual drive, like
> loading or unloading a tape, crashed the process.
> 
> Use the list of tapes in the directory of the drive instead, as it was
> intended, for the status and for loading a tape from a slot.

Thanks for the patch, I would however prefer a different approach for 
fixing this:

The issue is that VirtualTapeHandle does not implement the MediaChange 
traits online_media_label_texts() method with signature

fn online_media_label_texts(&mut self) -> Result<Vec<String>, Error>>

but has it's own impl with a slightly different method signature

fn online_media_label_texts(&self) -> Result<Vec<String>, Error>>

which leads to the incorrect method being called and therefore the 
recursion in the first place.

So the better fix would be to move the VirtualTapeHandle's custom impl 
to actually override the MediaChange trait method.
> Signed-off-by: Jakob-Tobias Winter <tobias@stuttgart.de>
> ---
> The recursion has been there since 46a1863f8 ("tape: improve MediaChange
> trait").

nit: please include this as Fixes: ... trailer with the patch.

> Reproducer, with a virtual drive 'vtape' in tape.cfg and an empty file
> 'tape-demo1.json' in its directory:
> 
>    proxmox-backup-debug api create /tape/drive/vtape/load-slot \
>        --source-slot 1
> 
> Tested with debug builds of current master and of 4.2.8, calling the API
> in-process (PROXMOX_DEBUG_API_CODE=1): the call aborts with a stack
> overflow without the patch and loads the tape with it.
> 
>   src/tape/drive/virtual_tape.rs | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/tape/drive/virtual_tape.rs b/src/tape/drive/virtual_tape.rs
> index a17916bab..b2febaed5 100644
> --- a/src/tape/drive/virtual_tape.rs
> +++ b/src/tape/drive/virtual_tape.rs
> @@ -499,7 +499,7 @@ impl MediaChange for VirtualTapeHandle {
>           // slot-assignment here.
>   
>           let mut slots = Vec::new();
> -        let label_texts = self.online_media_label_texts()?;
> +        let label_texts = VirtualTapeHandle::online_media_label_texts(self)?;
>           let max_slots = label_texts.len().div_ceil(8) * 8;
>   
>           for i in 0..max_slots {
> @@ -535,7 +535,7 @@ impl MediaChange for VirtualTapeHandle {
>               bail!("invalid slot ID {}", slot);
>           }
>   
> -        let label_texts = self.online_media_label_texts()?;
> +        let label_texts = VirtualTapeHandle::online_media_label_texts(self)?;
>   
>           if slot > label_texts.len() as u64 {
>               bail!("slot {} is empty", slot);





^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-11-11 10:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-09 21:59 [PATCH proxmox-backup] tape: virtual drive: fix endless recursion in changer status Jakob-Tobias Winter
2026-11-11 10:21 ` Christian Ebner

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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal