From 22318b627d954c5a555abe5a5b002af5855e5023 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Wed, 7 Mar 2001 00:52:22 +0000
Subject: [PATCH] Version 0.1.7 from FTP

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@235 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_directory.c        |  5 +++
 apps/app_echo.c             |  5 +++
 apps/app_playback.c         |  5 +++
 apps/app_skel.c             |  5 +++
 apps/app_system.c           |  5 +++
 channels/chan_modem_aopen.c |  4 +++
 channels/chan_modem_i4l.c   |  6 ++++
 codecs/codec_mp3_d.c        |  5 +++
 formats/format_g723.c       |  5 +++
 formats/format_mp3.c        |  5 +++
 formats/format_wav.c        |  5 +++
 formats/format_wav_gsm.c    |  5 +++
 include/asterisk/module.h   | 11 +++++++
 loader.c                    | 62 +++++++++++++++++++++++++++++++++++++
 pbx/pbx_gtkconsole.c        |  5 +++
 15 files changed, 138 insertions(+)

diff --git a/apps/app_directory.c b/apps/app_directory.c
index be76d4b35b..e22a2ccb40 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 370dc68636..7d0647d04b 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 d7e023d944..945686b2ca 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 419b8f40a0..8ca411305b 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 7e140a4278..9915cbd965 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 f344cb149b..37c5a8b7f6 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 3a8dbd8c8a..f1e521adfd 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 95e1fb51fc..aad6d75703 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 83144376f8..c437addcd1 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 85abdbc1b9..a3e25d45bc 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 9ba4fdc22a..071c24f26f 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 b901a40288..94e2bffd05 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 e7bda62d6b..9a8a7153cc 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 63c44df40c..b216a07bc9 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 52a4ecb980..f8f233cf84 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;
+}
-- 
GitLab