From patchwork Thu Sep 5 08:48:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthias Brugger X-Patchwork-Id: 1158306 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="BXnzI/bb"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46PDsz48K4z9sDQ for ; Thu, 5 Sep 2019 18:50:31 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 43139C21DA6; Thu, 5 Sep 2019 08:49:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 69F30C21E49; Thu, 5 Sep 2019 08:49:49 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 3C9B5C21E3A; Thu, 5 Sep 2019 08:49:12 +0000 (UTC) Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by lists.denx.de (Postfix) with ESMTPS id 1B535C21DD7 for ; Thu, 5 Sep 2019 08:49:10 +0000 (UTC) Received: from ziggy.de (unknown [37.223.145.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4BB7321743; Thu, 5 Sep 2019 08:49:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1567673348; bh=QhwT8R9VrQa6kJ67/KLwrgZrin6ePPEIdgejph54S8k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BXnzI/bbgoNyDz3AvIeanIrY4aCCWisnQBZKu0g38lDFg5RYo3rT34Uqr9Z0wDHng wHOm4gi9H0Uwt44leKJSn3icbdH2WX9k8xM2OWcKz7HXOtlK/qa06bM4iNRSVvx9kV 0qEo/Mq1WqgGy8wz3Y1+PiBxU7Su3a2vDyIAmsZw= From: matthias.bgg@kernel.org To: treding@nvidia.com, sjg@chromium.org, swarren@nvidia.com Date: Thu, 5 Sep 2019 10:48:48 +0200 Message-Id: <20190905084849.20596-4-matthias.bgg@kernel.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190905084849.20596-1-matthias.bgg@kernel.org> References: <20190905084849.20596-1-matthias.bgg@kernel.org> MIME-Version: 1.0 Cc: u-boot@lists.denx.de, Matthias Brugger , matthias.bgg@kernel.org Subject: [U-Boot] [PATCH v2 3/4] libfdt: Allow #size-cells of 0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Matthias Brugger The commit "libfdt: fdt_address_cells() and fdt_size_cells()" introduced a bug as it consolidated code between the helpers for getting be 0, and is frequently found so in practice for /cpus. IEEE1275 only requires implementations to handle 1..4 for #address-cells, although one could make a case for #address-cells == #size-cells == 0 being used to represent a bridge with a single port. While we're there, it's not totally obvious that the existing implicit cast of a u32 to int will give the correct results according to strict C, although it does work in practice. Straighten that up to cast only after we've made our range checks. This is based on upstream commit: b8d6eca ("libfdt: Allow #size-cells of 0") but misses the test cases,as we don't implement them in U-Boot. Signed-off-by: Matthias Brugger Reviewed-by: Simon Glass Reviewed-by: Simon Glass --- scripts/dtc/libfdt/fdt_addresses.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c index f13a87dfa0..788c143113 100644 --- a/scripts/dtc/libfdt/fdt_addresses.c +++ b/scripts/dtc/libfdt/fdt_addresses.c @@ -59,7 +59,7 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) { const fdt32_t *c; - int val; + uint32_t val; int len; c = fdt_getprop(fdt, nodeoffset, name, &len); @@ -70,10 +70,10 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) return -FDT_ERR_BADNCELLS; val = fdt32_to_cpu(*c); - if ((val <= 0) || (val > FDT_MAX_NCELLS)) + if (val > FDT_MAX_NCELLS) return -FDT_ERR_BADNCELLS; - return val; + return (int)val; } int fdt_address_cells(const void *fdt, int nodeoffset) @@ -81,6 +81,8 @@ int fdt_address_cells(const void *fdt, int nodeoffset) int val; val = fdt_cells(fdt, nodeoffset, "#address-cells"); + if (val == 0) + return -FDT_ERR_BADNCELLS; if (val == -FDT_ERR_NOTFOUND) return 2; return val;