Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3416535pxf; Mon, 22 Mar 2021 06:05:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/EJbDC1uGOcyCxX0v7stvI4F1FxBw3xXmkXfKvg5X2ETxo1Xa7GjwDv4wA4H27mjkn3Ad X-Received: by 2002:a2e:9047:: with SMTP id n7mr9627037ljg.291.1616418345759; Mon, 22 Mar 2021 06:05:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418345; cv=none; d=google.com; s=arc-20160816; b=eSNJBow1jtYNotVKpif0PA3Xg75dG6vMW5e6hWpxvesIodC/S6SW5XU+QXFAY9wPcT kKy6jAc84GrTaDWunQQlJAw0KmkTEHYW8uMszpQw5OwgIZkyycyE1s0JPsEVwV+vhn+o 2fxEqXAOmDOJbC+PyT20qDDuNWYC+AIuwcNiXhS7kRgX2PP5zo26QYqmdXPSd0wVmd/m Dw96g/PuuPkh/jSH0NILTwozDF+1EIJSOlU9ROze3yWlniQa9lMvZq7Y3eGKaCQTVYuR TkQrgSrg0hFe1iQ7TykSbsozwj7X+c/GPL9t6aMYxUMI80ylBv6ww+VuXnzDn1z9TSfK 8Z7w== 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=bBHli7VBor2yWZKc/Hj4eAzNBGsmOj5ay92M5ppyVlU=; b=MjC2PZVStLD7gWMWyJMhn6dDuT069TB6HRXRvtjB+vZmYNRY1+kk529qs7HsRUyOE5 m2Gbh8eSOl5f6nmPLtR1wSD9AXqfNAhydlG0/8QEg/27RvAnjbf7XeAgHDo+EiJ+uCNY ZT9jRMnqo3nMWU6pV4hKnWxEI7cBNdBveL0q3SZ9QM/PkO7MUDbHlpKIdRFzWtWoFg7s 1YbLBUJ7TqJhvdUf/96U/PfCR6Gqe+U4fGR0EyF5zXGEioWcyjDX1i2RuLSdYkpIkA6V STw8AbxGHmP9eL4EIl5SHTSZZVoL8gPbrn/bgQ32+jcUI1wBN/jz6HNbk+Pc3Mmq5/8Q udLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=dPeuV4lI; 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 r15si11329973edq.306.2021.03.22.06.05.22; Mon, 22 Mar 2021 06:05:45 -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=dPeuV4lI; 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 S233336AbhCVNDB (ORCPT + 99 others); Mon, 22 Mar 2021 09:03:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:40960 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231435AbhCVMtm (ORCPT ); Mon, 22 Mar 2021 08:49:42 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2B211619F7; Mon, 22 Mar 2021 12:45:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616417118; bh=+N/vEXPFA2h7Hs+Xp+Ysnyf4OFcbKK4iAvPi5aDZgn0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dPeuV4lIzFpdfgMY+NOWEEwLN0D1VGRKk9QTMMKJovgn/tQ7TNE8K5WPjtpJEsRXV GcW/n1ZL5sj821lezpbsI4bEFo4BFwWBFATg0QHK/LVaUX/I/Vwlu8EPYyekt5isWk 59/jrjDlG/6JmYeSHERux4qzy2c2SCnmJDjX31Qw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tyrel Datwyler , Michael Ellerman Subject: [PATCH 4.19 33/43] PCI: rpadlpar: Fix potential drc_name corruption in store functions Date: Mon, 22 Mar 2021 13:28:47 +0100 Message-Id: <20210322121920.976130085@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121919.936671417@linuxfoundation.org> References: <20210322121919.936671417@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: Tyrel Datwyler commit cc7a0bb058b85ea03db87169c60c7cfdd5d34678 upstream. Both add_slot_store() and remove_slot_store() try to fix up the drc_name copied from the store buffer by placing a NUL terminator at nbyte + 1 or in place of a '\n' if present. However, the static buffer that we copy the drc_name data into is not zeroed and can contain anything past the n-th byte. This is problematic if a '\n' byte appears in that buffer after nbytes and the string copied into the store buffer was not NUL terminated to start with as the strchr() search for a '\n' byte will mark this incorrectly as the end of the drc_name string resulting in a drc_name string that contains garbage data after the n-th byte. Additionally it will cause us to overwrite that '\n' byte on the stack with NUL, potentially corrupting data on the stack. The following debugging shows an example of the drmgr utility writing "PHB 4543" to the add_slot sysfs attribute, but add_slot_store() logging a corrupted string value. drmgr: drmgr: -c phb -a -s PHB 4543 -d 1 add_slot_store: drc_name = PHB 4543°|<82>!, rc = -19 Fix this by using strscpy() instead of memcpy() to ensure the string is NUL terminated when copied into the static drc_name buffer. Further, since the string is now NUL terminated the code only needs to change '\n' to '\0' when present. Cc: stable@vger.kernel.org Signed-off-by: Tyrel Datwyler [mpe: Reformat change log and add mention of possible stack corruption] Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20210315214821.452959-1-tyreld@linux.ibm.com Signed-off-by: Greg Kroah-Hartman --- drivers/pci/hotplug/rpadlpar_sysfs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) --- a/drivers/pci/hotplug/rpadlpar_sysfs.c +++ b/drivers/pci/hotplug/rpadlpar_sysfs.c @@ -34,12 +34,11 @@ static ssize_t add_slot_store(struct kob if (nbytes >= MAX_DRC_NAME_LEN) return 0; - memcpy(drc_name, buf, nbytes); + strscpy(drc_name, buf, nbytes + 1); end = strchr(drc_name, '\n'); - if (!end) - end = &drc_name[nbytes]; - *end = '\0'; + if (end) + *end = '\0'; rc = dlpar_add_slot(drc_name); if (rc) @@ -65,12 +64,11 @@ static ssize_t remove_slot_store(struct if (nbytes >= MAX_DRC_NAME_LEN) return 0; - memcpy(drc_name, buf, nbytes); + strscpy(drc_name, buf, nbytes + 1); end = strchr(drc_name, '\n'); - if (!end) - end = &drc_name[nbytes]; - *end = '\0'; + if (end) + *end = '\0'; rc = dlpar_remove_slot(drc_name); if (rc)