binman: Refuse to replace sections for now

Binman interfaces allow attempts to replace any entry in the image with
arbitrary data. When trying to replace sections, the changes in the
section entry's data are not propagated to its child entries. This,
combined with how sections rebuild their contents from its children,
eventually causes the replaced contents to be silently overwritten by
rebuilt contents equivalent to the original data.

Add a simple test for replacing a section that is currently failing due
to this behaviour, and mark it as an expected failure. Also, raise an
error when replacing a section instead of silently pretending it was
replaced.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Alper Nebi Yasak 2022-03-27 18:31:50 +03:00 committed by Tom Rini
parent 99283e5389
commit 82337bb6b6
3 changed files with 35 additions and 0 deletions

View File

@ -788,6 +788,9 @@ class Entry_section(Entry):
data = new_data
return data
def WriteData(self, data, decomp=True):
self.Raise("Replacing sections is not implemented yet")
def WriteChildData(self, child):
return True

View File

@ -5693,6 +5693,15 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
self.assertIsNotNone(path)
self.assertEqual(expected_fdtmap, fdtmap)
@unittest.expectedFailure
def testReplaceSectionSimple(self):
"""Test replacing a simple section with arbitrary data"""
new_data = b'w' * len(COMPRESS_DATA + U_BOOT_DATA)
data, expected_fdtmap, _ = self._RunReplaceCmd(
'section', new_data,
dts='234_replace_section_simple.dts')
self.assertEqual(new_data, data)
if __name__ == "__main__":
unittest.main()

View File

@ -0,0 +1,23 @@
// SPDX-License-Identifier: GPL-2.0+
/dts-v1/;
/ {
binman {
allow-repack;
u-boot-dtb {
};
section {
blob {
filename = "compress";
};
u-boot {
};
};
fdtmap {
};
};
};