From 50561edbc90fed6c2a68d877b136a0bab43ffb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Thu, 31 Oct 2013 17:23:23 +0100 Subject: [PATCH] Bug #2385: Fix quota for vm attach disk when vm is owned by another user --- src/rm/RequestManagerVirtualMachine.cc | 28 +++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index d43001e0d6..408f819ed4 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -1331,9 +1331,11 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList, VirtualMachineTemplate * tmpl = new VirtualMachineTemplate(); VirtualMachineTemplate * deltas = 0; - PoolObjectAuth host_perms; PoolObjectAuth vm_perms; + VirtualMachinePool * vmpool = static_cast(pool); + VirtualMachine * vm; + int rc; string error_str; bool volatile_disk; @@ -1365,6 +1367,22 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList, return; } + vm = vmpool->get(id, true); + + if (vm == 0) + { + failure_response(NO_EXISTS, + get_error(object_name(PoolObjectSQL::VM),id), + att); + return; + } + + vm->get_permissions(vm_perms); + + vm->unlock(); + + RequestAttributes att_quota(vm_perms.uid, vm_perms.gid, att); + volatile_disk = VirtualMachine::isVolatile(tmpl); if ( volatile_disk ) @@ -1373,7 +1391,7 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList, deltas->add("VMS", 0); - if (quota_resize_authorization(id, deltas, att) == false) + if (quota_resize_authorization(id, deltas, att_quota) == false) { delete tmpl; delete deltas; @@ -1383,7 +1401,7 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList, } else { - if ( quota_authorization(tmpl, Quotas::IMAGE, att) == false ) + if ( quota_authorization(tmpl, Quotas::IMAGE, att_quota) == false ) { delete tmpl; return; @@ -1396,11 +1414,11 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList, { if ( volatile_disk ) { - quota_rollback(deltas, Quotas::VM, att); + quota_rollback(deltas, Quotas::VM, att_quota); } else { - quota_rollback(tmpl, Quotas::IMAGE, att); + quota_rollback(tmpl, Quotas::IMAGE, att_quota); } failure_response(ACTION,