dispvm: use try/finally to make sure that qubes.xml is unlocked

Even in case of some exception (in which case theoretically it should be
unlocked at qfile-daemon-dvm exit, but the script may wait for
something).

QubesOS/qubes-issues#1636
This commit is contained in:
Marek Marczykowski-Górecki 2016-02-21 12:41:13 +01:00
parent ae848d5369
commit 5546d679c0
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

@ -51,6 +51,7 @@ class QfileDaemonDvm:
qvm_collection = QubesVmCollection() qvm_collection = QubesVmCollection()
qvm_collection.lock_db_for_writing() qvm_collection.lock_db_for_writing()
try:
tar_process = subprocess.Popen( tar_process = subprocess.Popen(
['bsdtar', '-C', current_savefile_vmdir, ['bsdtar', '-C', current_savefile_vmdir,
@ -62,7 +63,6 @@ class QfileDaemonDvm:
vm = qvm_collection.get_vm_by_name(self.name) vm = qvm_collection.get_vm_by_name(self.name)
if vm is None: if vm is None:
sys.stderr.write('Domain ' + self.name + ' does not exist ?') sys.stderr.write('Domain ' + self.name + ' does not exist ?')
qvm_collection.unlock_db()
return None return None
label = vm.label label = vm.label
if len(sys.argv) > 4 and len(sys.argv[4]) > 0: if len(sys.argv) > 4 and len(sys.argv[4]) > 0:
@ -72,7 +72,6 @@ class QfileDaemonDvm:
vm_disptempl = qvm_collection.get_vm_by_name(disp_templ) vm_disptempl = qvm_collection.get_vm_by_name(disp_templ)
if vm_disptempl is None: if vm_disptempl is None:
sys.stderr.write('Domain ' + disp_templ + ' does not exist ?') sys.stderr.write('Domain ' + disp_templ + ' does not exist ?')
qvm_collection.unlock_db()
return None return None
dispvm = qvm_collection.add_new_vm('QubesDisposableVm', dispvm = qvm_collection.add_new_vm('QubesDisposableVm',
disp_template=vm_disptempl, disp_template=vm_disptempl,
@ -98,7 +97,6 @@ class QfileDaemonDvm:
# Wait for tar to finish # Wait for tar to finish
if tar_process.wait() != 0: if tar_process.wait() != 0:
sys.stderr.write('Failed to unpack saved-cows.tar') sys.stderr.write('Failed to unpack saved-cows.tar')
qvm_collection.unlock_db()
return None return None
print >>sys.stderr, "time=%s, VM starting" % (str(time.time())) print >>sys.stderr, "time=%s, VM starting" % (str(time.time()))
try: try:
@ -112,6 +110,7 @@ class QfileDaemonDvm:
dispvm.netvm = vm.dispvm_netvm dispvm.netvm = vm.dispvm_netvm
print >>sys.stderr, "time=%s, VM started" % (str(time.time())) print >>sys.stderr, "time=%s, VM started" % (str(time.time()))
qvm_collection.save() qvm_collection.save()
finally:
qvm_collection.unlock_db() qvm_collection.unlock_db()
# Reload firewall rules # Reload firewall rules
print >>sys.stderr, "time=%s, reloading firewall" % (str(time.time())) print >>sys.stderr, "time=%s, reloading firewall" % (str(time.time()))