From f76e4ef683dcc4f64fa4684ed4be96841fc73023 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sat, 28 Dec 2013 19:37:18 -0500 Subject: [PATCH] typelib compiler: properly initialise memory The typelib compiler was writing uninitialised memory to the output file. There were two sources of this uninitialised memory: the hash writer included some uninitialised memory in its output, and the bytes added after the hash output for padding were also not being initialised. Fix this by passing the padded size to the hash code writer function and having that function initialise the entire memory region to zero before writing. https://bugzilla.gnome.org/show_bug.cgi?id=721177 --- girmodule.c | 3 ++- gthash.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/girmodule.c b/girmodule.c index 05c8987fc..e3897c34d 100644 --- a/girmodule.c +++ b/girmodule.c @@ -279,8 +279,9 @@ add_directory_index_section (guint8 *data, GIrModule *module, guint32 *offset2) alloc_section (data, GI_SECTION_DIRECTORY_INDEX, *offset2); required_size = _gi_typelib_hash_builder_get_buffer_size (dirindex_builder); + required_size = ALIGN_VALUE (required_size, 4); - new_offset = *offset2 + ALIGN_VALUE (required_size, 4); + new_offset = *offset2 + required_size; data = g_realloc (data, new_offset); diff --git a/gthash.c b/gthash.c index ecc3b1040..831c87e97 100644 --- a/gthash.c +++ b/gthash.c @@ -158,6 +158,8 @@ _gi_typelib_hash_builder_pack (GITypelibHashBuilder *builder, guint8* mem, guint g_assert (len >= builder->packed_size); g_assert ((((unsigned long)mem) & 0x3) == 0); + memset (mem, 0, len); + *((guint32*) mem) = builder->dirmap_offset; packed_mem = (guint8*)(mem + sizeof(guint32)); cmph_pack (builder->c, packed_mem);