aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorAlper Nebi Yasak2022-03-27 18:31:44 +0300
committerTom Rini2022-04-25 10:10:41 -0400
commit67bf2c8ded5b91ffa62e9aabededc9098810254f (patch)
tree9546e16722bd8956b9eeb279c07491e2ad97903b /tools
parent9bb99fa95826d1a608737ca821977b4136a1a278 (diff)
binman: Fix unique names having '/.' for images read from files
Binman can embed a copy of the image description into the images it builds as a fdtmap entry, but it omits the /binman/<image-name> prefix from the node paths while doing so. When reading an already-built image file, entries are reconstructed using this fdtmap and their associated nodes still lack that prefix. Some entries like fit and vblock create intermediate files whose names are based on an entry unique name. This name is constructed from their node's path by concatenating the parents with dots up to the binman node, e.g. /binman/image/foo/bar becomes 'image.foo.bar'. However, we don't have this /binman/image prefix when replacing entries in such an image. The /foo/bar entry we read when doing so erroneously has the unique name of '/.foo.bar', causing permission errors when the entry attempts to create files based on that. Fix the unique-name generation by stopping at the '/' node like how it stops at the binman node. As the unique names are used as filenames, add tests that check if they're safe to use as filenames. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/entry.py2
-rw-r--r--tools/binman/ftest.py31
-rw-r--r--tools/binman/test/230_unique_names.dts34
-rw-r--r--tools/binman/test/231_unique_names_multi.dts38
4 files changed, 104 insertions, 1 deletions
diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index 18a7a351054..a07a5888643 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -775,7 +775,7 @@ features to produce new behaviours.
node = self._node
while node.parent:
node = node.parent
- if node.name == 'binman':
+ if node.name in ('binman', '/'):
break
name = '%s.%s' % (node.name, name)
return name
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 4ce181a0666..94c4389b1b5 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -5523,5 +5523,36 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
with self.assertRaises(ValueError) as e:
data = self._DoReadFile('231_pre_load_invalid_key.dts')
+ def _CheckSafeUniqueNames(self, *images):
+ """Check all entries of given images for unsafe unique names"""
+ for image in images:
+ entries = {}
+ image._CollectEntries(entries, {}, image)
+ for entry in entries.values():
+ uniq = entry.GetUniqueName()
+
+ # Used as part of a filename, so must not be absolute paths.
+ self.assertFalse(os.path.isabs(uniq))
+
+ def testSafeUniqueNames(self):
+ """Test entry unique names are safe in single image configuration"""
+ data = self._DoReadFileRealDtb('230_unique_names.dts')
+
+ orig_image = control.images['image']
+ image_fname = tools.get_output_filename('image.bin')
+ image = Image.FromFile(image_fname)
+
+ self._CheckSafeUniqueNames(orig_image, image)
+
+ def testSafeUniqueNamesMulti(self):
+ """Test entry unique names are safe with multiple images"""
+ data = self._DoReadFileRealDtb('231_unique_names_multi.dts')
+
+ orig_image = control.images['image']
+ image_fname = tools.get_output_filename('image.bin')
+ image = Image.FromFile(image_fname)
+
+ self._CheckSafeUniqueNames(orig_image, image)
+
if __name__ == "__main__":
unittest.main()
diff --git a/tools/binman/test/230_unique_names.dts b/tools/binman/test/230_unique_names.dts
new file mode 100644
index 00000000000..6780d37f71f
--- /dev/null
+++ b/tools/binman/test/230_unique_names.dts
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <0xc00>;
+ allow-repack;
+
+ u-boot {
+ };
+
+ fdtmap {
+ };
+
+ u-boot2 {
+ type = "u-boot";
+ };
+
+ text {
+ text = "some text";
+ };
+
+ u-boot-dtb {
+ };
+
+ image-header {
+ location = "end";
+ };
+ };
+};
diff --git a/tools/binman/test/231_unique_names_multi.dts b/tools/binman/test/231_unique_names_multi.dts
new file mode 100644
index 00000000000..db63afb445e
--- /dev/null
+++ b/tools/binman/test/231_unique_names_multi.dts
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ multiple-images;
+
+ image {
+ size = <0xc00>;
+ allow-repack;
+
+ u-boot {
+ };
+
+ fdtmap {
+ };
+
+ u-boot2 {
+ type = "u-boot";
+ };
+
+ text {
+ text = "some text";
+ };
+
+ u-boot-dtb {
+ };
+
+ image-header {
+ location = "end";
+ };
+ };
+ };
+};