summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2013-12-28 19:37:18 -0500
committerRyan Lortie <desrt@desrt.ca>2013-12-30 22:31:53 -0500
commitfe7fd5dc0e61b9b546a65a0d14f498f6514b072f (patch)
tree25a8570fdb59c10f9617f8e48918dc0eb0784c82
parentf27aff293b8f811dbea6311d06be42eec2d980d8 (diff)
downloadgobject-introspection-fe7fd5dc0e61b9b546a65a0d14f498f6514b072f.tar.gz
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
-rw-r--r--girepository/girmodule.c3
-rw-r--r--girepository/gthash.c2
2 files changed, 4 insertions, 1 deletions
diff --git a/girepository/girmodule.c b/girepository/girmodule.c
index 05c8987f..e3897c34 100644
--- a/girepository/girmodule.c
+++ b/girepository/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/girepository/gthash.c b/girepository/gthash.c
index ecc3b104..831c87e9 100644
--- a/girepository/gthash.c
+++ b/girepository/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);