From 4dafb4d5cfe3e104514e2fd1c951d9939bca4ed2 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Tue, 3 Oct 2017 14:29:00 +0800 Subject: [PATCH] girepository: Properly acquire and check pointer values On Windows (Visual Studio at least), unsigned longs are always 4 bytes, on both 32-bit and x64 Windows, so we cannot use unsigned longs to deal with pointers on 64-bit builds, as pointers are 8 bytes on 64-bit Windows, which may well render the pointer (which we acquired from libffi) invalid. This will fix crashes in PyGObject which are manifested when launching the cairo-demo example sript (intermittent) and when clicking on "Interactive Dialog" button in the Dialog demo in the PyGObject GTK+ Code demos before entering anything in Entry 1 and Entry 2, when running on x64 Visual Studio builds of the GTK+/PyGObject stack. Also use size_t instead of unsigned long in gthash.c when we check that memory & 0x3 is 0, to silence compiler warnings from enabling /Wp64, which is used to detect portability problems on Visual Studio when doing x86->x64 code builds. https://bugzilla.gnome.org/show_bug.cgi?id=702788 --- gicallableinfo.c | 4 ++-- gthash.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gicallableinfo.c b/gicallableinfo.c index bfbcc255a..5f923d1a9 100644 --- a/gicallableinfo.c +++ b/gicallableinfo.c @@ -535,7 +535,7 @@ gi_type_info_extract_ffi_return_value (GITypeInfo *return_info, arg->v_int32 = (gint32) ffi_value->v_long; break; default: - arg->v_pointer = (gpointer) ffi_value->v_ulong; + arg->v_pointer = (gpointer) ffi_value->v_pointer; break; } @@ -543,7 +543,7 @@ gi_type_info_extract_ffi_return_value (GITypeInfo *return_info, } break; default: - arg->v_pointer = (gpointer) ffi_value->v_ulong; + arg->v_pointer = (gpointer) ffi_value->v_pointer; break; } } diff --git a/gthash.c b/gthash.c index 7440913ae..2fda90359 100644 --- a/gthash.c +++ b/gthash.c @@ -158,7 +158,7 @@ _gi_typelib_hash_builder_pack (GITypelibHashBuilder *builder, guint8* mem, guint g_return_if_fail (builder->buildable); g_assert (len >= builder->packed_size); - g_assert ((((unsigned long)mem) & 0x3) == 0); + g_assert ((((size_t)mem) & 0x3) == 0); memset (mem, 0, len); @@ -202,7 +202,7 @@ _gi_typelib_hash_search (guint8* memory, const char *str, guint n_entries) guint32 dirmap_offset; guint32 offset; - g_assert ((((unsigned long)memory) & 0x3) == 0); + g_assert ((((size_t)memory) & 0x3) == 0); mph = ((guint32*)memory)+1; offset = cmph_search_packed (mph, str, strlen (str));