{
            /* 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 ("");
 
              || 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.  */
 
   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 */