Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4642793pxj; Wed, 12 May 2021 09:54:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzb5mwXAwsNOjZAs/i64Ji+I8At6PXvyeNKVVHI3BOA9IcdiZtRvrDgIHgo847hMaoOrV+Z X-Received: by 2002:a2e:9650:: with SMTP id z16mr30398923ljh.487.1620838476935; Wed, 12 May 2021 09:54:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620838476; cv=none; d=google.com; s=arc-20160816; b=VD536gyf//zCHxynSbuqUlVG+WAAaEvTwrWDRfk6SApDEcgQPZjbD4YrsmmwRVRD8P QWQ9ZARwYgR3kHG5DNXv/nPiTbs+U5/CDdlDwWEXQgMJhsOW0b0IpYGtWIHmBd7FrSyf SO1JPwa9t8Hcbi2y9mxMAb9wN192cFau/UeDd+tJcyQC4rfZlRXjHpWE4LF82R2C/ArU VEiscUeH4WPxnvP9oItLEZUDjkTb4I/QhMXd3A9UDzhFeFsum/pbEkKXFPELhVtlCXBR DiDG/FMxzfvItHUzXWp6nCtPaTT8qwNjBkkbFqtupzTGhwv3GbrMCYY+gVuSZLboaXIA 4L4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ekm2a0QH/EMxU7GFQGYRsFIUhp+ZE/WFd124QmJRn+8=; b=IN0hrHr1o2FJ5HXYANIGSXmO0+yxXqpEvx18nLM9UiGXT6hywK6dLSk4JFMFnfDG/2 J2j9QpIj9UfQ7LdX4Q5SawZzyhEU/vFywCQ3rqJoSj1vnCG06qqgE4QS+xgi62ZdYBAq gAf1OpmLFCNYVgXPW+d+rqwYCbwlDbahjfIz96Pbtinwg/gSVA54at8SNMKccqi/O4Q3 y2WC8/Td9A0jFXBpiZR7nuICjyQdIfgqLcezJCl0alyaCmLwEJCnqEmy0ym+MXqbIOhq uZ7TyBtiioujKXSVNeqfYedOkBzErfYRi1TqSzwzWiOIb+Ip4e68qn6n8xTh9y7Y/+hS jxCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=q9sVy54G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 126si464144lfg.32.2021.05.12.09.54.06; Wed, 12 May 2021 09:54:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=q9sVy54G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244974AbhELQvu (ORCPT + 99 others); Wed, 12 May 2021 12:51:50 -0400 Received: from mail.kernel.org ([198.145.29.99]:50084 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237461AbhELPue (ORCPT ); Wed, 12 May 2021 11:50:34 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 890B861606; Wed, 12 May 2021 15:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620833150; bh=dNBDmRVLWEf+T2YMip7beI75nQYpYaiIIkQ7sh/4L7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q9sVy54G4tfoivxHDV4pHZTFyWs4k60nYN4ZZ4vS0miuSXMQpXH89APxn7AC1RuVu XLzzWo8N7xG9SuMgjrJEuUPR419QR8j86l2bAFlTZpCw9jRFxXG3/khPab8kHBtu6M rUMsfyxYzqqpFNZ0TD7i69gPgJnhLjH0t7vFu54M= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Gwendal Grignou , Andy Shevchenko , Jonathan Cameron Subject: [PATCH 5.11 038/601] iio: sx9310: Fix access to variable DT array Date: Wed, 12 May 2021 16:41:55 +0200 Message-Id: <20210512144829.075274844@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210512144827.811958675@linuxfoundation.org> References: <20210512144827.811958675@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gwendal Grignou commit 6f0078ae704d94b1a93e5f3d0a44cf3d8090fa91 upstream. With the current code, we want to read 4 entries from DT array "semtech,combined-sensors". If there are less, we silently fail as of_property_read_u32_array() returns -EOVERFLOW. First count the number of entries and if between 1 and 4, collect the content of the array. Fixes: 5b19ca2c78a0 ("iio: sx9310: Set various settings from DT") Signed-off-by: Gwendal Grignou Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20210326184603.251683-2-gwendal@chromium.org Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/proximity/sx9310.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) --- a/drivers/iio/proximity/sx9310.c +++ b/drivers/iio/proximity/sx9310.c @@ -1221,17 +1221,17 @@ static int sx9310_init_compensation(stru } static const struct sx9310_reg_default * -sx9310_get_default_reg(struct sx9310_data *data, int i, +sx9310_get_default_reg(struct sx9310_data *data, int idx, struct sx9310_reg_default *reg_def) { - int ret; const struct device_node *np = data->client->dev.of_node; - u32 combined[SX9310_NUM_CHANNELS] = { 4, 4, 4, 4 }; + u32 combined[SX9310_NUM_CHANNELS]; + u32 start = 0, raw = 0, pos = 0; unsigned long comb_mask = 0; + int ret, i, count; const char *res; - u32 start = 0, raw = 0, pos = 0; - memcpy(reg_def, &sx9310_default_regs[i], sizeof(*reg_def)); + memcpy(reg_def, &sx9310_default_regs[idx], sizeof(*reg_def)); if (!np) return reg_def; @@ -1242,15 +1242,31 @@ sx9310_get_default_reg(struct sx9310_dat reg_def->def |= SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND; } - reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK; - of_property_read_u32_array(np, "semtech,combined-sensors", - combined, ARRAY_SIZE(combined)); - for (i = 0; i < ARRAY_SIZE(combined); i++) { - if (combined[i] <= SX9310_NUM_CHANNELS) - comb_mask |= BIT(combined[i]); + count = of_property_count_elems_of_size(np, "semtech,combined-sensors", + sizeof(u32)); + if (count > 0 && count <= ARRAY_SIZE(combined)) { + ret = of_property_read_u32_array(np, "semtech,combined-sensors", + combined, count); + if (ret) + break; + } else { + /* + * Either the property does not exist in the DT or the + * number of entries is incorrect. + */ + break; } + for (i = 0; i < count; i++) { + if (combined[i] >= SX9310_NUM_CHANNELS) { + /* Invalid sensor (invalid DT). */ + break; + } + comb_mask |= BIT(combined[i]); + } + if (i < count) + break; - comb_mask &= 0xf; + reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK; if (comb_mask == (BIT(3) | BIT(2) | BIT(1) | BIT(0))) reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3; else if (comb_mask == (BIT(1) | BIT(2)))