- kbuild-prevent-building-modules-that-wont-load.patch removed from -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled

     kbuild: prevent building modules that wont load

has been removed from the -mm tree.  Its filename is

     kbuild-prevent-building-modules-that-wont-load.patch

This patch was dropped because it was merged into mainline or a subsystem tree

------------------------------------------------------
Subject: kbuild: prevent building modules that wont load
From: Andreas Gruenbacher <agruen@xxxxxxx>


Implements license compliance testing in modpost. This prevents kbuild from
producing modules that won't load.

Signed-off-by: Ram Pai <linuxram@xxxxxxxxxx>
Signed-off-by: Andreas Gruenbacher <agruen@xxxxxxx>
Cc: Sam Ravnborg <sam@xxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 include/linux/license.h |   14 ++++++++
 kernel/module.c         |   11 ------
 scripts/mod/modpost.c   |   62 ++++++++++++++++++++++++++++++++++++--
 scripts/mod/modpost.h   |    1 
 4 files changed, 76 insertions(+), 12 deletions(-)

diff -puN /dev/null include/linux/license.h
--- /dev/null	2006-05-19 15:26:20.261540500 -0700
+++ devel-akpm/include/linux/license.h	2006-05-19 15:59:48.000000000 -0700
@@ -0,0 +1,14 @@
+#ifndef __LICENSE_H
+#define __LICENSE_H
+
+static inline int license_is_gpl_compatible(const char *license)
+{
+	return (strcmp(license, "GPL") == 0
+		|| strcmp(license, "GPL v2") == 0
+		|| strcmp(license, "GPL and additional rights") == 0
+		|| strcmp(license, "Dual BSD/GPL") == 0
+		|| strcmp(license, "Dual MIT/GPL") == 0
+		|| strcmp(license, "Dual MPL/GPL") == 0);
+}
+
+#endif
diff -puN kernel/module.c~kbuild-prevent-building-modules-that-wont-load kernel/module.c
--- devel/kernel/module.c~kbuild-prevent-building-modules-that-wont-load	2006-05-19 15:59:48.000000000 -0700
+++ devel-akpm/kernel/module.c	2006-05-19 15:59:48.000000000 -0700
@@ -43,6 +43,7 @@
 #include <asm/uaccess.h>
 #include <asm/semaphore.h>
 #include <asm/cacheflush.h>
+#include <linux/license.h>
 
 #if 0
 #define DEBUGP printk
@@ -1248,16 +1249,6 @@ static void layout_sections(struct modul
 	}
 }
 
-static inline int license_is_gpl_compatible(const char *license)
-{
-	return (strcmp(license, "GPL") == 0
-		|| strcmp(license, "GPL v2") == 0
-		|| strcmp(license, "GPL and additional rights") == 0
-		|| strcmp(license, "Dual BSD/GPL") == 0
-		|| strcmp(license, "Dual MIT/GPL") == 0
-		|| strcmp(license, "Dual MPL/GPL") == 0);
-}
-
 static void set_license(struct module *mod, const char *license)
 {
 	if (!license)
diff -puN scripts/mod/modpost.c~kbuild-prevent-building-modules-that-wont-load scripts/mod/modpost.c
--- devel/scripts/mod/modpost.c~kbuild-prevent-building-modules-that-wont-load	2006-05-19 15:59:48.000000000 -0700
+++ devel-akpm/scripts/mod/modpost.c	2006-05-19 15:59:48.000000000 -0700
@@ -13,6 +13,7 @@
 
 #include <ctype.h>
 #include "modpost.h"
+#include "../../include/linux/license.h"
 
 /* Are we using CONFIG_MODVERSIONS? */
 int modversions = 0;
@@ -101,6 +102,7 @@ static struct module *new_module(char *m
 
 	/* add to list */
 	mod->name = p;
+	mod->gpl_compatible = -1;
 	mod->next = modules;
 	modules = mod;
 
@@ -454,13 +456,18 @@ static char *next_string(char *string, u
 	return string;
 }
 
-static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
-			 const char *tag)
+static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
+			      const char *tag, char *info)
 {
 	char *p;
 	unsigned int taglen = strlen(tag);
 	unsigned long size = modinfo_len;
 
+	if (info) {
+		size -= info - (char *)modinfo;
+		modinfo = next_string(info, &size);
+	}
+
 	for (p = modinfo; p; p = next_string(p, &size)) {
 		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
 			return p + taglen + 1;
@@ -468,6 +475,13 @@ static char *get_modinfo(void *modinfo, 
 	return NULL;
 }
 
+static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
+			 const char *tag)
+
+{
+	return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
+}
+
 /**
  * Test if string s ends in string sub
  * return 0 if match
@@ -938,6 +952,7 @@ static void read_symbols(char *modname)
 {
 	const char *symname;
 	char *version;
+	char *license;
 	struct module *mod;
 	struct elf_info info = { };
 	Elf_Sym *sym;
@@ -953,6 +968,18 @@ static void read_symbols(char *modname)
 		mod->skip = 1;
 	}
 
+	license = get_modinfo(info.modinfo, info.modinfo_len, "license");
+	while (license) {
+		if (license_is_gpl_compatible(license))
+			mod->gpl_compatible = 1;
+		else {
+			mod->gpl_compatible = 0;
+			break;
+		}
+		license = get_next_modinfo(info.modinfo, info.modinfo_len,
+					   "license", license);
+	}
+
 	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
 		symname = info.strtab + sym->st_name;
 
@@ -1009,6 +1036,31 @@ void buf_write(struct buffer *buf, const
 	buf->pos += len;
 }
 
+void check_license(struct module *mod)
+{
+	struct symbol *s, *exp;
+
+	for (s = mod->unres; s; s = s->next) {
+		if (mod->gpl_compatible == 1) {
+			/* GPL-compatible modules may use all symbols */
+			continue;
+		}
+		exp = find_symbol(s->name);
+		if (!exp || exp->module == mod)
+			continue;
+		if (exp->export_type == 1) {
+			const char *basename = strrchr(mod->name, '/');
+			if (basename)
+				basename++;
+
+			fatal("modpost: GPL-incompatible module %s uses the "
+			      "GPL-only symbol %s\n",
+			      basename ? basename : mod->name,
+			      exp->name);
+		}
+        }
+}
+
 /**
  * Header for the generated file
  **/
@@ -1297,6 +1349,12 @@ int main(int argc, char **argv)
 	for (mod = modules; mod; mod = mod->next) {
 		if (mod->skip)
 			continue;
+		check_license(mod);
+	}
+
+	for (mod = modules; mod; mod = mod->next) {
+		if (mod->skip)
+			continue;
 
 		buf.pos = 0;
 
diff -puN scripts/mod/modpost.h~kbuild-prevent-building-modules-that-wont-load scripts/mod/modpost.h
--- devel/scripts/mod/modpost.h~kbuild-prevent-building-modules-that-wont-load	2006-05-19 15:59:48.000000000 -0700
+++ devel-akpm/scripts/mod/modpost.h	2006-05-19 15:59:48.000000000 -0700
@@ -100,6 +100,7 @@ buf_write(struct buffer *buf, const char
 struct module {
 	struct module *next;
 	const char *name;
+	int gpl_compatible;
 	struct symbol *unres;
 	int seen;
 	int skip;
_

Patches currently in -mm which might be from agruen@xxxxxxx are

git-kbuild.patch
client-side-nfsacl-caching-fix.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux