--- a/gdb/stap-probe.c +++ b/gdb/stap-probe.c @@ -355,9 +355,7 @@ stap_free_args_info (void *args_info_ptr) int i; for (i = 0; i < a->n_args; i++) - { - xfree (a->arg[i].arg_str); - } + xfree (a->arg[i].arg_str); xfree (a->arg); xfree (a); @@ -401,6 +399,7 @@ stap_parse_probe_arguments (struct stap_probe *probe) return; args_info = xmalloc (sizeof (struct stap_args_info)); + args_info->n_args = 0; back_to = make_cleanup (stap_free_args_info, args_info); args_info->arg = xcalloc (STAP_MAX_ARGS, sizeof (struct stap_probe_arg)); @@ -493,6 +492,7 @@ stap_parse_probe_arguments (struct stap_probe *probe) args_info->arg[current_arg].arg_str = savestring (start, cur - start); + ++args_info->n_args; /* Start it over again. */ cur = skip_spaces ((char *) cur); current_state = NEW_ARG; @@ -513,7 +513,6 @@ stap_parse_probe_arguments (struct stap_probe *probe) } } - args_info->n_args = current_arg + 1; args_info->arg = xrealloc (args_info->arg, args_info->n_args * sizeof (struct stap_probe_arg)); @@ -1526,8 +1525,9 @@ stap_free_parsed_args (struct stap_args_info *parsed_args) return; for (i = 0; i < parsed_args->n_args; i++) - xfree (parsed_args->arg); + xfree (parsed_args->arg[i].arg_str); + xfree (parsed_args->arg); xfree (parsed_args); } @@ -1859,7 +1859,7 @@ parse_stap_probe (char **argptr, struct linespec_result *canonical) if (canonical) { canonical->canonical = xrealloc (canonical->canonical, - result.nelts * sizeof (char **)); + result.nelts * sizeof (char *)); canonical->canonical[result.nelts - 1] = xstrdup (full_arg); } }