Improved query_module calls and unified code against former version (1.12)
This commit is contained in:
parent
d9a3b7ff55
commit
7b3a9199d0
77
ksym_mod.c
77
ksym_mod.c
@ -169,11 +169,9 @@ extern int InitMsyms()
|
|||||||
|
|
||||||
auto char **mod_table;
|
auto char **mod_table;
|
||||||
|
|
||||||
char *modbuf = NULL,
|
char *modbuf, *newbuf;
|
||||||
*newbuf;
|
|
||||||
|
|
||||||
int modsize = 32,
|
int result;
|
||||||
result;
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the kernel module symbol table. */
|
/* Initialize the kernel module symbol table. */
|
||||||
@ -183,11 +181,9 @@ extern int InitMsyms()
|
|||||||
* First, we query for the list of loaded modules. We may
|
* First, we query for the list of loaded modules. We may
|
||||||
* have to grow our buffer in size.
|
* have to grow our buffer in size.
|
||||||
*/
|
*/
|
||||||
do {
|
modbuf = (char *)malloc(QM_MODULES_SIZE);
|
||||||
modsize += modsize;
|
|
||||||
newbuf = realloc(modbuf, modsize);
|
|
||||||
|
|
||||||
if ( newbuf == NULL )
|
if ( modbuf == NULL )
|
||||||
{
|
{
|
||||||
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
||||||
"- %s\n", strerror(errno));
|
"- %s\n", strerror(errno));
|
||||||
@ -196,18 +192,31 @@ extern int InitMsyms()
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = query_module(NULL, QM_MODULES, modbuf, QM_MODULES_SIZE, &rtn);
|
||||||
|
|
||||||
|
if ( result < 0 && errno == ENOSPC )
|
||||||
|
{
|
||||||
|
newbuf = (char *)realloc(modbuf, rtn);
|
||||||
|
|
||||||
|
if ( newbuf == NULL )
|
||||||
|
{
|
||||||
|
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
||||||
|
"- %s\n", strerror(errno));
|
||||||
|
free(modbuf);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
modbuf = newbuf;
|
modbuf = newbuf;
|
||||||
|
|
||||||
result = query_module(NULL, QM_MODULES, modbuf, modsize, &rtn);
|
result = query_module(NULL, QM_MODULES, modbuf, rtn, &rtn);
|
||||||
|
}
|
||||||
|
|
||||||
if ( result < 0 && errno != ENOSPC )
|
if ( result < 0 )
|
||||||
{
|
{
|
||||||
Syslog(LOG_ERR, "Error querying loaded modules " \
|
Syslog(LOG_ERR, "Error querying loaded modules " \
|
||||||
"- %s\n", strerror(errno));
|
"- %s\n", strerror(errno));
|
||||||
free(modbuf);
|
free(modbuf);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
} while ( result < 0 );
|
|
||||||
|
|
||||||
if ( rtn <= 0 )
|
if ( rtn <= 0 )
|
||||||
{
|
{
|
||||||
@ -216,6 +225,7 @@ extern int InitMsyms()
|
|||||||
free(modbuf);
|
free(modbuf);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( debugging )
|
if ( debugging )
|
||||||
fprintf(stderr, "Loading kernel module symbols - "
|
fprintf(stderr, "Loading kernel module symbols - "
|
||||||
"Size of table: %d\n", rtn);
|
"Size of table: %d\n", rtn);
|
||||||
@ -230,6 +240,7 @@ extern int InitMsyms()
|
|||||||
}
|
}
|
||||||
|
|
||||||
sym_array_modules = (struct Module *) malloc(rtn * sizeof(struct Module));
|
sym_array_modules = (struct Module *) malloc(rtn * sizeof(struct Module));
|
||||||
|
|
||||||
if ( sym_array_modules == NULL )
|
if ( sym_array_modules == NULL )
|
||||||
{
|
{
|
||||||
Syslog(LOG_WARNING, " Failed memory allocation for kernel " \
|
Syslog(LOG_WARNING, " Failed memory allocation for kernel " \
|
||||||
@ -243,11 +254,13 @@ extern int InitMsyms()
|
|||||||
* Build a symbol table compatible with the other one used by
|
* Build a symbol table compatible with the other one used by
|
||||||
* klogd.
|
* klogd.
|
||||||
*/
|
*/
|
||||||
|
tmp = rtn;
|
||||||
newbuf = modbuf;
|
newbuf = modbuf;
|
||||||
for (tmp=0; tmp < rtn; tmp++)
|
while ( tmp-- )
|
||||||
{
|
{
|
||||||
mod_table[tmp] = newbuf;
|
mod_table[tmp] = newbuf;
|
||||||
newbuf += strlen(newbuf)+1;
|
newbuf += strlen(newbuf)+1;
|
||||||
|
|
||||||
if ( !AddModule(mod_table[tmp]) )
|
if ( !AddModule(mod_table[tmp]) )
|
||||||
{
|
{
|
||||||
Syslog(LOG_WARNING, "Error adding kernel module table "
|
Syslog(LOG_WARNING, "Error adding kernel module table "
|
||||||
@ -323,9 +336,12 @@ static void FreeModules()
|
|||||||
|
|
||||||
/* Check to see if the module symbol tables need to be cleared. */
|
/* Check to see if the module symbol tables need to be cleared. */
|
||||||
have_modules = 0;
|
have_modules = 0;
|
||||||
|
if ( num_modules == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( sym_array_modules == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
if ( sym_array_modules != NULL )
|
|
||||||
{
|
|
||||||
for (nmods = 0; nmods < num_modules; ++nmods)
|
for (nmods = 0; nmods < num_modules; ++nmods)
|
||||||
{
|
{
|
||||||
mp = &sym_array_modules[nmods];
|
mp = &sym_array_modules[nmods];
|
||||||
@ -338,9 +354,7 @@ static void FreeModules()
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(sym_array_modules);
|
free(sym_array_modules);
|
||||||
sym_array_modules = NULL;
|
sym_array_modules = (struct Module *) 0;
|
||||||
}
|
|
||||||
|
|
||||||
num_modules = 0;
|
num_modules = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -367,9 +381,8 @@ static int AddModule(symbol)
|
|||||||
size_t rtn;
|
size_t rtn;
|
||||||
size_t i;
|
size_t i;
|
||||||
const char *cbuf;
|
const char *cbuf;
|
||||||
int symsize = 128;
|
|
||||||
int result;
|
int result;
|
||||||
struct module_symbol *symbuf=NULL,
|
struct module_symbol *symbuf,
|
||||||
*newbuf;
|
*newbuf;
|
||||||
|
|
||||||
auto struct Module *mp;
|
auto struct Module *mp;
|
||||||
@ -403,11 +416,9 @@ static int AddModule(symbol)
|
|||||||
* First, we query for the list of exported symbols. We may
|
* First, we query for the list of exported symbols. We may
|
||||||
* have to grow our buffer in size.
|
* have to grow our buffer in size.
|
||||||
*/
|
*/
|
||||||
do {
|
symbuf = (struct module_symbol *)malloc(QM_SYMBOLS_SIZE);
|
||||||
symsize += symsize;
|
|
||||||
newbuf = realloc(symbuf, symsize);
|
|
||||||
|
|
||||||
if ( newbuf == NULL )
|
if ( symbuf == NULL )
|
||||||
{
|
{
|
||||||
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
||||||
"- %s\n", strerror(errno));
|
"- %s\n", strerror(errno));
|
||||||
@ -416,18 +427,31 @@ static int AddModule(symbol)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = query_module(symbol, QM_SYMBOLS, symbuf, QM_SYMBOLS_SIZE, &rtn);
|
||||||
|
|
||||||
|
if ( result < 0 && errno == ENOSPC )
|
||||||
|
{
|
||||||
|
newbuf = (struct module_symbol *)realloc(symbuf, rtn);
|
||||||
|
|
||||||
|
if ( newbuf == NULL )
|
||||||
|
{
|
||||||
|
Syslog(LOG_ERR, "Error loading kernel symbols " \
|
||||||
|
"- %s\n", strerror(errno));
|
||||||
|
free(symbuf);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
symbuf = newbuf;
|
symbuf = newbuf;
|
||||||
|
|
||||||
result = query_module(symbol, QM_SYMBOLS, symbuf, symsize, &rtn);
|
result = query_module(symbol, QM_SYMBOLS, symbuf, rtn, &rtn);
|
||||||
|
}
|
||||||
|
|
||||||
if ( result < 0 && errno != ENOSPC )
|
if ( result < 0 )
|
||||||
{
|
{
|
||||||
Syslog(LOG_ERR, "Error querying symbol list for %s " \
|
Syslog(LOG_ERR, "Error querying symbol list for %s " \
|
||||||
"- %s\n", symbol, strerror(errno));
|
"- %s\n", symbol, strerror(errno));
|
||||||
free(symbuf);
|
free(symbuf);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
} while ( result < 0 );
|
|
||||||
|
|
||||||
if ( rtn < 0 )
|
if ( rtn < 0 )
|
||||||
{
|
{
|
||||||
@ -485,7 +509,6 @@ static int AddSymbol(mp, address, symbol)
|
|||||||
{
|
{
|
||||||
auto int tmp;
|
auto int tmp;
|
||||||
|
|
||||||
|
|
||||||
/* Allocate space for the symbol table entry. */
|
/* Allocate space for the symbol table entry. */
|
||||||
mp->sym_array = (struct sym_table *) realloc(mp->sym_array, \
|
mp->sym_array = (struct sym_table *) realloc(mp->sym_array, \
|
||||||
(mp->num_syms+1) * sizeof(struct sym_table));
|
(mp->num_syms+1) * sizeof(struct sym_table));
|
||||||
|
4
module.h
4
module.h
@ -41,13 +41,15 @@
|
|||||||
#define QM_SYMBOLS 4
|
#define QM_SYMBOLS 4
|
||||||
#define QM_INFO 5
|
#define QM_INFO 5
|
||||||
|
|
||||||
|
#define QM_MODULES_SIZE 256
|
||||||
|
#define QM_SYMBOLS_SIZE 512
|
||||||
|
|
||||||
struct module_symbol
|
struct module_symbol
|
||||||
{
|
{
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
unsigned long name;
|
unsigned long name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct module_info
|
struct module_info
|
||||||
{
|
{
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
|
Loading…
Reference in New Issue
Block a user