From 4b68c6b3605ac3ef47e1594c0cde415f6f286134 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Mon, 18 Feb 2019 17:48:52 +0100 Subject: pylibfdt: Proper handling of bytes/unicode strings and octal literals Signed-off-by: Lumir Balhar Message-Id: <20190218164856.23861-1-frenzy@frenzy.cz> Signed-off-by: David Gibson --- pylibfdt/libfdt.i | 14 +++++++++++--- tests/pylibfdt_tests.py | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/pylibfdt/libfdt.i b/pylibfdt/libfdt.i index 462b5b0..6f1f1dc 100644 --- a/pylibfdt/libfdt.i +++ b/pylibfdt/libfdt.i @@ -669,7 +669,7 @@ class Fdt(FdtRo): Raises: FdtException if no parent found or other error occurs """ - val = val.encode('utf-8') + '\0' + val = val.encode('utf-8') + b'\0' return check_err(fdt_setprop(self._fdt, nodeoffset, prop_name, val, len(val)), quiet) @@ -1074,12 +1074,20 @@ typedef uint32_t fdt32_t; if (!$1) $result = Py_None; else - $result = Py_BuildValue("s#", $1, *arg4); + %#if PY_VERSION_HEX >= 0x03000000 + $result = Py_BuildValue("y#", $1, *arg4); + %#else + $result = Py_BuildValue("s#", $1, *arg4); + %#endif } /* typemap used for fdt_setprop() */ %typemap(in) (const void *val) { - $1 = PyString_AsString($input); /* char *str */ + %#if PY_VERSION_HEX >= 0x03000000 + $1 = PyBytes_AsString($input); + %#else + $1 = PyString_AsString($input); /* char *str */ + %#endif } /* typemaps used for fdt_next_node() */ diff --git a/tests/pylibfdt_tests.py b/tests/pylibfdt_tests.py index 34c680d..4761c52 100644 --- a/tests/pylibfdt_tests.py +++ b/tests/pylibfdt_tests.py @@ -84,7 +84,7 @@ PHANDLE_2 = 0x2001 TEST_STRING_1 = 'hello world' TEST_STRING_2 = 'hi world' -TEST_STRING_3 = u'unicode ' + unichr(467) +TEST_STRING_3 = u'unicode \u01d3' def get_err(err_code): @@ -107,7 +107,7 @@ def _ReadFdt(fname): Returns: Fdt bytearray suitable for passing to libfdt functions """ - return libfdt.Fdt(open(fname).read()) + return libfdt.Fdt(open(fname, mode='rb').read()) class PyLibfdtBasicTests(unittest.TestCase): """Test class for basic pylibfdt access functions @@ -164,7 +164,7 @@ class PyLibfdtBasicTests(unittest.TestCase): def testBadFdt(self): """Check that a filename provided accidentally is not accepted""" with self.assertRaises(FdtException) as e: - fdt = libfdt.Fdt('a string') + fdt = libfdt.Fdt(b'a string') self.assertEquals(e.exception.err, -libfdt.BADMAGIC) def testSubnodeOffset(self): @@ -239,7 +239,7 @@ class PyLibfdtBasicTests(unittest.TestCase): poffset = self.fdt.first_property_offset(root) prop = self.fdt.get_property_by_offset(poffset) self.assertEquals(prop.name, 'compatible') - self.assertEquals(prop, 'test_tree1\0') + self.assertEquals(prop, b'test_tree1\0') with self.assertRaises(FdtException) as e: self.fdt.get_property_by_offset(-2) @@ -252,7 +252,7 @@ class PyLibfdtBasicTests(unittest.TestCase): """Check that we can read the contents of a property by name""" root = self.fdt.path_offset('/') value = self.fdt.getprop(root, "compatible") - self.assertEquals(value, 'test_tree1\0') + self.assertEquals(value, b'test_tree1\0') self.assertEquals(-libfdt.NOTFOUND, self.fdt.getprop(root, 'missing', QUIET_NOTFOUND)) @@ -262,7 +262,7 @@ class PyLibfdtBasicTests(unittest.TestCase): node = self.fdt.path_offset('/subnode@1/subsubnode') value = self.fdt.getprop(node, "compatible") - self.assertEquals(value, 'subsubnode1\0subsubnode\0') + self.assertEquals(value, b'subsubnode1\0subsubnode\0') def testStrError(self): """Check that we can get an error string""" @@ -591,7 +591,7 @@ class PyLibfdtSwTests(unittest.TestCase): # Make sure we can read from the tree too node = sw.path_offset('/subnode@1') - self.assertEqual('subnode1' + chr(0), sw.getprop(node, 'compatible')) + self.assertEqual(b'subnode1\0', sw.getprop(node, 'compatible')) # Make sure we did at least two resizes self.assertTrue(len(fdt.as_bytearray()) > FdtSw.INC_SIZE * 2) @@ -609,15 +609,15 @@ class PyLibfdtRoTests(unittest.TestCase): def setUp(self): """Read in the device tree we use for testing""" - self.fdt = libfdt.FdtRo(open('test_tree1.dtb').read()) + self.fdt = libfdt.FdtRo(open('test_tree1.dtb', mode='rb').read()) def testAccess(self): """Basic sanity check for the FdtRo class""" node = self.fdt.path_offset('/subnode@1') - self.assertEqual('subnode1' + chr(0), + self.assertEqual(b'subnode1\0', self.fdt.getprop(node, 'compatible')) node = self.fdt.first_subnode(node) - self.assertEqual('this is a placeholder string\0string2\0', + self.assertEqual(b'this is a placeholder string\0string2\0', self.fdt.getprop(node, 'placeholder')) -- cgit v1.2.1