/*
- * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
+ * Copyright (C) 2015-2020 "IoT.bzh"
* Author José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* limitations under the License.
*/
+#if WITH_DYNAMIC_BINDING
+
#define _GNU_SOURCE
#include <stdio.h>
+#include <stdlib.h>
#include <dlfcn.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include "afb-api-so.h"
-#include "afb-api-so-v2.h"
#include "afb-api-so-v3.h"
#include "verbose.h"
#include "sig-monitor.h"
-#if defined(WITH_LEGACY_BINDING_V1)
+#if WITH_LEGACY_BINDING_V1
# include "afb-api-so-v1.h"
#endif
-#if defined(WITH_LEGACY_BINDING_VDYN)
+#if WITH_LEGACY_BINDING_VDYN
# include "afb-api-so-vdyn.h"
#endif
+#if WITH_LEGACY_BINDING_V2
+# include "afb-api-so-v2.h"
+#endif
struct safe_dlopen
{
int obsolete = 0;
int rc;
void *handle;
+ static int dlopen_flags = 0;
+
+ /* compute the dlopen flags */
+ if (dlopen_flags == 0) {
+ /* For ASan mode, export AFB_NO_RTLD_DEEPBIND=1, to disable RTLD_DEEPBIND */
+ char *string = secure_getenv("AFB_NO_RTLD_DEEPBIND");
+ if (string && string[0] == '1' && string[1] == 0)
+ dlopen_flags = RTLD_NOW | RTLD_LOCAL;
+ else
+ dlopen_flags = RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND;
+ }
- // This is a loadable library let's check if it's a binding
+ /* set default return code rc according to force */
rc = -!!force;
- handle = safe_dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND);
+
+ /* try to open the library */
+ handle = safe_dlopen(path, dlopen_flags);
if (handle == NULL) {
if (force)
ERROR("binding [%s] not loadable: %s", path, dlerror());
WARNING("binding [%s] not loadable: %s", path, dlerror());
goto error;
}
+ /*
+ * This is a loadable library let's check if it's a binding ...
+ */
/* try the version 3 */
rc = afb_api_so_v3_add(path, handle, declare_set, call_set);
if (rc)
return 0; /* yes version 3 */
+#if WITH_LEGACY_BINDING_V2
/* try the version 2 */
rc = afb_api_so_v2_add(path, handle, declare_set, call_set);
if (rc < 0) {
}
if (rc)
return 0; /* yes version 2 */
+#else
+ if (dlsym(handle, "afbBindingV2")) {
+ WARNING("binding [%s]: version 2 not supported", path);
+ obsolete = 1;
+ }
+#endif
-#if defined(WITH_LEGACY_BINDING_VDYN)
+#if WITH_LEGACY_BINDING_VDYN
/* try the version dyn */
rc = afb_api_so_vdyn_add(path, handle, declare_set, call_set);
if (rc < 0) {
}
#endif
-#if defined(WITH_LEGACY_BINDING_V1)
+#if WITH_LEGACY_BINDING_V1
/* try the version 1 */
rc = afb_api_so_v1_add(path, handle, declare_set, call_set);
if (rc < 0) {
return afb_api_so_add_pathset(pathset, declare_set, call_set, 0);
}
+#endif