diff options
Diffstat (limited to 'src/audit-error.c')
-rw-r--r-- | src/audit-error.c | 190 |
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; } |