summaryrefslogtreecommitdiffstats
path: root/src/audit-error.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/audit-error.c')
-rw-r--r--src/audit-error.c190
1 files changed, 57 insertions, 133 deletions
diff --git a/src/audit-error.c b/src/audit-error.c
index c93c75c..f6286cd 100644
--- a/src/audit-error.c
+++ b/src/audit-error.c
@@ -19,23 +19,14 @@ extern FILE *lt_audit_in;
static struct hsearch_data symbol_tab;
static int symbol_tab_init = 0;
-static int automated_symbols_find(struct lt_config_audit *cfg,
- const char *name);
-
-static struct lt_error_sym*
-automated_sym_get(struct lt_config_audit *cfg, const char *name);
-
struct lt_error_sym* lt_error_sym_get(struct lt_config_audit *cfg,
const char *name)
{
- struct lt_error_config *cfg_err = cfg->error_config;
struct lt_error_sym *sym;
ENTRY e, *ep;
- if (cfg_err->automated)
- return automated_sym_get(cfg, name);
-
- BUG_ON(!symbol_tab_init);
+ if (!symbol_tab_init)
+ return NULL;
PRINT_VERBOSE(cfg, 1, "request for <%s>\n", name);
@@ -142,11 +133,12 @@ int lt_error_sym_exit(struct lt_config_audit *cfg,
int handle_sigsegv;
long ret;
- if (cfg_err->automated) {
- struct lt_error_config_sym *cfg_sym;
+ /* we're not interested in this symbol */
+ if (!sym || !sym->error)
+ return -1;
- if (!automated_symbols_find(cfg, symname))
- return 0;
+ if (cfg_err->type == LT_ERROR_RUN_TYPE_AUTO) {
+ struct lt_error_sym *esym;
PRINT_VERBOSE(cfg, 1, "automated_sym_cnt %d, cfg_err->sym_cnt %d\n",
automated_sym_cnt, cfg_err->sym_cnt);
@@ -154,25 +146,21 @@ int lt_error_sym_exit(struct lt_config_audit *cfg,
if (automated_sym_cnt >= cfg_err->sym_cnt)
return -1;
- cfg_sym = &cfg_err->sym[automated_sym_cnt];
- ret = cfg_sym->ret;
- keep = cfg_sym->keep;
- handle_sigsegv = cfg_sym->handle_sigsegv;
+ esym = &cfg_err->sym[automated_sym_cnt];
+ ret = esym->ret;
+ keep = esym->keep;
+ handle_sigsegv = esym->handle_sigsegv;
*info = automated_sym_cnt++;
} else {
- /* we're not interested in this symbol */
- if (!sym || !sym->error)
- return -1;
-
esym = sym->error;
PRINT_VERBOSE(cfg, 1, "symbol %s, call %lu, n %ld\n",
- sym->name, esym->call, cfg_err->n);
+ sym->name, esym->call_configured, cfg_err->n);
/* we are not interested in this call number */
- if (esym->call++ != cfg_err->n)
+ if (esym->call_current++ != esym->call_configured)
return -1;
ret = esym->ret;
@@ -202,13 +190,12 @@ int lt_error_sym_exit(struct lt_config_audit *cfg,
static int symbol_add(struct lt_config_audit *cfg,
struct lt_error_config *cfg_err,
- struct lt_error_config_sym *cfg_sym)
+ struct lt_error_sym *sym)
{
ENTRY e, *ep;
- struct lt_error_sym *sym;
PRINT_VERBOSE(cfg, 1, "symbol %s, ret %ld\n",
- cfg_sym->symbol, cfg_sym->ret);
+ sym->name.symbol, sym->ret);
/* should be safe, since only one thread
* is doing the initialization */
@@ -221,26 +208,16 @@ static int symbol_add(struct lt_config_audit *cfg,
PRINT_VERBOSE(cfg, 1, "symbol table initialized\n");
}
- e.key = cfg_sym->symbol;
- if (!hsearch_r(e, FIND, &ep, &symbol_tab)) {
+ e.key = sym->name.symbol;
+ if (hsearch_r(e, FIND, &ep, &symbol_tab)) {
PRINT_VERBOSE(cfg, 1, "symbol %s already in the table\n",
- cfg_sym->symbol);
+ sym->name.symbol);
/* This is a bug in normal processing,
* but completelly ok in automated mode. */
- return cfg_err->automated ? 0 : -1;
- }
-
- sym = malloc(sizeof(*sym));
- if (!sym) {
- PRINT_VERBOSE(cfg, 1, "failed to allocate error symbol\n");
- return -1;
+ return cfg_err->type == LT_ERROR_RUN_TYPE_AUTO? 0 : -1;
}
- sym->name = strdup(cfg_sym->symbol);
- sym->ret = cfg_sym->ret;
- sym->handle_sigsegv = cfg_sym->handle_sigsegv;
-
- e.key = sym->name;
+ e.key = sym->name.symbol;
e.data = sym;
if (!hsearch_r(e, ENTER, &ep, &symbol_tab)) {
@@ -257,22 +234,47 @@ static int symbol_add(struct lt_config_audit *cfg,
return 0;
}
+static void display_error_symbols(struct lt_config_audit *cfg,
+ char *names, int size)
+{
+ char *p;
+
+ PRINT_VERBOSE(cfg, 1, "START size %d\n", size);
+
+ while(size) {
+ PRINT_VERBOSE(cfg, 1, "name %s\n", names);
+ p = memchr(names, 0, size);
+ size -= ++p - names;
+ names = p;
+ }
+
+ PRINT_VERBOSE(cfg, 1, "END\n");
+}
+
int lt_error_init(struct lt_config_audit *cfg)
{
struct lt_error_config *cfg_err = cfg->error_config;
int sym_cnt = cfg_err->sym_cnt, i, ok = 1;
-
- if (cfg_err->automated)
- return 0;
+ char *names;
lt_sh(cfg, error_sim) = 0;
+ names = (char*) (((void*) &cfg_err->sym) +
+ (sym_cnt * sizeof(struct lt_error_sym)));
+
+ display_error_symbols(cfg, names, cfg_err->names_size);
+
for(i = 0; i < sym_cnt; i++) {
- struct lt_error_config_sym *cfg_sym;
+ struct lt_error_sym *sym;
+
+ sym = &cfg_err->sym[i];
+
+ PRINT_VERBOSE(cfg, 1, "symbol index %d, name %s\n",
+ sym->name.index, names + sym->name.index);
- cfg_sym = &cfg_err->sym[i];
+ sym->name.symbol = names + sym->name.index;
- if (symbol_add(cfg, cfg_err, cfg_sym)) {
+ if (symbol_add(cfg, cfg_err, sym)) {
ok = 0;
break;
}
@@ -288,81 +290,6 @@ int lt_error_init(struct lt_config_audit *cfg)
return 0;
}
-static struct hsearch_data automated_symbol_tab;
-
-static int automated_symbols_find(struct lt_config_audit *cfg,
- const char *name)
-{
- ENTRY e, *ep;
- int found;
-
- e.key = (char*) name;
- found = hsearch_r(e, FIND, &ep, &automated_symbol_tab);
-
- PRINT_VERBOSE(cfg, 1, "found %d, name %s\n", found, name);
-
- return found;
-}
-
-static struct lt_error_sym*
-automated_sym_get(struct lt_config_audit *cfg,
- const char *name)
-{
- return NULL;
-}
-
-static int automated_symbols_init(struct lt_config_audit *cfg,
- struct lt_error_config *cfg_err,
- int fd)
-{
- char *symbols, *name;
- off_t off = lseek(fd, 0, SEEK_CUR);
- off_t file_size = lseek(fd, 0, SEEK_END);
- int size = (int) (file_size - off);
-
- PRINT_VERBOSE(cfg, 1, "size %d\n", size);
-
- symbols = malloc(size);
- if (!symbols) {
- perror("malloc failed");
- return -1;
- }
-
- lseek(fd, off, SEEK_SET);
- if (size != read(fd, symbols, size)) {
- perror("read failed");
- return -1;
- }
-
- if (!hcreate_r(SYMBOL_TAB_SIZE, &automated_symbol_tab)) {
- perror("failed to create hash table");
- return -1;
- }
-
- name = symbols;
-
- while(1) {
- ENTRY e, *ep;
-
- e.key = name;
- e.data = (void*) 1;
-
- PRINT_VERBOSE(cfg, 1, "name %s\n", name);
-
- if (!hsearch_r(e, ENTER, &ep, &automated_symbol_tab)) {
- perror("hsearch_r failed");
- break;
- }
-
- name += strlen(name) + 1;
- if (name >= (symbols + size))
- break;
- }
-
- PRINT_VERBOSE(cfg, 1, "done\n");
- return 0;
-}
-
int lt_error_config_read(struct lt_config_audit *cfg, int fd)
{
int size;
@@ -375,9 +302,11 @@ int lt_error_config_read(struct lt_config_audit *cfg, int fd)
return -1;
}
- size = cfg_err_st.sym_cnt * sizeof(struct lt_error_config_sym);
+ size = cfg_err_st.sym_cnt * sizeof(struct lt_error_sym);
+ size += cfg_err_st.names_size;
- PRINT_VERBOSE(cfg, 1, "symbols count %d\n", cfg_err_st.sym_cnt);
+ PRINT_VERBOSE(cfg, 1, "symbols count %d, names_size %d, total size %d\n",
+ cfg_err_st.sym_cnt, cfg_err_st.names_size, size);
cfg_err = malloc(sizeof(*cfg_err) + size);
if (!cfg_err) {
@@ -387,16 +316,11 @@ int lt_error_config_read(struct lt_config_audit *cfg, int fd)
*cfg_err = cfg_err_st;
- if (size != read(fd, cfg_err->sym, size)) {
+ if (size != read(fd, &cfg_err->sym, size)) {
PRINT_VERBOSE(cfg, 1, "failed: no error symbols defined\n");
return -1;
}
- if (cfg_err->automated &&
- automated_symbols_init(cfg, cfg_err, fd))
- return -1;
-
cfg->error_config = cfg_err;
-
- return size + sizeof(cfg_err_st);
+ return 0;
}