aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbuild_tools/make_buildopts_h12
-rw-r--r--include/asterisk/module.h5
-rw-r--r--main/loader.c9
3 files changed, 25 insertions, 1 deletions
diff --git a/build_tools/make_buildopts_h b/build_tools/make_buildopts_h
index ac41a006a..531bb93a6 100755
--- a/build_tools/make_buildopts_h
+++ b/build_tools/make_buildopts_h
@@ -14,4 +14,16 @@ done
if ${GREP} AST_DEVMODE makeopts | ${GREP} -q yes
then
echo "#define AST_DEVMODE 1"
+ TMP="${TMP} AST_DEVMODE"
fi
+
+case ${OSARCH} in # actually we should check build_os
+*BSD|mingw|darwin*)
+ BUILDSUM=`echo ${TMP} | md5 | cut -c1-32`
+ ;;
+*)
+ BUILDSUM=`echo ${TMP} | md5sum | cut -c1-32`
+ ;;
+esac
+
+echo "#define AST_BUILDOPT_SUM \"${BUILDSUM}\""
diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index 7f14df7f9..7ea89fc36 100644
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -203,6 +203,7 @@ struct ast_module_info {
const char *key;
unsigned int flags;
+ const char buildopt_sum[33]; /* The value of AST_BUILDOPT_SUM when this module was compiled */
};
void ast_module_register(const struct ast_module_info *);
@@ -229,7 +230,8 @@ void ast_module_unref(struct ast_module *);
AST_MODULE, \
desc, \
keystr, \
- flags_to_set \
+ flags_to_set, \
+ AST_BUILDOPT_SUM, \
}; \
static void __attribute__ ((constructor)) __reg_module(void) \
{ \
@@ -259,6 +261,7 @@ const static __attribute__((unused)) struct ast_module_info *ast_module_info;
.flags = flags_to_set, \
.description = desc, \
.key = keystr, \
+ .buildopt_sum = AST_BUILDOPT_SUM, \
fields \
}; \
static void __attribute__ ((constructor)) __reg_module(void) \
diff --git a/main/loader.c b/main/loader.c
index 7df486251..6522f01bf 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -76,6 +76,8 @@ static unsigned char expected_key[] =
{ 0x87, 0x76, 0x79, 0x35, 0x23, 0xea, 0x3a, 0xd3,
0x25, 0x2a, 0xbb, 0x35, 0x87, 0xe4, 0x22, 0x24 };
+static char buildopt_sum[33] = AST_BUILDOPT_SUM;
+
static unsigned int embedding = 1; /* we always start out by registering embedded modules,
since they are here before we dlopen() any
*/
@@ -613,6 +615,13 @@ static unsigned int inspect_module(const struct ast_module *mod)
return 1;
}
+ if (!ast_strlen_zero(mod->info->buildopt_sum) &&
+ strcmp(buildopt_sum, mod->info->buildopt_sum)) {
+ ast_log(LOG_WARNING, "Module '%s' was not compiled with the same compile-time options as this version of Asterisk.\n", mod->resource);
+ ast_log(LOG_WARNING, "Module '%s' will not be initialized as it may cause instability.\n", mod->resource);
+ return 1;
+ }
+
return 0;
}