On Mon, Mar 09, 2015 at 10:27:15AM +0100, Igor Mammedov wrote: > On Sat, 7 Mar 2015 20:51:33 +0100 > "Michael S. Tsirkin" <m...@redhat.com> wrote: > > > 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. > While at it, could 'c' be made 'const Aml*' argument of aml_append() ???
I considered this but it's mostly useless since the buffer can still be modified. We can think about this using a patch on top. > > > > Signed-off-by: Michael S. Tsirkin <m...@redhat.com> > > --- > > hw/acpi/aml-build.c | 16 ++++++++++------ > > 1 file changed, 10 insertions(+), 6 deletions(-) > > > > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > > index 876cada..ff12b28 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 */