From: Fabian Grünbichler <f.gruenbich...@proxmox.com> Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> Tested-by: Fabian Ebner <f.eb...@proxmox.com> --- PVE/AbstractConfig.pm | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm index eefeeb9..3a064b7 100644 --- a/PVE/AbstractConfig.pm +++ b/PVE/AbstractConfig.pm @@ -823,6 +823,15 @@ sub snapshot_delete { $class->set_lock($vmid, 'snapshot-delete') if (!$drivehash); # doesn't already have a 'snapshot' lock + my $expected_lock = $drivehash ? 'snapshot' : 'snapshot-delete'; + + my $ensure_correct_lock = sub { + my ($conf) = @_; + + die "encountered invalid lock, expected '$expected_lock'\n" + if !$class->has_lock($conf, $expected_lock); + }; + my $unlink_parent = sub { my ($confref, $new_parent) = @_; @@ -839,6 +848,8 @@ sub snapshot_delete { my ($drive) = @_; my $conf = $class->load_config($vmid); + $ensure_correct_lock->($conf); + $snap = $conf->{snapshots}->{$snapname}; die "snapshot '$snapname' does not exist\n" if !defined($snap); @@ -850,6 +861,7 @@ sub snapshot_delete { #prepare $class->lock_config($vmid, sub { my $conf = $class->load_config($vmid); + $ensure_correct_lock->($conf); die "you can't delete a snapshot if vm is a template\n" if $class->is_template($conf); @@ -890,6 +902,8 @@ sub snapshot_delete { # now cleanup config $class->lock_config($vmid, sub { my $conf = $class->load_config($vmid); + $ensure_correct_lock->($conf); + $snap = $conf->{snapshots}->{$snapname}; die "snapshot '$snapname' does not exist\n" if !defined($snap); -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel