summaryrefslogtreecommitdiff
path: root/modutils
diff options
context:
space:
mode:
authorMark Whitley <markw@lineo.com>2001-03-12 23:08:34 +0000
committerMark Whitley <markw@lineo.com>2001-03-12 23:08:34 +0000
commit94fd480babd9e9a3bc7c981fa2e1cca8ffe9cd60 (patch)
treea3966904f46260ddcd1e6e580c63a8c620e546ad /modutils
parent6317c4baf79c25d7f77897b064eb4f0b7d9f070e (diff)
downloadbusybox-w32-94fd480babd9e9a3bc7c981fa2e1cca8ffe9cd60.tar.gz
busybox-w32-94fd480babd9e9a3bc7c981fa2e1cca8ffe9cd60.tar.bz2
busybox-w32-94fd480babd9e9a3bc7c981fa2e1cca8ffe9cd60.zip
Applied patch from John Lombardo to fix OOM in insmod.
Diffstat (limited to 'modutils')
-rw-r--r--modutils/insmod.c80
1 files changed, 41 insertions, 39 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c
index 50f272edb..5391c8804 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -119,7 +119,7 @@
119#ifndef MODUTILS_MODULE_H 119#ifndef MODUTILS_MODULE_H
120static const int MODUTILS_MODULE_H = 1; 120static const int MODUTILS_MODULE_H = 1;
121 121
122#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $" 122#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
123 123
124/* This file contains the structures used by the 2.0 and 2.1 kernels. 124/* This file contains the structures used by the 2.0 and 2.1 kernels.
125 We do not use the kernel headers directly because we do not wish 125 We do not use the kernel headers directly because we do not wish
@@ -325,7 +325,7 @@ int delete_module(const char *);
325#ifndef MODUTILS_OBJ_H 325#ifndef MODUTILS_OBJ_H
326static const int MODUTILS_OBJ_H = 1; 326static const int MODUTILS_OBJ_H = 1;
327 327
328#ident "$Id: insmod.c,v 1.50 2001/02/24 20:01:53 andersen Exp $" 328#ident "$Id: insmod.c,v 1.51 2001/03/12 23:08:34 markw Exp $"
329 329
330/* The relocatable object is manipulated using elfin types. */ 330/* The relocatable object is manipulated using elfin types. */
331 331
@@ -2306,48 +2306,50 @@ static int new_get_kernel_symbols(void)
2306 } 2306 }
2307 2307
2308 n_ext_modules = nmod = ret; 2308 n_ext_modules = nmod = ret;
2309 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2310 memset(modules, 0, nmod * sizeof(*modules));
2311 2309
2312 /* Collect the modules' symbols. */ 2310 /* Collect the modules' symbols. */
2313 2311
2314 for (i = 0, mn = module_names, m = modules; 2312 if (nmod){
2315 i < nmod; ++i, ++m, mn += strlen(mn) + 1) { 2313 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2316 struct new_module_info info; 2314 memset(modules, 0, nmod * sizeof(*modules));
2317 2315 for (i = 0, mn = module_names, m = modules;
2318 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) { 2316 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2319 if (errno == ENOENT) { 2317 struct new_module_info info;
2320 /* The module was removed out from underneath us. */ 2318
2321 continue; 2319 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2322 } 2320 if (errno == ENOENT) {
2323 perror_msg("query_module: QM_INFO: %s", mn); 2321 /* The module was removed out from underneath us. */
2324 return 0; 2322 continue;
2325 } 2323 }
2326 2324 perror_msg("query_module: QM_INFO: %s", mn);
2327 syms = xmalloc(bufsize = 1024);
2328 retry_mod_sym_load:
2329 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2330 switch (errno) {
2331 case ENOSPC:
2332 syms = xrealloc(syms, bufsize = ret);
2333 goto retry_mod_sym_load;
2334 case ENOENT:
2335 /* The module was removed out from underneath us. */
2336 continue;
2337 default:
2338 perror_msg("query_module: QM_SYMBOLS: %s", mn);
2339 return 0; 2325 return 0;
2340 } 2326 }
2341 } 2327
2342 nsyms = ret; 2328 syms = xmalloc(bufsize = 1024);
2343 2329 retry_mod_sym_load:
2344 m->name = mn; 2330 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2345 m->addr = info.addr; 2331 switch (errno) {
2346 m->nsyms = nsyms; 2332 case ENOSPC:
2347 m->syms = syms; 2333 syms = xrealloc(syms, bufsize = ret);
2348 2334 goto retry_mod_sym_load;
2349 for (j = 0, s = syms; j < nsyms; ++j, ++s) { 2335 case ENOENT:
2350 s->name += (unsigned long) syms; 2336 /* The module was removed out from underneath us. */
2337 continue;
2338 default:
2339 perror_msg("query_module: QM_SYMBOLS: %s", mn);
2340 return 0;
2341 }
2342 }
2343 nsyms = ret;
2344
2345 m->name = mn;
2346 m->addr = info.addr;
2347 m->nsyms = nsyms;
2348 m->syms = syms;
2349
2350 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2351 s->name += (unsigned long) syms;
2352 }
2351 } 2353 }
2352 } 2354 }
2353 2355