Make escape() return a wcstring

This avoids the potential for leaking the resulting string.
This commit is contained in:
Kevin Ballard 2014-09-25 18:20:03 -07:00
parent cd4fa518b8
commit 35595dbffd
7 changed files with 23 additions and 33 deletions

View file

@ -1120,7 +1120,7 @@ static void escape_string_internal(const wchar_t *orig_in, size_t in_len, wcstri
} }
} }
wchar_t *escape(const wchar_t *in, escape_flags_t flags) wcstring escape(const wchar_t *in, escape_flags_t flags)
{ {
if (!in) if (!in)
{ {
@ -1128,9 +1128,9 @@ wchar_t *escape(const wchar_t *in, escape_flags_t flags)
FATAL_EXIT(); FATAL_EXIT();
} }
wcstring tmp; wcstring result;
escape_string_internal(in, wcslen(in), &tmp, flags); escape_string_internal(in, wcslen(in), &result, flags);
return wcsdup(tmp.c_str()); return result;
} }
wcstring escape_string(const wcstring &in, escape_flags_t flags) wcstring escape_string(const wcstring &in, escape_flags_t flags)

View file

@ -808,10 +808,10 @@ void print_stderr(const wcstring &str);
\param in The string to be escaped \param in The string to be escaped
\param flags Flags to control the escaping \param flags Flags to control the escaping
\return The escaped string, or 0 if there is not enough memory \return The escaped string
*/ */
wchar_t *escape(const wchar_t *in, escape_flags_t flags); wcstring escape(const wchar_t *in, escape_flags_t flags);
wcstring escape_string(const wcstring &in, escape_flags_t flags); wcstring escape_string(const wcstring &in, escape_flags_t flags);
/** /**

View file

@ -365,7 +365,7 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t **commands, size_t
CHECK(mode,); CHECK(mode,);
CHECK(sets_mode,); CHECK(sets_mode,);
// debug( 0, L"Add mapping from %ls to %ls in mode %ls", escape(sequence, 1), escape(command, 1 ), mode); // debug( 0, L"Add mapping from %ls to %ls in mode %ls", escape(sequence, ESCAPE_ALL).c_str(), escape(command, ESCAPE_ALL).c_str(), mode);
// remove existing mappings with this sequence // remove existing mappings with this sequence
const wcstring_list_t commands_vector(commands, commands + commands_len); const wcstring_list_t commands_vector(commands, commands + commands_len);
@ -629,7 +629,7 @@ static bool input_mapping_is_match(const input_mapping_t &m)
wint_t c = 0; wint_t c = 0;
int j; int j;
//debug(0, L"trying mapping %ls\n", escape(m.seq.c_str(), 1)); //debug(0, L"trying mapping %ls\n", escape(m.seq.c_str(), ESCAPE_ALL).c_str());
const wchar_t *str = m.seq.c_str(); const wchar_t *str = m.seq.c_str();
for (j=0; str[j] != L'\0'; j++) for (j=0; str[j] != L'\0'; j++)
{ {
@ -644,7 +644,7 @@ static bool input_mapping_is_match(const input_mapping_t &m)
if (str[j] == L'\0') if (str[j] == L'\0')
{ {
//debug(0, L"matched mapping %ls (%ls)\n", escape(m.seq.c_str(), 1), m.command.c_str()); //debug(0, L"matched mapping %ls (%ls)\n", escape(m.seq.c_str(), ESCAPE_ALL).c_str(), m.command.c_str());
/* We matched the entire sequence */ /* We matched the entire sequence */
return true; return true;
} }
@ -680,7 +680,7 @@ static void input_mapping_execute_matching_or_generic(bool allow_commands)
{ {
const input_mapping_t &m = mapping_list.at(i); const input_mapping_t &m = mapping_list.at(i);
//debug(0, L"trying mapping (%ls,%ls,%ls)\n", escape(m.seq.c_str(), 1), //debug(0, L"trying mapping (%ls,%ls,%ls)\n", escape(m.seq.c_str(), ESCAPE_ALL).c_str(),
// m.mode.c_str(), m.sets_mode.c_str()); // m.mode.c_str(), m.sets_mode.c_str());
if (m.mode != bind_mode) if (m.mode != bind_mode)

View file

@ -49,7 +49,7 @@ static kill_list_t kill_list;
/** /**
Contents of the X clipboard, at last time we checked it Contents of the X clipboard, at last time we checked it
*/ */
static wchar_t *cut_buffer=0; static wcstring cut_buffer;
/** /**
Test if the xsel command is installed. Since this is called often, Test if the xsel command is installed. Since this is called often,
@ -73,7 +73,7 @@ void kill_add(const wcstring &str)
return; return;
wcstring cmd; wcstring cmd;
wchar_t *escaped_str = NULL; wcstring escaped_str;
kill_list.push_front(str); kill_list.push_front(str);
/* /*
@ -87,7 +87,7 @@ void kill_add(const wcstring &str)
const env_var_t clipboard_wstr = env_get_string(L"FISH_CLIPBOARD_CMD"); const env_var_t clipboard_wstr = env_get_string(L"FISH_CLIPBOARD_CMD");
if (!clipboard_wstr.missing()) if (!clipboard_wstr.missing())
{ {
escaped_str = escape(str.c_str(), 1); escaped_str = escape(str.c_str(), ESCAPE_ALL);
cmd.assign(L"echo -n "); cmd.assign(L"echo -n ");
cmd.append(escaped_str); cmd.append(escaped_str);
cmd.append(clipboard_wstr); cmd.append(clipboard_wstr);
@ -119,8 +119,6 @@ void kill_add(const wcstring &str)
*/ */
} }
free(cut_buffer);
cut_buffer = escaped_str; cut_buffer = escaped_str;
} }
} }
@ -193,10 +191,9 @@ static void kill_check_x_buffer()
etc. anyway. etc. anyway.
*/ */
if (cut_buffer == NULL || cut_buffer != new_cut_buffer) if (cut_buffer != new_cut_buffer)
{ {
free(cut_buffer); cut_buffer = new_cut_buffer;
cut_buffer = wcsdup(new_cut_buffer.c_str());
kill_list.push_front(new_cut_buffer); kill_list.push_front(new_cut_buffer);
} }
} }
@ -228,7 +225,6 @@ void kill_init()
void kill_destroy() void kill_destroy()
{ {
if (cut_buffer) cut_buffer.clear();
free(cut_buffer);
} }

