Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp1828898imm; Mon, 3 Sep 2018 10:29:53 -0700 (PDT) X-Google-Smtp-Source: ANB0VdY9RK8LCvKBn/tET7GUtOAmAimxIcrOks/TKAUwMiIXIq/6F/HRbATsH5SlN1NiYX5xxfLl X-Received: by 2002:a63:291:: with SMTP id 139-v6mr26588769pgc.365.1535995793455; Mon, 03 Sep 2018 10:29:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535995793; cv=none; d=google.com; s=arc-20160816; b=wKb7/mgDVDnP9TNY6EfPdRyL4TucNlOlEs+5BSVI0Bq+WRtXVhYCAqbjcKEHnz9FBm HZvSlBWX+CQ5YMsEw2aLSdJ33hFa5ZUPojA+Nh1y2NiCMpi8/uSpTCfHb4mhYaav4EgO Mw/SJ3BkdYoHx2KB6pELCztiKy5LlIYcZ+pUiD8AJlZR0xc32TZJ3U6CrJrS6pBK3zAk E475DGSkU27fSlZR+4w6XsGJ4IEeaQbVDIA32UQp8J05McJK/uvataIzdRiSkSyxPIlC sjlfVyeQMnj4vXms+svhwXkDlKNrkQsWZ7qMvDWyABLBleyns4GgJPcm4fKfsTvOnHro oSrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=VcUDVBIo9KUb1JkniH2FBCKBM+4uQiohHkoP7MBxZzk=; b=rKS9RoHaDDAnCkeDx4L8WyhiMertMwaBYqbHffsd4AvsvbAGOOrwMojnbjC780Y3B4 0bjXSJ2HpFqKDRk8PmO9h/GOGcemJRb+COOfqGetPV5D8q352n0eJAhGf3JdFPyXd0L6 QLUhD4zRr322Bb5PvGOgYWrdg1OAyzSgi7fuFauETAIMr3/UTrXXDTARNWdgsa8iRvyQ va1ZkJ74WzFP8ja6ko3crhCdTKAPUeNi11dhBHfmBmjSlKITzmeAmYg28sjuMSFA+hJh k6c33SWrMstwGssYvct2AuWa65OiXcJJqNF6MFF7hB8wdNnILx/c4UPACXZJJ0ITmaUT 3GFg== 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 b10-v6si20213899plk.302.2018.09.03.10.29.38; Mon, 03 Sep 2018 10:29:53 -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 S1731122AbeICVtO (ORCPT + 99 others); Mon, 3 Sep 2018 17:49:14 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:46376 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728175AbeICVtN (ORCPT ); Mon, 3 Sep 2018 17:49:13 -0400 Received: from localhost (ip-213-127-74-90.ip.prioritytelecom.net [213.127.74.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 2CAF4D01; Mon, 3 Sep 2018 17:28:04 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "H. Nikolaus Schaller" , Sebastian Reichel Subject: [PATCH 4.14 160/165] power: generic-adc-battery: fix out-of-bounds write when copying channel properties Date: Mon, 3 Sep 2018 18:57:26 +0200 Message-Id: <20180903165705.115846826@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180903165655.003605184@linuxfoundation.org> References: <20180903165655.003605184@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: H. Nikolaus Schaller commit 932d47448c3caa0fa99e84d7f5bc302aa286efd8 upstream. We did have sporadic problems in the pinctrl framework during boot where a pin group name unexpectedly became NULL leading to a NULL dereference in strcmp. Detailled analysis of the failing cases did reveal that there were two devm allocated objects close to each other. The second one was the affected group_desc in pinmux and the first one was the psy_desc->properties buffer of the gab driver. Review of the gab code showed that the address calculation for one memcpy() is wrong. It does properties + sizeof(type) * index but C is defined to do the index multiplication already for pointer + integer additions. Hence the factor was applied twice and the memcpy() does write outside of the properties buffer. Sometimes it happened to be the pinctrl and triggered the strcmp(NULL). Anyways, it is overkill to use a memcpy() here instead of a simple assignment, which is easier to read and has less risk for wrong address calculations. So we change code to a simple assignment. If we initialize the index to the first free location, we can even remove the local variable 'properties'. This bug seems to exist right from the beginning in 3.7-rc1 in commit e60fea794e6e ("power: battery: Generic battery driver using IIO") Signed-off-by: H. Nikolaus Schaller Cc: stable@vger.kernel.org Fixes: e60fea794e6e ("power: battery: Generic battery driver using IIO") Signed-off-by: Sebastian Reichel Signed-off-by: Greg Kroah-Hartman --- drivers/power/supply/generic-adc-battery.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) --- a/drivers/power/supply/generic-adc-battery.c +++ b/drivers/power/supply/generic-adc-battery.c @@ -243,10 +243,9 @@ static int gab_probe(struct platform_dev struct power_supply_desc *psy_desc; struct power_supply_config psy_cfg = {}; struct gab_platform_data *pdata = pdev->dev.platform_data; - enum power_supply_property *properties; int ret = 0; int chan; - int index = 0; + int index = ARRAY_SIZE(gab_props); adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL); if (!adc_bat) { @@ -280,8 +279,6 @@ static int gab_probe(struct platform_dev } memcpy(psy_desc->properties, gab_props, sizeof(gab_props)); - properties = (enum power_supply_property *) - ((char *)psy_desc->properties + sizeof(gab_props)); /* * getting channel from iio and copying the battery properties @@ -295,15 +292,12 @@ static int gab_probe(struct platform_dev adc_bat->channel[chan] = NULL; } else { /* copying properties for supported channels only */ - memcpy(properties + sizeof(*(psy_desc->properties)) * index, - &gab_dyn_props[chan], - sizeof(gab_dyn_props[chan])); - index++; + psy_desc->properties[index++] = gab_dyn_props[chan]; } } /* none of the channels are supported so let's bail out */ - if (index == 0) { + if (index == ARRAY_SIZE(gab_props)) { ret = -ENODEV; goto second_mem_fail; } @@ -314,7 +308,7 @@ static int gab_probe(struct platform_dev * as come channels may be not be supported by the device.So * we need to take care of that. */ - psy_desc->num_properties = ARRAY_SIZE(gab_props) + index; + psy_desc->num_properties = index; adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg); if (IS_ERR(adc_bat->psy)) {