aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-03-07 00:52:22 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-03-07 00:52:22 +0000
commitea452d3fd8f99256d987297e5afa8d1c226b465e (patch)
tree013c8875e1fadab5b15ed1bc8d53c2bb3ca5c990
parentc43fe99fe03d3d87973e7c874f870c437af65988 (diff)
Version 0.1.7 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@235 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xapps/app_directory.c5
-rwxr-xr-xapps/app_echo.c5
-rwxr-xr-xapps/app_playback.c5
-rwxr-xr-xapps/app_skel.c5
-rwxr-xr-xapps/app_system.c5
-rwxr-xr-xchannels/chan_modem_aopen.c4
-rwxr-xr-xchannels/chan_modem_i4l.c6
-rwxr-xr-xcodecs/codec_mp3_d.c5
-rwxr-xr-xformats/format_g723.c5
-rwxr-xr-xformats/format_mp3.c5
-rwxr-xr-xformats/format_wav.c5
-rwxr-xr-xformats/format_wav_gsm.c5
-rwxr-xr-xinclude/asterisk/module.h11
-rwxr-xr-xloader.c62
-rwxr-xr-xpbx/pbx_gtkconsole.c5
15 files changed, 138 insertions, 0 deletions
diff --git a/apps/app_directory.c b/apps/app_directory.c
index be76d4b35..e22a2ccb4 100755
--- a/apps/app_directory.c
+++ b/apps/app_directory.c
@@ -262,3 +262,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_echo.c b/apps/app_echo.c
index 370dc6863..7d0647d04 100755
--- a/apps/app_echo.c
+++ b/apps/app_echo.c
@@ -78,3 +78,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_playback.c b/apps/app_playback.c
index d7e023d94..945686b2c 100755
--- a/apps/app_playback.c
+++ b/apps/app_playback.c
@@ -75,3 +75,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_skel.c b/apps/app_skel.c
index 419b8f40a..8ca411305 100755
--- a/apps/app_skel.c
+++ b/apps/app_skel.c
@@ -68,3 +68,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_system.c b/apps/app_system.c
index 7e140a427..9915cbd96 100755
--- a/apps/app_system.c
+++ b/apps/app_system.c
@@ -80,3 +80,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/channels/chan_modem_aopen.c b/channels/chan_modem_aopen.c
index f344cb149..37c5a8b7f 100755
--- a/channels/chan_modem_aopen.c
+++ b/channels/chan_modem_aopen.c
@@ -478,3 +478,7 @@ char *description()
return desc;
}
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/channels/chan_modem_i4l.c b/channels/chan_modem_i4l.c
index 3a8dbd8c8..f1e521adf 100755
--- a/channels/chan_modem_i4l.c
+++ b/channels/chan_modem_i4l.c
@@ -358,6 +358,8 @@ static struct ast_frame *i4l_read(struct ast_modem_pvt *p)
if (f)
break;
}
+ if (f)
+ return f;
/* If we get here, we have a complete voice frame */
p->fr.frametype = AST_FRAME_VOICE;
p->fr.subclass = AST_FORMAT_SLINEAR;
@@ -570,3 +572,7 @@ char *description()
return desc;
}
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/codecs/codec_mp3_d.c b/codecs/codec_mp3_d.c
index 95e1fb51f..aad6d7570 100755
--- a/codecs/codec_mp3_d.c
+++ b/codecs/codec_mp3_d.c
@@ -321,3 +321,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/formats/format_g723.c b/formats/format_g723.c
index 83144376f..c437addcd 100755
--- a/formats/format_g723.c
+++ b/formats/format_g723.c
@@ -350,3 +350,8 @@ char *description()
return desc;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/formats/format_mp3.c b/formats/format_mp3.c
index 85abdbc1b..a3e25d45b 100755
--- a/formats/format_mp3.c
+++ b/formats/format_mp3.c
@@ -293,3 +293,8 @@ char *description()
return desc;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/formats/format_wav.c b/formats/format_wav.c
index 9ba4fdc22..071c24f26 100755
--- a/formats/format_wav.c
+++ b/formats/format_wav.c
@@ -353,3 +353,8 @@ char *description()
return desc;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c
index b901a4028..94e2bffd0 100755
--- a/formats/format_wav_gsm.c
+++ b/formats/format_wav_gsm.c
@@ -584,3 +584,8 @@ char *description()
return desc;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index e7bda62d6..9a8a7153c 100755
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -25,6 +25,17 @@ int unload_module(void); /* Cleanup all module structures,
sockets, etc */
int usecount(void); /* How many channels provided by this module are in use? */
char *description(void); /* Description of this module */
+char *key(void); /* Return the below mentioned key, unmodified */
+
+int reload(void);
+
+#define ASTERISK_GPL_KEY \
+ "This paragraph is Copyright (C) 2000, Linux Support Services, Inc. \
+In order for your module to load, it must return this key via a function \
+called \"key\". Any code which includes this paragraph must be licensed under \
+the GNU General Public License version 2 or later (at your option). Linux \
+Support Services, Inc. reserves the right to allow other parties to license \
+this paragraph under other terms as well."
#define AST_MODULE_CONFIG "modules.conf" /* Module configuration file */
diff --git a/loader.c b/loader.c
index 63c44df40..b216a07bc 100755
--- a/loader.c
+++ b/loader.c
@@ -21,20 +21,65 @@
#include <asterisk/config.h>
#include <asterisk/logger.h>
#include <dlfcn.h>
+#include <asterisk/md5.h>
#define __USE_GNU
#include <pthread.h>
#include "asterisk.h"
+static char expected_key[] =
+{ 0x8e, 0x93, 0x22, 0x83, 0xf5, 0xc3, 0xc0, 0x75,
+ 0xff, 0x8b, 0xa9, 0xbe, 0x7c, 0x43, 0x74, 0x63 };
+
struct module {
int (*load_module)(void);
int (*unload_module)(void);
int (*usecount)(void);
char *(*description)(void);
+ char *(*key)(void);
+ int (*reload)(void);
void *lib;
char resource[256];
struct module *next;
};
+static int printdigest(unsigned char *d)
+{
+ int x;
+ char buf[256];
+ char buf2[16];
+ snprintf(buf, sizeof(buf), "Unexpected signature:");
+ for (x=0;x<16;x++) {
+ snprintf(buf2, sizeof(buf2), " %02x", *(d++));
+ strcat(buf, buf2);
+ }
+ strcat(buf, "\n");
+ ast_log(LOG_DEBUG, buf);
+ return 0;
+}
+
+static int key_matches(char *key1, char *key2)
+{
+ int match = 1;
+ int x;
+ for (x=0;x<16;x++) {
+ match &= (key1[x] == key2[x]);
+ }
+ return match;
+}
+
+static int verify_key(char *key)
+{
+ struct MD5Context c;
+ char digest[16];
+ MD5Init(&c);
+ MD5Update(&c, key, strlen(key));
+ MD5Final(digest, &c);
+ if (key_matches(expected_key, digest))
+ return 0;
+ printdigest(digest);
+ return -1;
+}
+
static struct loadupdate {
int (*updater)(void);
struct loadupdate *next;
@@ -94,6 +139,7 @@ int ast_load_resource(char *resource_name)
struct module *m;
int flags=0;
char *val;
+ char *key;
int o;
struct ast_config *cfg;
/* Keep the module file parsing silent */
@@ -158,6 +204,21 @@ int ast_load_resource(char *resource_name)
ast_log(LOG_WARNING, "No description in module %s\n", fn);
errors++;
}
+ m->key = dlsym(m->lib, "key");
+ if (!m->key) {
+ ast_log(LOG_WARNING, "No key routine in module %s\n", fn);
+ errors++;
+ }
+ m->reload = dlsym(m->lib, "reload");
+ if (m->key && !(key = m->key())) {
+ ast_log(LOG_WARNING, "Key routine returned NULL in module %s\n", fn);
+ errors++;
+ } else
+ key = NULL;
+ if (key && verify_key(key)) {
+ ast_log(LOG_WARNING, "Unexpected key returned by module %s\n", fn);
+ errors++;
+ }
if (errors) {
ast_log(LOG_WARNING, "%d error(s) loading module %s, aborted\n", errors, fn);
dlclose(m->lib);
@@ -175,6 +236,7 @@ int ast_load_resource(char *resource_name)
ast_verbose(VERBOSE_PREFIX_1 "Loaded %s => (%s)\n", fn, m->description());
}
m->next = module_list;
+
module_list = m;
pthread_mutex_unlock(&modlock);
if ((res = m->load_module())) {
diff --git a/pbx/pbx_gtkconsole.c b/pbx/pbx_gtkconsole.c
index 52a4ecb98..f8f233cf8 100755
--- a/pbx/pbx_gtkconsole.c
+++ b/pbx/pbx_gtkconsole.c
@@ -494,3 +494,8 @@ char *description(void)
{
return dtext;
}
+
+char *key(void)
+{
+ return ASTERISK_GPL_KEY;
+}