Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp376102imu; Thu, 8 Nov 2018 22:10:43 -0800 (PST) X-Google-Smtp-Source: AJdET5dykWe9Qr+G/t+2rT5+gQf8WAmYX+Fbm102k5i9ehkgxOURgwMRupIK33wnEoIghIhcRrA1 X-Received: by 2002:a63:4384:: with SMTP id q126mr6361164pga.160.1541743843024; Thu, 08 Nov 2018 22:10:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541743842; cv=none; d=google.com; s=arc-20160816; b=iSc2wlfyYN5QB4sB/gLUf45OVEyX8oTD7zopkgPTmu3qmDsWYpO9tCiXUF2zMWTzqv jYwllN7qfmvt0b+HfLJn4x6IyAwwinjpx8BN83ZaosJCBWlDDPPPfiL96nm3UrILXbGf XROBcmzTwkDqZvm46NMcBnlq7d5qF6mUYe1Pgac14R/anO4W7YvwpEfTZl5A1YNuEev0 38uqI8raWedopBTox9ukSVDl4K1lghJO+GCoWmmTH8epL9pl4jiInHAjNEtsxGf9BR3x pqz8Z+rF5EUubSxDk79CDP039NAC6aAvIvngzlZYtZm+DNFUkJmDEWNph/oGp94P8pFX 8iaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=9a1Olt+9gSUcbGlkI6FmhtduS6tNkDQuhvu9c7HHqj8=; b=nagTAVHW2X8CGPEVFK+K/jGN8+MIXn30fyXNj0hDvpR5r744CQsCGsK1QdKETkt+6C Rr9EAY3zOsEWITf3cJCSZ6/GJ0/LvqqR6f6s4eYu++PYr8zHRxihwHCfjjc7i0UzXDCZ slutBdng05Fn4CLj+p0VvTViUhQjYbpYOIbKsr2GgHy3CFP+Tf7QeQ0XcbGwCx+BKTGy wkJRXl8/zTm3TEU3sJjEl0PTifcmH7fvyYOgDghwexZR128gfq/TN80toY0xQemzWCok kV333JgSKLpk097sV9BO8QfbISaZXnhuRKcxkfYpKTw5XXWNeByt0qGUZMcIPhkHY8wl sAMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JoePG8V9; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f11-v6si7390680pfh.33.2018.11.08.22.10.27; Thu, 08 Nov 2018 22:10:42 -0800 (PST) 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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JoePG8V9; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728109AbeKIPq7 (ORCPT + 99 others); Fri, 9 Nov 2018 10:46:59 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:46068 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727704AbeKIPq7 (ORCPT ); Fri, 9 Nov 2018 10:46:59 -0500 Received: by mail-pf1-f195.google.com with SMTP id p17-v6so432866pfj.12; Thu, 08 Nov 2018 22:07:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9a1Olt+9gSUcbGlkI6FmhtduS6tNkDQuhvu9c7HHqj8=; b=JoePG8V9MYM0jxW4xy99V24ecpn2bzFyJI6k64nJfE7e5CLtXFTHrwDOQeg2Dqfka0 9VpM1rJNgqegnWhX89hbSH5FwdDz2v0Cr+IUW02hN/E8S/leqNEL2hBcJEPZn7uZoEpd tM+LZVpSo/bdyzQvMxrZo+2hR5Sg1gtjoQdnt+oi8/GXyckRA/bOdOmaE/TIXk/XzTf3 muSGlbzvjLBZtfnltPTkiFJysTXx3ku1CDNBUaFQ3FfEEi4FfZWCgwsAQzWI0+vd6hdJ h942KjrfAofO0M4iyQb3g7OGseqISJo0rIK/cM9OJjYxb5gcsXwVdaI2ub745YV68wAm Nn9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9a1Olt+9gSUcbGlkI6FmhtduS6tNkDQuhvu9c7HHqj8=; b=aZsNmKohRPY47zwDA1dXyd4iWZAiLSoC4JRs1aC6wmDo+DPtcr5BnGotjBUqWibKNG ZzpH2oRb0jVUEFE9jghiF0/+7J943i6onXhzGyaT+X2zlAqyOJGEsokPJ2a9ZGeClIRC FKallu3Jmptw8ITSrnIwFmv1Dwbh6UQbL5bjKaRafH3K9sxBk8e2FWMrwAjBOVc9UWxF mElhH6YTjBPUd5HNxZbUG+6x3d0mNWn/3opZOwW0owev4RY6fPMbjThJPqKr3YVQA8jA Wxy6CEOUKQTnSOZjhlQsmHJMhhgTHNhtPfMrHO2UvnqRC9iq9l+o/qb/h1cWwkk/etS8 A0Pw== X-Gm-Message-State: AGRZ1gJyq1HbAXVuGYPY96MsgARc2P+5vCIcjuhHFb+QkLDg+oovp2kD 4V/IRINo7Ot7vuKuxsWdBug= X-Received: by 2002:a62:da54:: with SMTP id w20-v6mr7680853pfl.106.1541743677771; Thu, 08 Nov 2018 22:07:57 -0800 (PST) Received: from localhost.localdomain (c-24-6-192-50.hsd1.ca.comcast.net. [24.6.192.50]) by smtp.gmail.com with ESMTPSA id c70-v6sm6620722pfg.97.2018.11.08.22.07.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 08 Nov 2018 22:07:57 -0800 (PST) From: frowand.list@gmail.com To: Rob Herring , Pantelis Antoniou , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Alan Tull , Moritz Fischer Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, devicetree@vger.kernel.org, linux-fpga@vger.kernel.org Subject: [PATCH v7 11/17] of: overlay: check prevents multiple fragments add or delete same node Date: Thu, 8 Nov 2018 22:05:59 -0800 Message-Id: <1541743565-23163-12-git-send-email-frowand.list@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1541743565-23163-1-git-send-email-frowand.list@gmail.com> References: <1541743565-23163-1-git-send-email-frowand.list@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Frank Rowand Multiple overlay fragments adding or deleting the same node is not supported. Replace code comment of such, with check to detect the attempt and fail the overlay apply. Devicetree unittest where multiple fragments added the same node was added in the previous patch in the series. After applying this patch the unittest messages will no longer include: Duplicate name in motor-1, renamed to "controller#1" OF: overlay: of_overlay_apply() err=0 ### dt-test ### of_overlay_fdt_apply() expected -22, ret=0, overlay_bad_add_dup_node ### dt-test ### FAIL of_unittest_overlay_high_level():2419 Adding overlay 'overlay_bad_add_dup_node' failed ... ### dt-test ### end of unittest - 210 passed, 1 failed but will instead include: OF: overlay: ERROR: multiple overlay fragments add and/or delete node /testcase-data-2/substation@100/motor-1/controller ... ### dt-test ### end of unittest - 211 passed, 0 failed Tested-by: Alan Tull Signed-off-by: Frank Rowand --- checkpatch errors "line over 80 characters" and "Too many leading tabs" are ok, they will be fixed later in this series drivers/of/overlay.c | 58 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index c8f88b0836a3..8af8115bd36e 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -392,14 +392,6 @@ static int add_changeset_property(struct overlay_changeset *ovcs, * a live devicetree created from Open Firmware. * * NOTE_2: Multiple mods of created nodes not supported. - * If more than one fragment contains a node that does not already exist - * in the live tree, then for each fragment of_changeset_attach_node() - * will add a changeset entry to add the node. When the changeset is - * applied, __of_attach_node() will attach the node twice (once for - * each fragment). At this point the device tree will be corrupted. - * - * TODO: add integrity check to ensure that multiple fragments do not - * create the same node. * * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if * invalid @overlay. @@ -517,6 +509,54 @@ static int build_changeset_symbols_node(struct overlay_changeset *ovcs, } /** + * check_changeset_dup_add_node() - changeset validation: duplicate add node + * @ovcs: Overlay changeset + * + * Check changeset @ovcs->cset for multiple add node entries for the same + * node. + * + * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if + * invalid overlay in @ovcs->fragments[]. + */ +static int check_changeset_dup_add_node(struct overlay_changeset *ovcs) +{ + struct of_changeset_entry *ce_1, *ce_2; + char *fn_1, *fn_2; + int name_match; + + list_for_each_entry(ce_1, &ovcs->cset.entries, node) { + + if (ce_1->action == OF_RECONFIG_ATTACH_NODE || + ce_1->action == OF_RECONFIG_DETACH_NODE) { + + ce_2 = ce_1; + list_for_each_entry_continue(ce_2, &ovcs->cset.entries, node) { + if (ce_2->action == OF_RECONFIG_ATTACH_NODE || + ce_2->action == OF_RECONFIG_DETACH_NODE) { + /* inexpensive name compare */ + if (!of_node_cmp(ce_1->np->full_name, + ce_2->np->full_name)) { + /* expensive full path name compare */ + fn_1 = kasprintf(GFP_KERNEL, "%pOF", ce_1->np); + fn_2 = kasprintf(GFP_KERNEL, "%pOF", ce_2->np); + name_match = !strcmp(fn_1, fn_2); + kfree(fn_1); + kfree(fn_2); + if (name_match) { + pr_err("ERROR: multiple overlay fragments add and/or delete node %pOF\n", + ce_1->np); + return -EINVAL; + } + } + } + } + } + } + + return 0; +} + +/** * build_changeset() - populate overlay changeset in @ovcs from @ovcs->fragments * @ovcs: Overlay changeset * @@ -571,7 +611,7 @@ static int build_changeset(struct overlay_changeset *ovcs) } } - return 0; + return check_changeset_dup_add_node(ovcs); } /* -- Frank Rowand