Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2488750imm; Thu, 18 Oct 2018 15:49:50 -0700 (PDT) X-Google-Smtp-Source: ACcGV60K/Qw/35rYnhpdTNZNNrPN1n93OqbwmvQHtpEjK/OK3KaVKMjo8S5jb6u8/QMxAabUR02Y X-Received: by 2002:a63:1711:: with SMTP id x17-v6mr29534738pgl.364.1539902989966; Thu, 18 Oct 2018 15:49:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539902989; cv=none; d=google.com; s=arc-20160816; b=zcRoqmvkZ6AmSGWjapm1Vgi+aW7cEjyd+35UN0c5OucfEHqj6lzmI+Sb5nnBNatLvX vThG8HGK1keSJgfvuZgYAxRLw3I2YOEGEvBEEGEMQHBYAa4Nq4Ws6/DqqS5mf2TwLJif 2dyyvFoB6Q6FAaXqDwzLp7bjnj8s4xxDvo6GtEXTV4lwDjS+uDqcSJj2uTmATDFMpi2S l7oTaD4YomPLEh3C+s73vTqPvtCaSFe7SSySP0rSZ4m/KznMKUPfL1tcnupnCmPOEGQ1 ddqSGC3OOwF30k6cI0Ih0rIQ/7Qwn9/nDdpi1NCWf6Lqm8EfdXtHKQJqIqAz5vR8h4qc GBcA== 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=Qu97L87RGKi+8AyH9EKaRg09X+fdaCoy/llppuDOcJE=; b=gznwj8ArvOoAAOuInwMnpd3LQizRYnJp+YskaXIXi4bI2u5+Uax8pU31tfoAwYrR1T im47r5dWEkFenDNkx2QVQ81xIwvrJK0Q7IO7JAAux6ZpYltSarNCmzl0pq7MORvNvQMe aGUyH+bm3OHsLuuEchxrQKkpKSiuB8J0166rd2//AYxJlEUASZz/RvAuEmFH8K4pGbiw IfxhA5Bcx6KmSDFVH/iMsJM1gF4sh6Hig++Ae10JD4HxOMEvlJ3QgLnakMVBvu1l1Ml/ XQWIg/xdnZnCTiTQwIAkJVk38MqlYtOOBJgGUHGLnG/hFrEScNzU/SLS3Ny6pyQhE8h2 ynwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=UDtnt9Js; 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 c1-v6si21426072plr.21.2018.10.18.15.49.34; Thu, 18 Oct 2018 15:49:49 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=UDtnt9Js; 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 S1727658AbeJSGva (ORCPT + 99 others); Fri, 19 Oct 2018 02:51:30 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:35514 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727622AbeJSGv3 (ORCPT ); Fri, 19 Oct 2018 02:51:29 -0400 Received: by mail-pl1-f193.google.com with SMTP id f8-v6so14982513plb.2; Thu, 18 Oct 2018 15:48:19 -0700 (PDT) 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=Qu97L87RGKi+8AyH9EKaRg09X+fdaCoy/llppuDOcJE=; b=UDtnt9JsZOsgIUxfbT3FOkloaNseK0BoQaqLhK2Q5jDJHzyIkCDrylzICRqpoqZpL5 WHQDhw7D8FwNugi3DzON7wPSlXZuN3GcqEgte4P5UJ1kXBrOWvDZeT6aAojsoaJID6vU lWkRmpdXgnaDl7RjIWEHBT1cwkoZZgOGAWFbWuWnJpnOAYBkprjW860xwmUh0Kn7nqid HBiJ4uizS/yzz9REdNaLW0Fv79n3f0gAXhvuYr7hoIygDvQCOyrS+fZtXQLkzvVjuPog uRRmc9BHO4hEgL5h3q3kqOOg4HlPOuu/8AOOU2OHNu6g18lUVS/CvLk6sUChRKQqGcki Galw== 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=Qu97L87RGKi+8AyH9EKaRg09X+fdaCoy/llppuDOcJE=; b=rHpXpynGc2Bu2VN2CuMOesISGxjZS37RcQ3h+r5dX78D1PGflVrE5Ux79P50YXkg1m YV73ilRQ6kg8/LFMu5VcOWwPwabARLGJLEnJsrqeL3S5rNK6YVd3MD2c2zXfmZUU7eb6 akOOI/essqqbT0JKbKz87x1/N7TBYKzJ1Vrneul69rBhV9E91uaaOZs0XgvZ4sFztLnR O9oAq3St1X+d1VxmDLymPCRMBFhWmQJf1x4b1KDX9HELjohGk2dceBX1syMwzLvlai4K rthvdzKxL2Ez4FhP3u5OooTXJDfyoLIKcU5eYEBOjXT2b7b3ARH2LAsTTc2Yj8zNYC+n 6hPQ== X-Gm-Message-State: ABuFfohJV9IjvNBIFFgo93iJ+ilf+vAXiNQzOAyBI84ruXj+yptAFsoe RiK7Aszr8r5NjP1UHfFCOFY= X-Received: by 2002:a17:902:a50e:: with SMTP id s14-v6mr31667667plq.78.1539902898895; Thu, 18 Oct 2018 15:48:18 -0700 (PDT) Received: from localhost.localdomain (c-24-6-192-50.hsd1.ca.comcast.net. [24.6.192.50]) by smtp.gmail.com with ESMTPSA id v81-v6sm38129268pfj.25.2018.10.18.15.48.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 18 Oct 2018 15:48:18 -0700 (PDT) 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 v5 12/18] of: overlay: check prevents multiple fragments add or delete same node Date: Thu, 18 Oct 2018 15:46:30 -0700 Message-Id: <1539902796-8382-13-git-send-email-frowand.list@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1539902796-8382-1-git-send-email-frowand.list@gmail.com> References: <1539902796-8382-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 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 88e346234ae7..e12f2c28a36a 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