[libsoup/wip/noload] Abort when libsoup 2 is already loaded in process




commit ad2ecdfb45e1fea4f0138f864dd39cbfae843091
Author: Patrick Griffis <pgriffis igalia com>
Date:   Wed Apr 21 10:19:37 2021 -0500

    Abort when libsoup 2 is already loaded in process
    
    This avoids accidental mixups causing unpredictable issues

 libsoup/meson.build |  3 +++
 libsoup/soup-init.c | 13 +++++++++++++
 meson.build         | 15 +++++++++++++++
 3 files changed, 31 insertions(+)
---
diff --git a/libsoup/meson.build b/libsoup/meson.build
index adcccc3e..49d0d1aa 100644
--- a/libsoup/meson.build
+++ b/libsoup/meson.build
@@ -203,6 +203,7 @@ libsoup = library('soup-@0@'.format(apiversion),
   soversion : soversion,
   darwin_versions: darwin_versions,
   c_args : libsoup_c_args,
+  link_args : dl_link_args,
   include_directories : libsoup_includes,
   gnu_symbol_visibility: 'hidden',
   install : true,
@@ -215,6 +216,7 @@ libsoup_static = static_library('soup-@0@-static'.format(apiversion),
     soup_enums,
   ],
   c_args : libsoup_c_args,
+  link_args : dl_link_args,
   include_directories : libsoup_includes,
   dependencies : deps,
 )
@@ -236,6 +238,7 @@ libsoup_dep = declare_dependency(link_with : libsoup,
 libsoup_static_dep = declare_dependency(link_with : libsoup_static,
   include_directories : libsoup_includes,
   sources : soup_enum_h,
+  link_args : dl_link_args,
   dependencies : [ platform_deps, glib_deps ]
 )
 
diff --git a/libsoup/soup-init.c b/libsoup/soup-init.c
index 816c9ae9..9371139f 100644
--- a/libsoup/soup-init.c
+++ b/libsoup/soup-init.c
@@ -9,6 +9,10 @@
 #include <config.h>
 #endif
 
+#ifdef HAVE_RTLD_NOLOAD
+#include <dlfcn.h>
+#endif
+
 #include <glib/gi18n-lib.h>
 #include "gconstructor.h"
 
@@ -34,6 +38,15 @@ soup_init (void)
 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 #endif
+
+#ifdef HAVE_RTLD_NOLOAD
+        gpointer handle = dlopen("libsoup-2.4.so.1", RTLD_NOW | RTLD_NOLOAD);
+        if (handle) {
+                g_error ("libsoup 2 was detected while loading libsoup 3. This is not supported.");
+                dlclose (handle);
+        }
+#endif
+
 }
 
 #if defined (G_OS_WIN32)
diff --git a/meson.build b/meson.build
index 3881d7c7..02823395 100644
--- a/meson.build
+++ b/meson.build
@@ -161,6 +161,21 @@ if cc.has_function('gmtime_r', prefix : '#include <time.h>', args : default_sour
     cdata.set('HAVE_GMTIME_R', '1')
 endif
 
+# dlopen
+dl_dep = dependency('dl', required : false)
+dl_link_args = ''
+if cc.has_function('dlopen',
+  prefix : '#include <dlfcn.h>',
+  dependencies : dl_dep,
+  args : '-ldl'
+)
+  cdata.set('HAVE_RTLD_NOLOAD',
+    cc.has_header_symbol('dlfcn.h', 'RTLD_NOLOAD')
+  )
+  platform_deps += dl_dep
+  dl_link_args = '-ldl'
+endif
+
 # sysprof support
 libsysprof_capture_dep = dependency('sysprof-capture-4',
   required: get_option('sysprof'),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]