Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp134447img; Thu, 21 Mar 2019 16:03:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqzoKLmgakZo9PmDWSnLxbGC3fkuKCPpxwzzsZC1LIgAXRgk4PTGGImCFQ3XY1QkyjXtPUCU X-Received: by 2002:a17:902:14b:: with SMTP id 69mr6179299plb.216.1553209390096; Thu, 21 Mar 2019 16:03:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553209390; cv=none; d=google.com; s=arc-20160816; b=ny3FaOMBWUer+ZjSM+sAyVi96lktgM7DgeIMwjdB6SskOVqbQnDRFaysjOHu9ghiS2 HQm03SqXhanID56+y9BKTZV/ap33yk9nn0dqMm2WQAGpddHKVaeiWgACHk+eLKPj+vMP vwTB4mbZThwKbDj0LCQX6rxet+vQbBRgAstYoJ4zhkcAKpkztm5gyy8W/GZhxTqkPFVc RJQDPcmFVY8ecPiG1BwegaJ2Ub9Pyq7z2IPWmm+LhpbzpLAIZFrpkX0eJw8qbdMLQRXz Zq+JXDrdkZRoX1g+83JlXEUrHiSDxAN2NkNtQm9RRhgjvs2YotHstxfrlNKAQ8UC5sZi Pf2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:message-id:date:cc:to:from:subject; bh=0MVtDvynBNxfiX3HGHj6s0A8ZMmgNJUHZCr/WU3ztnk=; b=Sc6MwIJavbA7aOpJKqrjwAeWKqilyAjPBEAZm5SVyUznfEJyCuXHHF31F0FwSbFVRX XmiOooL9N6v/5zYNgHMId8ZZk/q0UnmhjhhDd2FF8fCJtVfiOjmuBDXBUJ4QZaM1cTa0 Ho6M2rnDWJIPFr9gMisNz4Y2uCbVLo9fzlrTUy9xnxHyNSfYVDBNvZcryuKPaB3kN9KG 50X6+b7XeV8xtW6Ql4a1IWLmvJmu6Ggje5suDmk2XDZdZ9GcrBIw+7D4eUuAenSWFyVy OxIy5KqcC1/c0tKp8NvKzOrqfYeDFgsDTcjjgZZs09oYt8XSKJ9E8OJPQpuz4WjY+Y5y ngFQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y62si2239204pfy.259.2019.03.21.16.02.55; Thu, 21 Mar 2019 16:03:10 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727192AbfCUXCO (ORCPT + 99 others); Thu, 21 Mar 2019 19:02:14 -0400 Received: from mga04.intel.com ([192.55.52.120]:7149 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727086AbfCUXCO (ORCPT ); Thu, 21 Mar 2019 19:02:14 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Mar 2019 16:02:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,254,1549958400"; d="scan'208";a="284777192" Received: from jdemuth-mobl.amr.corp.intel.com (HELO tstruk-mobl1.jf.intel.com) ([10.251.150.110]) by orsmga004.jf.intel.com with ESMTP; 21 Mar 2019 16:02:13 -0700 Subject: [PATCH v3] tpm: fix an invalid condition in tpm_common_poll From: Tadeusz Struk To: jarkko.sakkinen@linux.intel.com Cc: grawity@gmail.com, James.Bottomley@HansenPartnership.com, linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, tadeusz.struk@intel.com Date: Thu, 21 Mar 2019 16:02:12 -0700 Message-ID: <155320933278.5015.1752135965699928631.stgit@tstruk-mobl1.jf.intel.com> User-Agent: StGit/unknown-version MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The poll condition should only check response_length, because reads should only be issued if there is data to read. The response_read flag only prevents double writes. The problem was that the write set the response_read to false, enqued a tpm job, and returned. Then application called poll which checked the response_read flag and returned EPOLLIN. Then the application called read, but got nothing. After all that the async_work kicked in. Added also mutex_lock around the poll check to prevent other possible race conditions. Fixes: 9488585b21bef0df12 ("tpm: add support for partial reads") Reported-by: Mantas Mikulėnas Tested-by: Mantas Mikulėnas Signed-off-by: Tadeusz Struk --- drivers/char/tpm/tpm-dev-common.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c index 5eecad233ea1..7312d3214381 100644 --- a/drivers/char/tpm/tpm-dev-common.c +++ b/drivers/char/tpm/tpm-dev-common.c @@ -203,12 +203,14 @@ __poll_t tpm_common_poll(struct file *file, poll_table *wait) __poll_t mask = 0; poll_wait(file, &priv->async_wait, wait); + mutex_lock(&priv->buffer_mutex); - if (!priv->response_read || priv->response_length) + if (priv->response_length) mask = EPOLLIN | EPOLLRDNORM; else mask = EPOLLOUT | EPOLLWRNORM; + mutex_unlock(&priv->buffer_mutex); return mask; }