diff options
author | Matt Kraai | 2001-04-13 14:40:15 +0000 |
---|---|---|
committer | Matt Kraai | 2001-04-13 14:40:15 +0000 |
commit | 0f50bca9aaae78fd23a2ab7890e81c88473a4a25 (patch) | |
tree | 71e0b976e816ab3a2f34e68d1d7dca2d4e817a5e | |
parent | 445fb952b8becc78889d3079e3053f76aa2eba9c (diff) | |
download | busybox-0f50bca9aaae78fd23a2ab7890e81c88473a4a25.zip busybox-0f50bca9aaae78fd23a2ab7890e81c88473a4a25.tar.gz |
Fix infinite loop and reallocate if too many modules.
-rw-r--r-- | lsmod.c | 30 | ||||
-rw-r--r-- | modutils/lsmod.c | 30 |
2 files changed, 44 insertions, 16 deletions
@@ -69,19 +69,36 @@ static const int NEW_MOD_VISITED = 8; static const int NEW_MOD_USED_ONCE = 16; static const int NEW_MOD_INITIALIZING = 64; +static int my_query_module(const char *name, int which, void **buf, + size_t *bufsize, size_t *ret) +{ + int my_ret; + + my_ret = query_module(name, which, *buf, *bufsize, ret); + + if (my_ret == -1 && errno == ENOSPC) { + *buf = xrealloc(*buf, *ret); + *bufsize = *ret; + + my_ret = query_module(name, which, *buf, *bufsize, ret); + } + + return my_ret; +} extern int lsmod_main(int argc, char **argv) { struct module_info info; char *module_names, *mn, *deps, *dn; - size_t bufsize, nmod, count, i, j; + size_t bufsize, depsize, nmod, count, i, j; module_names = xmalloc(bufsize = 256); - deps = xmalloc(bufsize); - if (query_module(NULL, QM_MODULES, module_names, bufsize, &nmod)) { + if (my_query_module(NULL, QM_MODULES, (void **)&module_names, &bufsize, + &nmod)) { perror_msg_and_die("QM_MODULES"); } + deps = xmalloc(depsize = 256); printf("Module Size Used by\n"); for (i = 0, mn = module_names; i < nmod; mn += strlen(mn) + 1, i++) { if (query_module(mn, QM_INFO, &info, sizeof(info), &count)) { @@ -92,15 +109,12 @@ extern int lsmod_main(int argc, char **argv) /* else choke */ perror_msg_and_die("module %s: QM_INFO", mn); } - while (query_module(mn, QM_REFS, deps, bufsize, &count)) { + if (my_query_module(mn, QM_REFS, (void **)&deps, &depsize, &count)) { if (errno == ENOENT) { /* The module was removed out from underneath us. */ continue; } - if (errno != ENOSPC) { - error_msg_and_die("module %s: QM_REFS", mn); - } - deps = xrealloc(deps, bufsize = count); + perror_msg_and_die("module %s: QM_REFS", mn); } printf("%-20s%8lu%4ld ", mn, info.size, info.usecount); if (info.flags & NEW_MOD_DELETED) diff --git a/modutils/lsmod.c b/modutils/lsmod.c index 0f1b09b..76ed2fd 100644 --- a/modutils/lsmod.c +++ b/modutils/lsmod.c @@ -69,19 +69,36 @@ static const int NEW_MOD_VISITED = 8; static const int NEW_MOD_USED_ONCE = 16; static const int NEW_MOD_INITIALIZING = 64; +static int my_query_module(const char *name, int which, void **buf, + size_t *bufsize, size_t *ret) +{ + int my_ret; + + my_ret = query_module(name, which, *buf, *bufsize, ret); + + if (my_ret == -1 && errno == ENOSPC) { + *buf = xrealloc(*buf, *ret); + *bufsize = *ret; + + my_ret = query_module(name, which, *buf, *bufsize, ret); + } + + return my_ret; +} extern int lsmod_main(int argc, char **argv) { struct module_info info; char *module_names, *mn, *deps, *dn; - size_t bufsize, nmod, count, i, j; + size_t bufsize, depsize, nmod, count, i, j; module_names = xmalloc(bufsize = 256); - deps = xmalloc(bufsize); - if (query_module(NULL, QM_MODULES, module_names, bufsize, &nmod)) { + if (my_query_module(NULL, QM_MODULES, (void **)&module_names, &bufsize, + &nmod)) { perror_msg_and_die("QM_MODULES"); } + deps = xmalloc(depsize = 256); printf("Module Size Used by\n"); for (i = 0, mn = module_names; i < nmod; mn += strlen(mn) + 1, i++) { if (query_module(mn, QM_INFO, &info, sizeof(info), &count)) { @@ -92,15 +109,12 @@ extern int lsmod_main(int argc, char **argv) /* else choke */ perror_msg_and_die("module %s: QM_INFO", mn); } - while (query_module(mn, QM_REFS, deps, bufsize, &count)) { + if (my_query_module(mn, QM_REFS, (void **)&deps, &depsize, &count)) { if (errno == ENOENT) { /* The module was removed out from underneath us. */ continue; } - if (errno != ENOSPC) { - error_msg_and_die("module %s: QM_REFS", mn); - } - deps = xrealloc(deps, bufsize = count); + perror_msg_and_die("module %s: QM_REFS", mn); } printf("%-20s%8lu%4ld ", mn, info.size, info.usecount); if (info.flags & NEW_MOD_DELETED) |