From patchwork Tue Jun 20 20:28:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Vetter X-Patchwork-Id: 9800191 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B2F816038C for ; Tue, 20 Jun 2017 20:28:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A42B623B32 for ; Tue, 20 Jun 2017 20:28:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 98413251F4; Tue, 20 Jun 2017 20:28:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 4E8F923B32 for ; Tue, 20 Jun 2017 20:28:50 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AA5946E3E4; Tue, 20 Jun 2017 20:28:48 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x243.google.com (mail-lf0-x243.google.com [IPv6:2a00:1450:4010:c07::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3CB536E3A8 for ; Tue, 20 Jun 2017 20:28:47 +0000 (UTC) Received: by mail-lf0-x243.google.com with SMTP id n136so5925241lfn.2 for ; Tue, 20 Jun 2017 13:28:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id; bh=6mvzh8GS4XiaOEwOJMeW7Y/DrFB5mUYs4HgCd4isX3s=; b=Wx+CkfI5sAzOf5vaTVo5+lN05E/Ed6cJK0zsW3TFTtuIEmZ9fhjAVd3HapUjpdZI0q kncB5iKAemwiWrpg7ZWfH+1azL4ddP290HyTqjGnjpvjCExPj1Mjke5GRu1v9wK6LGYY k+ZRkSPDRbFOoswVOqx5sQAnim2csdCqrMrmw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=6mvzh8GS4XiaOEwOJMeW7Y/DrFB5mUYs4HgCd4isX3s=; b=uXNaFOBeDKIGq4UkPllBcRQWCMRQPtceAichLLjyjS6eyLeX6C2O+HjBHT14pZVP9a vF3nUh+tdwIDlF0U0FBJ13vSwzJEPRSCJ0iLXNi+zftN6W6tzp+Gw3IjfQAdgpNbYN39 l2BKlPNJi47Ghf4i87+eqNpYmIfZNc7whvoHSsU09o9qXQyD3/qXRnA+VrjY/fNPFIcZ Aa4pC4vGdl5LVkaTSZu9lo631rF8g0R6HqLCYHuE+2L3AXTjzk9DHYnlcy5ekUMTQD+N Bgn172UHQE6fQZLNgvvSNn7grCZQY7PQHKBm572fYJcwvj9Z2OBN52elHXLE0hlTz1GZ G/Aw== X-Gm-Message-State: AKS2vOwQvWRZ8uQkxi4KJPBjcy16COkgywebRSWr6IdKygyr1PCBgqqF WAGGTDniDhHHB6Xq+8s= X-Received: by 10.80.162.135 with SMTP id 7mr5599305edm.66.1497990525170; Tue, 20 Jun 2017 13:28:45 -0700 (PDT) Received: from phenom.ffwll.local ([2a02:168:5640:0:960b:2678:e223:c1c6]) by smtp.gmail.com with ESMTPSA id w26sm6940166edw.28.2017.06.20.13.28.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Jun 2017 13:28:43 -0700 (PDT) From: Daniel Vetter To: DRI Development , Intel Graphics Development Subject: [PATCH] drm: Fix GETCONNECTOR regression Date: Tue, 20 Jun 2017 22:28:37 +0200 Message-Id: <20170620202837.1701-1-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.11.0 Cc: "H.J. Lu" , Daniel Vetter , "# v4 . 11+" , Daniel Vetter , "Pandiyan, Dhinakaran" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP In commit 91eefc05f0ac71902906b2058360e61bd25137fe Author: Daniel Vetter Date: Wed Dec 14 00:08:10 2016 +0100 drm: Tighten locking in drm_mode_getconnector I reordered the logic a bit in that IOCTL, but that broke userspace since it'll get the new mode list, but not the new property values. Fix that again. v2: Fix up the error path handling when copy_to_user for the modes failes (Dhinakaran). Fixes: 91eefc05f0ac ("drm: Tighten locking in drm_mode_getconnector") Cc: Sean Paul Cc: Daniel Vetter Cc: Jani Nikula Cc: David Airlie Cc: dri-devel@lists.freedesktop.org Reported-by: "H.J. Lu" Tested-by: "H.J. Lu" Cc: # v4.11+ Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100576 Cc: "H.J. Lu" Cc: "Pandiyan, Dhinakaran" Signed-off-by: Daniel Vetter Reviewed-by: Sean Paul Reviewed-by: Dhinakaran Pandiyan --- drivers/gpu/drm/drm_connector.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 5cd61aff7857..8072e6e4c62c 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1293,21 +1293,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, if (!connector) return -ENOENT; - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); - encoder = drm_connector_get_encoder(connector); - if (encoder) - out_resp->encoder_id = encoder->base.id; - else - out_resp->encoder_id = 0; - - ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, - (uint32_t __user *)(unsigned long)(out_resp->props_ptr), - (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), - &out_resp->count_props); - drm_modeset_unlock(&dev->mode_config.connection_mutex); - if (ret) - goto out_unref; - for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) if (connector->encoder_ids[i] != 0) encoders_count++; @@ -1320,7 +1305,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, if (put_user(connector->encoder_ids[i], encoder_ptr + copied)) { ret = -EFAULT; - goto out_unref; + goto out; } copied++; } @@ -1364,15 +1349,32 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, if (copy_to_user(mode_ptr + copied, &u_mode, sizeof(u_mode))) { ret = -EFAULT; + mutex_unlock(&dev->mode_config.mutex); + goto out; } copied++; } } out_resp->count_modes = mode_count; -out: mutex_unlock(&dev->mode_config.mutex); -out_unref: + + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + encoder = drm_connector_get_encoder(connector); + if (encoder) + out_resp->encoder_id = encoder->base.id; + else + out_resp->encoder_id = 0; + + /* Only grab properties after probing, to make sure EDID and other + * properties reflect the latest status. */ + ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, + (uint32_t __user *)(unsigned long)(out_resp->props_ptr), + (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), + &out_resp->count_props); + drm_modeset_unlock(&dev->mode_config.connection_mutex); + +out: drm_connector_put(connector); return ret;