]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 89325 via svnmerge from
authorKevin P. Fleming <kpfleming@digium.com>
Fri, 16 Nov 2007 16:56:59 +0000 (16:56 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Fri, 16 Nov 2007 16:56:59 +0000 (16:56 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r89325 | kpfleming | 2007-11-16 10:47:46 -0600 (Fri, 16 Nov 2007) | 4 lines

To help combat problems where people build external modules (asterisk-addons or others) and then change the build options of the Asterisk build in a way that makes the incompatible without warning, this commit introduces an MD5 signature of the important build-time options and includes that signature into modules when they are built. When the loader loads one of these modules and notices the problem, it will emit a warning to console and refuse to initialize the module, as doing so could cause the system to be unstable or even crash.

If you upgrade to this version of Asterisk, you must rebuild *all* of your modules that came from other sources before trying to run this version. If you are using Digium's G.729 binary codec module, you will need v33 or newer.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@89326 65c4cc65-6c06-0410-ace0-fbb531ad65f3

build_tools/make_buildopts_h
include/asterisk/module.h
main/loader.c

index 0be011744c358aa7eefb3270ec6d0f4d27006a12..fc7fdd2c9da7fbebf89a1969098996dafcec8b7e 100755 (executable)
@@ -19,4 +19,7 @@ done
 if ${GREP} AST_DEVMODE makeopts | ${GREP} -q yes
 then
        echo "#define AST_DEVMODE 1"
+       TMP="${TMP} AST_DEVMODE"
 fi
+BUILDSUM=`echo ${TMP} | md5sum`
+echo "#define AST_BUILDOPT_SUM {0x${BUILDSUM:0:8}, 0x${BUILDSUM:8:8}, 0x${BUILDSUM:16:8}, 0x${BUILDSUM:24:8}}"
index 4c6cc507b2ea4444dd7ee5bc5b69e97fce8e6ce7..119ae88f06471152a109591f92e930108564e2e2 100644 (file)
@@ -216,6 +216,7 @@ struct ast_module_info {
 
        const char *key;
        unsigned int flags;
+       unsigned int buildopt_sum[4];           /* The value of AST_BUILDOPT_SUM when this module was compiled */
 };
 
 void ast_module_register(const struct ast_module_info *);
@@ -242,7 +243,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) \
        { \
@@ -343,6 +345,7 @@ static void __restore_globals(void)
                .flags = flags_to_set,                          \
                .description = desc,                            \
                .key = keystr,                                  \
+               .buildopt_sum = AST_BUILDOPT_SUM,               \
                fields                                          \
        };                                                      \
        static void  __attribute__ ((constructor)) __reg_module(void) \
index e51505ea073766663627aa442c6938e56ccf095a..b51888dbea4193850090ceb74ecb68a95156c293 100644 (file)
@@ -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 unsigned int buildopt_sum[4] = AST_BUILDOPT_SUM;
+
 static unsigned int embedding = 1; /* we always start out by registering embedded modules,
                                      since they are here before we dlopen() any
                                   */
@@ -603,6 +605,8 @@ int ast_module_reload(const char *name)
 
 static unsigned int inspect_module(const struct ast_module *mod)
 {
+       unsigned int buildopt_empty[4] = { 0, };
+
        if (!mod->info->description) {
                ast_log(LOG_WARNING, "Module '%s' does not provide a description.\n", mod->resource);
                return 1;
@@ -618,6 +622,13 @@ static unsigned int inspect_module(const struct ast_module *mod)
                return 1;
        }
 
+       if (memcmp(buildopt_empty, mod->info->buildopt_sum, sizeof(buildopt_empty)) &&
+           memcmp(buildopt_sum, mod->info->buildopt_sum, sizeof(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;
 }