Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2
module-init-tools
module-init-tools-suse.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File module-init-tools-suse.diff of Package module-init-tools
This patch contains suse-specific changes against upstream commit 768b9984b254d0dbb3f21f5a75adeb2a8bab1edf Index: module-init-tools-3.15/doc/modprobe.conf.sgml =================================================================== --- module-init-tools-3.15.orig/doc/modprobe.conf.sgml +++ module-init-tools-3.15/doc/modprobe.conf.sgml @@ -205,6 +205,19 @@ </para> </listitem> </varlistentry> + <varlistentry> + <term>allow_unsupported_modules <replaceable>[0|1]</replaceable> + </term> + <listitem> + <para> + In SUSE kernels, every kernel module has a flag 'supported'. If + this flag is not set loading this module will taint your kernel. + Setting this option to 0 disables loading of unsupported modules + and avoids tainting the kernel. This is typically set in + <filename>/etc/modprobe.d/unsupported-modules</filename>. + </para> + </listitem> + </varlistentry> </variablelist> </refsect1> <refsect1> Index: module-init-tools-3.15/doc/modprobe.sgml =================================================================== --- module-init-tools-3.15.orig/doc/modprobe.sgml +++ module-init-tools-3.15/doc/modprobe.sgml @@ -441,9 +441,28 @@ </para> </listitem> </varlistentry> + <varlistentry> + <term><option>--allow-unsupported-modules</option> + </term> + <listitem> + <para> + Load unsupported modules even if disabled in configuration. + </para> + </listitem> + </varlistentry> </variablelist> </refsect1> <refsect1> + <title>RETURN VALUE</title> + + <para> + <command>modprobe</command> returns 0 on success, 1 on an unspecified + error and 2 if the module is not supported. Use the + <option>--allow-unsupported-modules</option> option to force + using an unsupported module. + </para> + </refsect1> + <refsect1> <title>ENVIRONMENT</title> <para> The MODPROBE_OPTIONS environment variable can also be used to Index: module-init-tools-3.15/logging.c =================================================================== --- module-init-tools-3.15.orig/logging.c +++ module-init-tools-3.15/logging.c @@ -57,13 +57,15 @@ void error(const char *fmt, ...) va_end(arglist); } +/* can be overriden for different kinds of errors */ +int fatal_exit_code = 1; void fatal(const char *fmt, ...) { va_list arglist; va_start(arglist, fmt); message("FATAL: ", fmt, &arglist); va_end(arglist); - exit(1); + exit(fatal_exit_code); } /* If we don't flush, then child processes print before we do */ Index: module-init-tools-3.15/logging.h =================================================================== --- module-init-tools-3.15.orig/logging.h +++ module-init-tools-3.15/logging.h @@ -10,6 +10,9 @@ extern int quiet; /* Do we want informative messages as well as errors? */ extern int verbose; +/* Exit code returned by fatal() */ +extern int fatal_exit_code; + #ifdef __GNUC__ #define _printf __attribute__((format(printf, 1, 2))) #else Index: module-init-tools-3.15/modprobe.c =================================================================== --- module-init-tools-3.15.orig/modprobe.c +++ module-init-tools-3.15/modprobe.c @@ -55,6 +55,9 @@ /* NOTE: in the future, binary indexes will always be used */ static int use_binary_indexes = 1; /* default to enabled. */ +/* Allow loading of unsupported modules? */ +static int allow_unsupported = 1; + /* Limit do_softdep/do_modprobe recursion. * This is a simple way to handle dependency loops * caused by poorly written softdep commands. @@ -84,6 +87,7 @@ typedef enum mit_strip_modversion = 256, mit_resolve_alias = 512 + ,mit_force_allow_unsupported = 1<<20 } modprobe_flags_t; #ifndef MODULE_DIR @@ -392,6 +396,23 @@ static void clear_magic(struct elf_file } } +static int module_supported(struct elf_file *module) +{ + struct string_table *tbl; + int j; + + /* Grab from new-style .modinfo section. */ + tbl = module->ops->load_strings(module, ".modinfo", NULL); + for (j = 0; tbl && j < tbl->cnt; j++) { + const char *p = tbl->str[j]; + if (streq(p, "supported=yes") || + streq(p, "supported=external")) { + return 1; + } + } + return 0; +} + /* keep track of module options from config file(s) */ struct module_options { @@ -1184,6 +1205,16 @@ static int parse_config_file(const char if (streq(tmp, "no")) use_binary_indexes = 0; } + } else if (strcmp(cmd, "allow_unsupported_modules") == 0) { + const char *option = strsep_skipspace(&ptr, "\t "); + if (!option) + grammar(cmd, filename, linenum); + else if (streq(option, "yes") || streq(option, "1")) + allow_unsupported = 1; + else if (streq(option, "no") || streq(option, "0")) + allow_unsupported = 0; + else + goto syntax_error; } else { syntax_error: grammar(cmd, filename, linenum); @@ -1778,6 +1809,17 @@ static int insmod(struct list_head *list strerror(errno)); goto out; } + /* Supported? */ + if (!allow_unsupported && !module_supported(module)) { + if (error == fatal) + fatal_exit_code = 2; + error("module '%s' is unsupported\n" + "Use --allow-unsupported or set allow_unsupported_modules to 1 in\n" + "/etc/modprobe.d/10-unsupported-modules.conf\n", + mod->filename); + goto out; + } + if (flags & mit_strip_modversion) module->ops->strip_section(module, "__versions"); if (flags & mit_strip_vermagic) @@ -2008,6 +2050,17 @@ static int do_modprobe(const char *modna LIST_HEAD(list); int failed = 0; + if (flags & mit_force_allow_unsupported) + allow_unsupported = 1; + /* Be nice to people running non-suse kernels and allow + * unsupported modules */ + if (!allow_unsupported) { + if (access("/proc/sys/kernel/", F_OK) == 0 && + access("/proc/sys/kernel/unsupported", F_OK) == -1 && + errno == ENOENT) + allow_unsupported = 1; + } + matching_aliases = find_aliases(conf->aliases, modname); /* No luck? Try symbol names, if starts with symbol:. */ @@ -2113,6 +2166,7 @@ static const struct option options[] = { { "force-modversion", 0, NULL, 2 }, { "first-time", 0, NULL, 3 }, { "dump-modversions", 0, NULL, 4 }, + { "allow-unsupported-modules", 0, NULL, 128 }, { NULL, 0, NULL, 0 } }; int main(int argc, char *argv[]) @@ -2219,6 +2273,9 @@ int main(int argc, char *argv[]) case 4: dump_modver = 1; break; + case 128: + flags |= mit_force_allow_unsupported; + break; default: print_usage(argv[0]); } Index: module-init-tools-3.15/modprobe.d.5 =================================================================== --- module-init-tools-3.15.orig/modprobe.d.5 +++ module-init-tools-3.15/modprobe.d.5 @@ -1 +1 @@ -.so modprobe.conf.5 +.so man5/modprobe.conf.5 Index: module-init-tools-3.15/zlibsupport.c =================================================================== --- module-init-tools-3.15.orig/zlibsupport.c +++ module-init-tools-3.15/zlibsupport.c @@ -12,6 +12,8 @@ #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> +#include <stdio.h> +#include <string.h> #include "zlibsupport.h" #include "logging.h" @@ -19,52 +21,35 @@ #ifdef CONFIG_USE_ZLIB #include <zlib.h> +#endif -void *grab_contents(gzFile *gzfd, unsigned long *size) +#ifdef CONFIG_USE_ZLIB +static int check_gz_magic(int fd) { - unsigned int max = 16384; - void *buffer = NOFAIL(malloc(max)); - int ret; + unsigned char magic[2]; - *size = 0; - while ((ret = gzread(gzfd, buffer + *size, max - *size)) > 0) { - *size += ret; - if (*size == max) - buffer = NOFAIL(realloc(buffer, max *= 2)); - } - if (ret < 0) { - free(buffer); - buffer = NULL; - } - - return buffer; + if (read(fd, magic, 2) != 2) + return -1; + lseek(fd, 0, SEEK_SET); + if (magic[0] == 0x1f && magic[1] == 0x8b) + return 1; + return 0; } -/* gzopen handles uncompressed files transparently. */ -void *grab_file(const char *filename, unsigned long *size) +static char *tmpdir(void) { - gzFile gzfd; - void *buffer; + static char *TMPDIR; - errno = 0; - gzfd = gzopen(filename, "rb"); - if (!gzfd) { - if (errno == ENOMEM) - fatal("Memory allocation failure in gzopen\n"); - return NULL; - } - buffer = grab_contents(gzfd, size); - gzclose(gzfd); - return buffer; + if (TMPDIR) + return TMPDIR; + TMPDIR = getenv("TMPDIR"); + if (!TMPDIR) + TMPDIR = "/tmp"; + return TMPDIR; } +#endif -void release_file(void *data, unsigned long size) -{ - free(data); -} -#else /* ... !CONFIG_USE_ZLIB */ - -void *grab_fd(int fd, unsigned long *size) +void *do_grab_fd(int fd, unsigned long *size) { struct stat st; void *map; @@ -80,6 +65,60 @@ void *grab_fd(int fd, unsigned long *siz return map; } +void *grab_fd(int fd, unsigned long *size) +{ +#ifdef CONFIG_USE_ZLIB + int magic = check_gz_magic(fd); + if (magic == -1) + return NULL; + if (magic) { + gzFile gzfd; + int tmp; + char buffer[4096]; + char *template; + int r, w; + void *ret = NULL; + + template = NOFAIL(malloc(strlen(tmpdir()) + sizeof("/m-i-t.XXXXXX"))); + sprintf(template, "%s/m-i-t.XXXXXX", tmpdir()); + gzfd = gzdopen(dup(fd), "rb"); + if (!gzfd) { + if (errno == ENOMEM) + fatal("Memory allocation failure in gzdopen\n"); + goto out_template; + } + tmp = mkstemp(template); + if (tmp == -1) + goto out_template; + + while ((r = gzread(gzfd, buffer, sizeof(buffer))) > 0) { + char *p = buffer; + do { + w = write(tmp, p, r); + if (w > 0) { + r -= w; + p += w; + } + } while (w > 0 || (w == -1 && errno == EINTR)); + if (w == -1) + goto out; + } + if (r < 0) + goto out; + gzclose(gzfd); + ret = do_grab_fd(tmp, size); +out: + close(tmp); + unlink(template); +out_template: + free(template); + return ret; + } else +#endif + return do_grab_fd(fd, size); +} + + void *grab_file(const char *filename, unsigned long *size) { int fd; @@ -97,4 +136,4 @@ void release_file(void *data, unsigned l { munmap(data, size); } -#endif +
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor