From mboxrd@z Thu Jan 1 00:00:00 1970 From: Cyrill Gorcunov Subject: [PATCH] kvm tool: Don't close not yet opened files and SIGSEV fix Date: Sat, 4 Feb 2012 20:32:04 +0400 Message-ID: <20120204163204.GB15888@moon> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Pekka Enberg , Sasha Levin , Asias He , Ingo Molnar , KVM-ML Return-path: Received: from mail-bk0-f46.google.com ([209.85.214.46]:51796 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750770Ab2BDQcJ (ORCPT ); Sat, 4 Feb 2012 11:32:09 -0500 Received: by bkcjm19 with SMTP id jm19so3790650bkc.19 for ; Sat, 04 Feb 2012 08:32:08 -0800 (PST) Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: In case if there error happened in kvm__init and we have no files opened -- we should not try to close them. Also once kvm failed to init the caller should not try to dereference a pointer obtained, otherwise we might get SIGSEV | [cyrill@moon kvm]$ ./lkvm run ... | Error: '/dev/kvm' not found. Please make sure your kernel has CONFIG_KVM enabled and that the KVM modules are loaded. | Segmentation fault (core dumped) | [cyrill@moon kvm]$ Signed-off-by: Cyrill Gorcunov --- tools/kvm/builtin-run.c | 4 ++++ tools/kvm/kvm.c | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) Index: linux-2.6.git/tools/kvm/builtin-run.c =================================================================== --- linux-2.6.git.orig/tools/kvm/builtin-run.c +++ linux-2.6.git/tools/kvm/builtin-run.c @@ -997,6 +997,10 @@ static int kvm_cmd_run_init(int argc, co } kvm = kvm__init(dev, hugetlbfs_path, ram_size, guest_name); + if (IS_ERR_OR_NULL(kvm)) { + r = PTR_ERR(kvm); + goto fail; + } kvm->single_step = single_step; Index: linux-2.6.git/tools/kvm/kvm.c =================================================================== --- linux-2.6.git.orig/tools/kvm/kvm.c +++ linux-2.6.git/tools/kvm/kvm.c @@ -123,10 +123,12 @@ static int kvm__check_extensions(struct static struct kvm *kvm__new(void) { struct kvm *kvm = calloc(1, sizeof(*kvm)); - if (!kvm) return ERR_PTR(-ENOMEM); + kvm->sys_fd = -1; + kvm->vm_fd = -1; + return kvm; } @@ -394,9 +396,12 @@ struct kvm *kvm__init(const char *kvm_de kvm_ipc__start(kvm__create_socket(kvm)); kvm_ipc__register_handler(KVM_IPC_PID, kvm__pid); return kvm; + cleanup: - close(kvm->vm_fd); - close(kvm->sys_fd); + if (kvm->vm_fd >= 0) + close(kvm->vm_fd); + if (kvm->sys_fd >= 0) + close(kvm->sys_fd); free(kvm); return ERR_PTR(ret);