Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp7089973imm; Tue, 24 Jul 2018 08:13:51 -0700 (PDT) X-Google-Smtp-Source: AAOMgpf3EFD7QAviGXvQS63xGqtzt2F6Orzgy6docK9oxm8wYpTHtoEtB4f6nh8zHrLqiQome+qc X-Received: by 2002:a62:4308:: with SMTP id q8-v6mr18413422pfa.86.1532445231270; Tue, 24 Jul 2018 08:13:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532445231; cv=none; d=google.com; s=arc-20160816; b=bpHhSWWnVNj/Vxe+1sxXgUnxgR/vOaYYSpdV/YQqU8cU6MkQHUI/3yLk3FsXPoHO6R g+rvhHU4xqhKimeTyBngymNxIQQQnrCqRWCsVsbVg1skcvCk605ktFkMOLcA9V69YnhJ l5i4noqRXFU87P8mBMMBueA5UzPQvrfWk7YdYda+h7Wc0rfAUuRkvevpjWxdjeunwfwl U4NfcoGdpoXZDL2HUTM3HhW81AqH8VklFVvF9NUXYNMS3bci2aNjrRHU4t7WBmnktb9R pCTUXLoKttCKcoP0J8POPeLQ/OVfSVvC6u2y5b3RQye92j8x1Odm8KiBhYr1l0PJIT4a VPaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=u9kfesfzTdk4ESjlFtPJV2bSMD++qtVgjnc0vHRdC9Y=; b=HjxVARLM4qnfgLFm5vqu/Q7kLDAZ3UxrR3MfPbSixtS0HMvkJNi3xeqOyN8V6Zue+e UODmCfX4XM7PNJOlNIh3Bmw0LwwnSaSttw/530lcJ+OwKUgKJ+rCA56DlWpAUV/HFIfw YpdEs0bl5OuRhtpxEYZ11NeRSqvPR4nv3AYYtFN936Cbz0V7hdOXXDHva+O4CCy1sit7 pd7PUN54WCBHJK1E03Kb6ym7mg1FcuwzOwOBrmFjzMLG/b+5DdsiwFHCjrnfCD4R+XH/ 5938+IGRM1MgxXE9kxp+xcCjOkswvqEBiQIuhApJ8/Rn5qon5ZJYq/cJ6QHHmEhiwlyb 0bFw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v8-v6si10740280pff.248.2018.07.24.08.13.36; Tue, 24 Jul 2018 08:13:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388441AbeGXQSk (ORCPT + 99 others); Tue, 24 Jul 2018 12:18:40 -0400 Received: from bran.ispras.ru ([83.149.199.196]:23717 "EHLO smtp.ispras.ru" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2388322AbeGXQSj (ORCPT ); Tue, 24 Jul 2018 12:18:39 -0400 Received: from myklebust.intra.ispras.ru (unknown [10.10.2.207]) by smtp.ispras.ru (Postfix) with ESMTP id 0362E203C6; Tue, 24 Jul 2018 18:11:39 +0300 (MSK) From: Anton Vasilyev To: Guenter Roeck Cc: Anton Vasilyev , Dmitry Torokhov , Greg Kroah-Hartman , Samuel Holland , Pan Bian , linux-kernel@vger.kernel.org, ldv-project@linuxtesting.org Subject: [PATCH v2] firmware: vpd: Fix section enabled flag on vpd_section_destroy Date: Tue, 24 Jul 2018 18:10:38 +0300 Message-Id: <20180724151038.14838-1-vasilyev@ispras.ru> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180723183927.GH100814@dtor-ws> References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org static struct ro_vpd and rw_vpd are initialized by vpd_sections_init() in vpd_probe() based on header's ro and rw sizes. In vpd_remove() vpd_section_destroy() performs deinitialization based on enabled flag, which is set to true by vpd_sections_init(). This leads to call of vpd_section_destroy() on already destroyed section for probe-release-probe-release sequence if first probe performs ro_vpd initialization and second probe does not initialize it. The patch adds changing enabled flag on vpd_section_destroy and adds cleanup on the error path of vpd_sections_init. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Anton Vasilyev --- v2: add cleanup on the error path of vpd_sections_init --- drivers/firmware/google/vpd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/google/vpd.c b/drivers/firmware/google/vpd.c index e9db895916c3..1aa67bb5d8c0 100644 --- a/drivers/firmware/google/vpd.c +++ b/drivers/firmware/google/vpd.c @@ -246,6 +246,7 @@ static int vpd_section_destroy(struct vpd_section *sec) sysfs_remove_bin_file(vpd_kobj, &sec->bin_attr); kfree(sec->raw_name); memunmap(sec->baseaddr); + sec->enabled = false; } return 0; @@ -279,8 +280,10 @@ static int vpd_sections_init(phys_addr_t physaddr) ret = vpd_section_init("rw", &rw_vpd, physaddr + sizeof(struct vpd_cbmem) + header.ro_size, header.rw_size); - if (ret) + if (ret) { + vpd_section_destroy(&ro_vpd); return ret; + } } return 0; -- 2.18.0