mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 04:43:10 +00:00
Make escape() return a wcstring
This avoids the potential for leaking the resulting string.
This commit is contained in:
parent
cd4fa518b8
commit
35595dbffd
7 changed files with 23 additions and 33 deletions
|
@ -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)
|
||||||
|
|
4
common.h
4
common.h
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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)
|
||||||
|
|
16
kill.cpp
16
kill.cpp
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue