From 82dd8c7846ec09dbe1dc9237e9e5ceb84d1a9c29 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 20 Jul 2023 19:47:08 +0100 Subject: [PATCH] tools: amldecode: fix read_pkg_length reading multibyte lengths in the wrong order --- tools/amldecode/aml/opcode.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/tools/amldecode/aml/opcode.c b/tools/amldecode/aml/opcode.c index 54c6e1b..7132d91 100644 --- a/tools/amldecode/aml/opcode.c +++ b/tools/amldecode/aml/opcode.c @@ -22,32 +22,42 @@ static int32_t read_pkg_length(struct aml_parser *parser) } int32_t len = 0; - int32_t tmp = 0; + int32_t p1 = 0, p2 = 0, p3 = 0; int nbytes = (p0 & 0xC0) >> 6; switch (nbytes) { case 3: - tmp = aml_parser_advance(parser); - if (tmp == PARSE_EOF) { + p1 = aml_parser_advance(parser); + p2 = aml_parser_advance(parser); + p3 = aml_parser_advance(parser); + if (p3 == PARSE_EOF) { return PARSE_EOF; } - len |= tmp << 20; + len = p0 & 0x0F; + len |= p1 << 4; + len |= p2 << 12; + len |= p3 << 20; + break; case 2: - tmp = aml_parser_advance(parser); - if (tmp == PARSE_EOF) { + p1 = aml_parser_advance(parser); + p2 = aml_parser_advance(parser); + if (p2 == PARSE_EOF) { return PARSE_EOF; } - len |= tmp << 12; + len = p0 & 0x0F; + len |= p1 << 4; + len |= p2 << 12; + break; case 1: - len |= p0 & 0x0F; - tmp = aml_parser_advance(parser); - if (tmp == PARSE_EOF) { + p1 = aml_parser_advance(parser); + if (p1 == PARSE_EOF) { return PARSE_EOF; } - len |= tmp << 4; + len = p0 & 0x0F; + len |= p1 << 4; break; case 0: len = p0 & 0x3F;