Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp785637ybl; Tue, 13 Aug 2019 02:33:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqz3950rnZZ5oaauYfXPoIoCzC7T/6nxd/U3JuZ7YM0HAvJMikdXxPcMg0HpojhuDNF1V30B X-Received: by 2002:a65:5382:: with SMTP id x2mr28404381pgq.422.1565688799653; Tue, 13 Aug 2019 02:33:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565688799; cv=none; d=google.com; s=arc-20160816; b=vUHbbpX7YZlNcSxRCTrww6fzQhT8pfu6WxV5Zh9G64VHJpnmK0qmIGv9NkYiMb+mTD MX0A5+32nTO2llUr2opdyYbPDg6V3Fq1ZBm81kmAnE8iM9YEDSa4inoJV8p2fk9Ae0sp uTEUMRoLz77/E7C6/uWlWHx5AnsHbT2E4XiTB9doYl3+dxdZ5RomVY/ar+jaPA1wbUvh jxxN2csMo9TLg8gFvSLw56lSMJ924jkRf3CYUkuCl8SnVs30fH4DctK9q6HiWnDuDCWt MvbiB2pG+oH9TuTj+cDOIEpggIr3f10jor43pWm6Kov4jk/VcXC0drqAOfpYkfihNg3+ X5RQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=4+TqRHMFSsRgR6GGhy+O1Y5ceSSL3uO5KuCRWmIKiTY=; b=qo2O0gKobpJcIFYqUdHlF4uOYWYLLUsu6sxOMF18vEB3ojEGu8lBb+IrBThG04W+mh w4S/8TibTbsD9RW8+Qok0wPi13RCEVWVVXNA1oIb8phd3ghSYsg0UwFsVg3cvptJyyuN iNZ4Q63ZNi5d32U6w3Cuu1O4LRGnN/yiPHchTK4kHr0hmZzidIO0HQxC5GsO8uZM+bYY X+K2FTyi9LRTqjNUplDDT13bPX4kZltuCQdQSW2pkbgv23V93KfqiO+JMFJ+PGHqjBkw 3kWxkZh8Xw1a1RyrM1tl8Oft1PM3hWhsqZ+RiNUpvuEJDn7ACeuuSzEv/xM/g1JbFrnH mwaA== 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 t1si5095967pgk.158.2019.08.13.02.33.02; Tue, 13 Aug 2019 02:33:19 -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 S1727505AbfHMJa4 (ORCPT + 99 others); Tue, 13 Aug 2019 05:30:56 -0400 Received: from michel.telenet-ops.be ([195.130.137.88]:39160 "EHLO michel.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726915AbfHMJa4 (ORCPT ); Tue, 13 Aug 2019 05:30:56 -0400 Received: from ramsan ([84.194.98.4]) by michel.telenet-ops.be with bizsmtp id oZWn2000Y05gfCL06ZWnvJ; Tue, 13 Aug 2019 11:30:54 +0200 Received: from rox.of.borg ([192.168.97.57]) by ramsan with esmtp (Exim 4.90_1) (envelope-from ) id 1hxT8h-0001Ef-Ny; Tue, 13 Aug 2019 11:30:47 +0200 Received: from geert by rox.of.borg with local (Exim 4.90_1) (envelope-from ) id 1hxT8h-0001Iz-KD; Tue, 13 Aug 2019 11:30:47 +0200 From: Geert Uytterhoeven To: Andrzej Pietrasiewicz , Neil Armstrong , Andrzej Hajda Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , David Airlie , Daniel Vetter , Guenter Roeck , Sam Ravnborg , Emil Velikov , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH] drm/bridge: dumb-vga-dac: Fix dereferencing -ENODEV DDC channel Date: Tue, 13 Aug 2019 11:30:46 +0200 Message-Id: <20190813093046.4976-1-geert+renesas@glider.be> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the VGA connector has no DDC channel, an error pointer will be dereferenced, e.g. on Salvator-XS: Unable to handle kernel NULL pointer dereference at virtual address 000000000000017d ... Call trace: sysfs_do_create_link_sd.isra.0+0x40/0x108 sysfs_create_link+0x20/0x40 drm_sysfs_connector_add+0xa8/0xc8 drm_connector_register.part.3+0x54/0xb0 drm_connector_register_all+0xb0/0xd0 drm_modeset_register_all+0x54/0x88 drm_dev_register+0x18c/0x1d8 rcar_du_probe+0xe4/0x150 ... This happens because vga->ddc either contains a valid DDC channel pointer, or -ENODEV, and drm_connector_init_with_ddc() expects a valid DDC channel pointer, or NULL. Fix this by resetting vga->ddc to NULL in case of -ENODEV, and replacing the existing error checks by non-NULL checks. This is similar to what the HDMI connector driver does. Fixes: a4f9087e85de141e ("drm/bridge: dumb-vga-dac: Provide ddc symlink in connector sysfs directory") Signed-off-by: Geert Uytterhoeven --- An alternative would be to check if vga->ddc contains an error pointer, and calling drm_connector_init() instead of drm_connector_init_with_ddc(), like before. --- drivers/gpu/drm/bridge/dumb-vga-dac.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c b/drivers/gpu/drm/bridge/dumb-vga-dac.c index 8ef6539ae78a6eb3..7aa789c358829b05 100644 --- a/drivers/gpu/drm/bridge/dumb-vga-dac.c +++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c @@ -42,7 +42,7 @@ static int dumb_vga_get_modes(struct drm_connector *connector) struct edid *edid; int ret; - if (IS_ERR(vga->ddc)) + if (!vga->ddc) goto fallback; edid = drm_get_edid(connector, vga->ddc); @@ -84,7 +84,7 @@ dumb_vga_connector_detect(struct drm_connector *connector, bool force) * wire the DDC pins, or the I2C bus might not be working at * all. */ - if (!IS_ERR(vga->ddc) && drm_probe_ddc(vga->ddc)) + if (vga->ddc && drm_probe_ddc(vga->ddc)) return connector_status_connected; return connector_status_unknown; @@ -197,6 +197,7 @@ static int dumb_vga_probe(struct platform_device *pdev) if (PTR_ERR(vga->ddc) == -ENODEV) { dev_dbg(&pdev->dev, "No i2c bus specified. Disabling EDID readout\n"); + vga->ddc = NULL; } else { dev_err(&pdev->dev, "Couldn't retrieve i2c bus\n"); return PTR_ERR(vga->ddc); @@ -218,7 +219,7 @@ static int dumb_vga_remove(struct platform_device *pdev) drm_bridge_remove(&vga->bridge); - if (!IS_ERR(vga->ddc)) + if (vga->ddc) i2c_put_adapter(vga->ddc); return 0; -- 2.17.1