Applied patch from John Lombardo to fix OOM in insmod.
This commit is contained in:
parent
6317c4baf7
commit
94fd480bab
2 changed files with 82 additions and 78 deletions
80
insmod.c
80
insmod.c
|
@ -119,7 +119,7 @@
|
||||||
#ifndef MODUTILS_MODULE_H
|
#ifndef MODUTILS_MODULE_H
|
||||||
static const int MODUTILS_MODULE_H = 1;
|
static const int MODUTILS_MODULE_H = 1;
|
||||||
|
|
||||||
#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
|
||||||
|
|
||||||
/* This file contains the structures used by the 2.0 and 2.1 kernels.
|
/* This file contains the structures used by the 2.0 and 2.1 kernels.
|
||||||
We do not use the kernel headers directly because we do not wish
|
We do not use the kernel headers directly because we do not wish
|
||||||
|
@ -325,7 +325,7 @@ int delete_module(const char *);
|
||||||
#ifndef MODUTILS_OBJ_H
|
#ifndef MODUTILS_OBJ_H
|
||||||
static const int MODUTILS_OBJ_H = 1;
|
static const int MODUTILS_OBJ_H = 1;
|
||||||
|
|
||||||
#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
|
||||||
|
|
||||||
/* The relocatable object is manipulated using elfin types. */
|
/* The relocatable object is manipulated using elfin types. */
|
||||||
|
|
||||||
|
@ -2306,48 +2306,50 @@ static int new_get_kernel_symbols(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
n_ext_modules = nmod = ret;
|
n_ext_modules = nmod = ret;
|
||||||
ext_modules = modules = xmalloc(nmod * sizeof(*modules));
|
|
||||||
memset(modules, 0, nmod * sizeof(*modules));
|
|
||||||
|
|
||||||
/* Collect the modules' symbols. */
|
/* Collect the modules' symbols. */
|
||||||
|
|
||||||
for (i = 0, mn = module_names, m = modules;
|
if (nmod){
|
||||||
i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
|
ext_modules = modules = xmalloc(nmod * sizeof(*modules));
|
||||||
struct new_module_info info;
|
memset(modules, 0, nmod * sizeof(*modules));
|
||||||
|
for (i = 0, mn = module_names, m = modules;
|
||||||
if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
|
i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
|
||||||
if (errno == ENOENT) {
|
struct new_module_info info;
|
||||||
/* The module was removed out from underneath us. */
|
|
||||||
continue;
|
if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
|
||||||
}
|
if (errno == ENOENT) {
|
||||||
perror_msg("query_module: QM_INFO: %s", mn);
|
/* The module was removed out from underneath us. */
|
||||||
return 0;
|
continue;
|
||||||
}
|
}
|
||||||
|
perror_msg("query_module: QM_INFO: %s", mn);
|
||||||
syms = xmalloc(bufsize = 1024);
|
|
||||||
retry_mod_sym_load:
|
|
||||||
if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
|
|
||||||
switch (errno) {
|
|
||||||
case ENOSPC:
|
|
||||||
syms = xrealloc(syms, bufsize = ret);
|
|
||||||
goto retry_mod_sym_load;
|
|
||||||
case ENOENT:
|
|
||||||
/* The module was removed out from underneath us. */
|
|
||||||
continue;
|
|
||||||
default:
|
|
||||||
perror_msg("query_module: QM_SYMBOLS: %s", mn);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
nsyms = ret;
|
syms = xmalloc(bufsize = 1024);
|
||||||
|
retry_mod_sym_load:
|
||||||
m->name = mn;
|
if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
|
||||||
m->addr = info.addr;
|
switch (errno) {
|
||||||
m->nsyms = nsyms;
|
case ENOSPC:
|
||||||
m->syms = syms;
|
syms = xrealloc(syms, bufsize = ret);
|
||||||
|
goto retry_mod_sym_load;
|
||||||
for (j = 0, s = syms; j < nsyms; ++j, ++s) {
|
case ENOENT:
|
||||||
s->name += (unsigned long) syms;
|
/* The module was removed out from underneath us. */
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
perror_msg("query_module: QM_SYMBOLS: %s", mn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nsyms = ret;
|
||||||
|
|
||||||
|
m->name = mn;
|
||||||
|
m->addr = info.addr;
|
||||||
|
m->nsyms = nsyms;
|
||||||
|
m->syms = syms;
|
||||||
|
|
||||||
|
for (j = 0, s = syms; j < nsyms; ++j, ++s) {
|
||||||
|
s->name += (unsigned long) syms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@
|
||||||
#ifndef MODUTILS_MODULE_H
|
#ifndef MODUTILS_MODULE_H
|
||||||
static const int MODUTILS_MODULE_H = 1;
|
static const int MODUTILS_MODULE_H = 1;
|
||||||
|
|
||||||
#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
|
||||||
|
|
||||||
/* This file contains the structures used by the 2.0 and 2.1 kernels.
|
/* This file contains the structures used by the 2.0 and 2.1 kernels.
|
||||||
We do not use the kernel headers directly because we do not wish
|
We do not use the kernel headers directly because we do not wish
|
||||||
|
@ -325,7 +325,7 @@ int delete_module(const char *);
|
||||||
#ifndef MODUTILS_OBJ_H
|
#ifndef MODUTILS_OBJ_H
|
||||||
static const int MODUTILS_OBJ_H = 1;
|
static const int MODUTILS_OBJ_H = 1;
|
||||||
|
|
||||||
#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
|
||||||
|
|
||||||
/* The relocatable object is manipulated using elfin types. */
|
/* The relocatable object is manipulated using elfin types. */
|
||||||
|
|
||||||
|
@ -2306,48 +2306,50 @@ static int new_get_kernel_symbols(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
n_ext_modules = nmod = ret;
|
n_ext_modules = nmod = ret;
|
||||||
ext_modules = modules = xmalloc(nmod * sizeof(*modules));
|
|
||||||
memset(modules, 0, nmod * sizeof(*modules));
|
|
||||||
|
|
||||||
/* Collect the modules' symbols. */
|
/* Collect the modules' symbols. */
|
||||||
|
|
||||||
for (i = 0, mn = module_names, m = modules;
|
if (nmod){
|
||||||
i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
|
ext_modules = modules = xmalloc(nmod * sizeof(*modules));
|
||||||
struct new_module_info info;
|
memset(modules, 0, nmod * sizeof(*modules));
|
||||||
|
for (i = 0, mn = module_names, m = modules;
|
||||||
if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
|
i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
|
||||||
if (errno == ENOENT) {
|
struct new_module_info info;
|
||||||
/* The module was removed out from underneath us. */
|
|
||||||
continue;
|
if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
|
||||||
}
|
if (errno == ENOENT) {
|
||||||
perror_msg("query_module: QM_INFO: %s", mn);
|
/* The module was removed out from underneath us. */
|
||||||
return 0;
|
continue;
|
||||||
}
|
}
|
||||||
|
perror_msg("query_module: QM_INFO: %s", mn);
|
||||||
syms = xmalloc(bufsize = 1024);
|
|
||||||
retry_mod_sym_load:
|
|
||||||
if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
|
|
||||||
switch (errno) {
|
|
||||||
case ENOSPC:
|
|
||||||
syms = xrealloc(syms, bufsize = ret);
|
|
||||||
goto retry_mod_sym_load;
|
|
||||||
case ENOENT:
|
|
||||||
/* The module was removed out from underneath us. */
|
|
||||||
continue;
|
|
||||||
default:
|
|
||||||
perror_msg("query_module: QM_SYMBOLS: %s", mn);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
nsyms = ret;
|
syms = xmalloc(bufsize = 1024);
|
||||||
|
retry_mod_sym_load:
|
||||||
m->name = mn;
|
if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
|
||||||
m->addr = info.addr;
|
switch (errno) {
|
||||||
m->nsyms = nsyms;
|
case ENOSPC:
|
||||||
m->syms = syms;
|
syms = xrealloc(syms, bufsize = ret);
|
||||||
|
goto retry_mod_sym_load;
|
||||||
for (j = 0, s = syms; j < nsyms; ++j, ++s) {
|
case ENOENT:
|
||||||
s->name += (unsigned long) syms;
|
/* The module was removed out from underneath us. */
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
perror_msg("query_module: QM_SYMBOLS: %s", mn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nsyms = ret;
|
||||||
|
|
||||||
|
m->name = mn;
|
||||||
|
m->addr = info.addr;
|
||||||
|
m->nsyms = nsyms;
|
||||||
|
m->syms = syms;
|
||||||
|
|
||||||
|
for (j = 0, s = syms; j < nsyms; ++j, ++s) {
|
||||||
|
s->name += (unsigned long) syms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue