diff options
-rw-r--r-- | gdb/cli/cli-setshow.c | 7 | ||||
-rw-r--r-- | gdb/parse.c | 3 | ||||
-rw-r--r-- | gdbsupport/gdb_unique_ptr.h | 9 |
3 files changed, 14 insertions, 5 deletions
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c index dcb50ca..18e2d4e 100644 --- a/gdb/cli/cli-setshow.c +++ b/gdb/cli/cli-setshow.c @@ -375,14 +375,13 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c) { /* Clear trailing whitespace of filename. */ const char *ptr = arg + strlen (arg) - 1; - char *copy; while (ptr >= arg && (*ptr == ' ' || *ptr == '\t')) ptr--; - copy = xstrndup (arg, ptr + 1 - arg); + gdb::unique_xmalloc_ptr<char> copy + = make_unique_xstrndup (arg, ptr + 1 - arg); - val = tilde_expand (copy); - xfree (copy); + val = tilde_expand (copy.get ()); } else val = xstrdup (""); diff --git a/gdb/parse.c b/gdb/parse.c index b2f23eb..a76a6c1 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -199,7 +199,8 @@ parser_state::mark_completion_tag (enum type_code tag, const char *ptr, || tag == TYPE_CODE_STRUCT || tag == TYPE_CODE_ENUM); m_completion_state.expout_tag_completion_type = tag; - m_completion_state.expout_completion_name.reset (xstrndup (ptr, length)); + m_completion_state.expout_completion_name + = make_unique_xstrndup (ptr, length); } /* See parser-defs.h. */ diff --git a/gdbsupport/gdb_unique_ptr.h b/gdbsupport/gdb_unique_ptr.h index df88cea..77aecb4 100644 --- a/gdbsupport/gdb_unique_ptr.h +++ b/gdbsupport/gdb_unique_ptr.h @@ -64,4 +64,13 @@ make_unique_xstrdup (const char *str) return gdb::unique_xmalloc_ptr<char> (xstrdup (str)); } +/* Dup the first N characters of STR and return a unique_xmalloc_ptr + for the result. The result is always \0-terminated. */ + +static inline gdb::unique_xmalloc_ptr<char> +make_unique_xstrndup (const char *str, size_t n) +{ + return gdb::unique_xmalloc_ptr<char> (xstrndup (str, n)); +} + #endif /* COMMON_GDB_UNIQUE_PTR_H */ |