View file

@ -567,15 +567,13 @@ void writestr_ellipsis(const wchar_t *str, int max_width)
int write_escaped_str(const wchar_t *str, int max_len) int write_escaped_str(const wchar_t *str, int max_len)
{ {
wchar_t *out;
int i; int i;
int len;
int written=0; int written=0;
CHECK(str, 0); CHECK(str, 0);
out = escape(str, 1); wcstring out = escape(str, ESCAPE_ALL);
len = fish_wcswidth(out); int len = fish_wcswidth(out);
if (max_len && (max_len < len)) if (max_len && (max_len < len))
{ {
@ -596,10 +594,9 @@ int write_escaped_str(const wchar_t *str, int max_len)
else else
{ {
written = len; written = len;
writestr(out); writestr(out.c_str());
} }
free(out);
return written; return written;
} }

View file

@ -1309,7 +1309,6 @@ wcstring completion_apply_to_command_line(const wcstring &val_str, complete_flag
{ {
size_t move_cursor; size_t move_cursor;
const wchar_t *begin, *end; const wchar_t *begin, *end;
wchar_t *escaped;
const wchar_t *buff = command_line.c_str(); const wchar_t *buff = command_line.c_str();
parse_util_token_extent(buff, cursor_pos, &begin, 0, 0, 0); parse_util_token_extent(buff, cursor_pos, &begin, 0, 0, 0);
@ -1321,10 +1320,9 @@ wcstring completion_apply_to_command_line(const wcstring &val_str, complete_flag
{ {
/* Respect COMPLETE_DONT_ESCAPE_TILDES */ /* Respect COMPLETE_DONT_ESCAPE_TILDES */
bool no_tilde = !!(flags & COMPLETE_DONT_ESCAPE_TILDES); bool no_tilde = !!(flags & COMPLETE_DONT_ESCAPE_TILDES);
escaped = escape(val, ESCAPE_ALL | ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0)); wcstring escaped = escape(val, ESCAPE_ALL | ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0));
sb.append(escaped); sb.append(escaped);
move_cursor = wcslen(escaped); move_cursor = escaped.size();
free(escaped);
} }
else else
{ {

View file

@ -440,7 +440,6 @@ static wcstring complete_get_desc_suffix(const wchar_t *suff_orig)
size_t len; size_t len;
wchar_t *suff; wchar_t *suff;
wchar_t *pos; wchar_t *pos;
wchar_t *tmp;
len = wcslen(suff_orig); len = wcslen(suff_orig);
@ -461,9 +460,9 @@ static wcstring complete_get_desc_suffix(const wchar_t *suff_orig)
} }
} }
tmp = escape(suff, 1); wcstring tmp = escape(suff, ESCAPE_ALL);
free(suff); free(suff);
suff = tmp; suff = wcsdup(tmp.c_str());
std::map<wcstring, wcstring>::iterator iter = suffix_map.find(suff); std::map<wcstring, wcstring>::iterator iter = suffix_map.find(suff);
wcstring desc; wcstring desc;