summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2020-04-18 00:32:24 +0300
committerMonty <monty@mariadb.org>2020-04-18 11:51:42 +0300
commit749b9887943dadbed027412a2d6df2ab6c5ee275 (patch)
tree446edbc3fb23898ddc3f535bc84203a544976dc6
parent48eda61cd41725498908308e0004897f10dd7307 (diff)
downloadmariadb-git-749b9887943dadbed027412a2d6df2ab6c5ee275.tar.gz
Fixed memory leaks in resolve_stack_dump
- Remove memory leaks reported by safemalloc - Changed that all 0x strings are converted. This is needed to easily be able to resolve safemalloc backtraces
-rw-r--r--extra/resolve_stack_dump.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/extra/resolve_stack_dump.c b/extra/resolve_stack_dump.c
index 92cd4c0de18..6d6adccfe32 100644
--- a/extra/resolve_stack_dump.c
+++ b/extra/resolve_stack_dump.c
@@ -53,7 +53,7 @@ static struct my_option my_long_options[] =
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"version", 'V', "Output version information and exit.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
- {"symbols-file", 's', "Use specified symbols file.", &sym_fname,
+ {"symbols-file", 's', "Use specified symbols file", &sym_fname,
&sym_fname, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"numeric-dump-file", 'n', "Read the dump from specified file.",
&dump_fname, &dump_fname, 0, GET_STR, REQUIRED_ARG,
@@ -63,7 +63,7 @@ static struct my_option my_long_options[] =
static void verify_sort();
-
+static void clean_up();
static void print_version(void)
{
@@ -97,9 +97,18 @@ static void die(const char* fmt, ...)
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
+ clean_up();
+ my_end(0);
exit(1);
}
+void local_exit(int error)
+{
+ clean_up();
+ my_end(0);
+ exit(error);
+}
+
static my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
@@ -108,10 +117,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
switch(optid) {
case 'V':
print_version();
- exit(0);
+ local_exit(0);
+ break;
case '?':
usage();
- exit(0);
+ local_exit(0);
+ break;
}
return 0;
}
@@ -122,7 +133,7 @@ static int parse_args(int argc, char **argv)
int ho_error;
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
- exit(ho_error);
+ local_exit(ho_error);
/*
The following code is to make the command compatible with the old
@@ -143,13 +154,13 @@ static int parse_args(int argc, char **argv)
else
{
usage();
- exit(1);
+ local_exit(1);
}
}
else if (argc != 0 || !sym_fname)
{
usage();
- exit(1);
+ local_exit(1);
}
return 0;
}
@@ -242,6 +253,10 @@ static void init_sym_table()
static void clean_up()
{
delete_dynamic(&sym_table);
+ if (fp_dump && fp_dump != stdin)
+ my_fclose(fp_dump, MYF(0));
+ if (fp_sym)
+ my_fclose(fp_sym, MYF(0));
}
static void verify_sort()
@@ -283,7 +298,7 @@ static SYM_ENTRY* resolve_addr(uchar* addr, SYM_ENTRY* se)
/*
- Resolve anything that starts with [0x or (+0x or start of line and 0x
+ Resolve anything that starts with [0x or (+0x or 0x
Skip '_end' as this is an indication of a wrong symbol (stack?)
*/
@@ -299,9 +314,7 @@ static void do_resolve()
found= 3;
if (p[0] == '(' && p[1] == '+' && p[2] == '0' && p[3] == 'x')
found= 4;
-
- /* For stdin */
- if (p == buf && p[0] == '0' && p[1] == 'x')
+ if (p[0] == '0' && p[1] == 'x')
found= 2;
if (found)
@@ -312,14 +325,15 @@ static void do_resolve()
addr= (uchar*)read_addr(&tmp);
if (resolve_addr(addr, &se) && strcmp(se.symbol, "_end"))
{
- fprintf(fp_out, "%c%p %s + %d", *p, addr, se.symbol,
- (int) (addr - se.addr));
+ found-= 2; /* Don't print 0x as it's added by %p */
+ while (found--)
+ fputc(*p++, stdout);
+ fprintf(fp_out, "%p %s + %d", addr,
+ se.symbol, (int) (addr - se.addr));
p= tmp-1;
}
else
- {
fputc(*p, stdout);
- }
}
else
fputc(*p, stdout);
@@ -336,5 +350,6 @@ int main(int argc, char** argv)
init_sym_table();
do_resolve();
clean_up();
+ my_end(0);
return 0;
}