diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2015-03-07 20:47:51 +0100 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2015-03-10 16:09:58 +0100 |
commit | 7d433b0d85eba3d5083be6b74fd111f6de4ee373 (patch) | |
tree | 652e7675a51d22c1e96568024f36e06fc763152c | |
parent | 8437f7be3b1c49631e435c652707f2cee477149d (diff) |
aml-build: don't modify child
this code:
aml_append(foo, bar);
might, non-intuitively, modify bar, which means that e.g. the following
might not DTRT:
c = ....;
aml_append(a, c);
aml_append(b, c);
to fix, simply allocate an intermediate array,
and always modify that.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
-rw-r--r-- | hw/acpi/aml-build.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 876cada4b2..ff12b28299 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -335,26 +335,29 @@ static void build_buffer(GArray *array, uint8_t op) void aml_append(Aml *parent_ctx, Aml *child) { + GArray *buf = build_alloc_array(); + build_append_array(buf, child->buf); + switch (child->block_flags) { case AML_OPCODE: build_append_byte(parent_ctx->buf, child->op); break; case AML_EXT_PACKAGE: - build_extop_package(child->buf, child->op); + build_extop_package(buf, child->op); break; case AML_PACKAGE: - build_package(child->buf, child->op); + build_package(buf, child->op); break; case AML_RES_TEMPLATE: - build_append_byte(child->buf, 0x79); /* EndTag */ + build_append_byte(buf, 0x79); /* EndTag */ /* * checksum operations are treated as succeeded if checksum * field is zero. [ACPI Spec 1.0b, 6.4.2.8 End Tag] */ - build_append_byte(child->buf, 0); + build_append_byte(buf, 0); /* fall through, to pack resources in buffer */ case AML_BUFFER: - build_buffer(child->buf, child->op); + build_buffer(buf, child->op); break; case AML_NO_OPCODE: break; @@ -362,7 +365,8 @@ void aml_append(Aml *parent_ctx, Aml *child) assert(0); break; } - build_append_array(parent_ctx->buf, child->buf); + build_append_array(parent_ctx->buf, buf); + build_free_array(buf); } /* ACPI 1.0b: 16.2.5.1 Namespace Modifier Objects Encoding: DefScope */ |