commit 50d78a6f9a0ce38ee11777c5b54d3bbdedea2c37
parent b6c4dbffdbbbb7046896e5c1d5ef6ad90b21eced
Author: David Lawrence Ramsey <pooka109@gmail.com>
Date: Mon, 27 Nov 2006 02:41:59 +0000
don't allow filenames entered at the "Write File" prompt or the "Insert
File" prompt to contain nulls
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3971 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
4 files changed, 34 insertions(+), 27 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,6 +1,10 @@
CVS code -
- General:
- Miscellaneous comment fixes. (DLR)
+ - Don't allow filenames entered at the "Write File" prompt or
+ the "Insert File" prompt to contain nulls. Changes to
+ do_statusbar_input(), do_statusbar_output(), and
+ do_statusbar_verbatim_input(). (DLR)
- nano.h:
- Rename NANO_ALT_REPLACE_KEY to NANO_REPLACE_ALTKEY, for
consistency. (DLR)
diff --git a/src/nano.c b/src/nano.c
@@ -1553,14 +1553,13 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
current_len = strlen(openfile->current->data);
while (i < output_len) {
- /* If allow_cntrls is FALSE, filter out nulls and newlines,
- * since they're ASCII control characters. */
- if (allow_cntrls) {
- /* Null to newline, if needed. */
- if (output[i] == '\0')
+ /* Null to newline, if needed, and if allow_cntrls is TRUE. */
+ if (output[i] == '\0') {
+ if (allow_cntrls)
output[i] = '\n';
- /* Newline to Enter, if needed. */
- else if (output[i] == '\n') {
+ /* Newline to Enter, if needed, and if allow_cntrls is TRUE. */
+ } else if (output[i] == '\n') {
+ if (allow_cntrls) {
do_enter();
i++;
continue;
@@ -1579,7 +1578,7 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
continue;
/* If the NO_NEWLINES flag isn't set, when a character is
- * added to the magicline, it means we need a new magicline! */
+ * added to the magicline, it means we need a new magicline. */
if (!ISSET(NO_NEWLINES) && openfile->filebot ==
openfile->current)
new_magicline();
diff --git a/src/prompt.c b/src/prompt.c
@@ -145,7 +145,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
if (*s_or_t || get_key_buffer_len() == 0) {
if (kbinput != NULL) {
/* Display all the characters in the input buffer at
- * once, filtering out control characters. */
+ * once, filtering out control characters and nulls. */
char *output = charalloc(kbinput_len + 1);
size_t i;
bool got_enter;
@@ -156,7 +156,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
output[i] = '\0';
do_statusbar_output(output, kbinput_len, &got_enter,
- FALSE);
+ FALSE, FALSE);
free(output);
@@ -312,11 +312,11 @@ bool do_statusbar_mouse(void)
#endif
/* The user typed output_len multibyte characters. Add them to the
- * statusbar prompt, setting got_enter to TRUE if we get a newline, and
- * filtering out all ASCII control characters if allow_cntrls is
- * TRUE. */
+ * statusbar prompt, setting got_enter to TRUE if we get a newline,
+ * filtering out all ASCII control characters if allow_cntrls is TRUE,
+ * and filtering out all nulls if allow_nulls is TRUE. */
void do_statusbar_output(char *output, size_t output_len, bool
- *got_enter, bool allow_cntrls)
+ *got_enter, bool allow_cntrls, bool allow_nulls)
{
size_t answer_len, i = 0;
char *char_buf = charalloc(mb_cur_max());
@@ -328,14 +328,14 @@ void do_statusbar_output(char *output, size_t output_len, bool
*got_enter = FALSE;
while (i < output_len) {
- /* If allow_cntrls is FALSE, filter out nulls and newlines,
- * since they're ASCII control characters. */
- if (allow_cntrls) {
- /* Null to newline, if needed. */
- if (output[i] == '\0')
+ /* Null to newline, if needed, and if allow_cntrls and
+ * allow_nulls are TRUE. */
+ if (output[i] == '\0') {
+ if (allow_cntrls && allow_nulls)
output[i] = '\n';
- /* Newline to Enter, if needed. */
- else if (output[i] == '\n') {
+ /* Newline to Enter, if needed, and if allow_cntrls is TRUE. */
+ } else if (output[i] == '\n') {
+ if (allow_cntrls) {
/* Set got_enter to TRUE to indicate that we got the
* Enter key, put back the rest of the characters in
* output so that they can be parsed and output again,
@@ -352,9 +352,10 @@ void do_statusbar_output(char *output, size_t output_len, bool
i += char_buf_len;
/* If allow_cntrls is FALSE, filter out an ASCII control
- * character. */
- if (!allow_cntrls && is_ascii_cntrl_char(*(output + i -
- char_buf_len)))
+ * character. If allow_nulls is FALSE, filter out a null. */
+ if ((!allow_cntrls && is_ascii_cntrl_char(*(output + i -
+ char_buf_len))) || (!allow_nulls && *(output + i -
+ char_buf_len) == '\0'))
continue;
/* More dangerousness fun =) */
@@ -676,14 +677,17 @@ void do_statusbar_verbatim_input(bool *got_enter)
kbinput = get_verbatim_kbinput(bottomwin, &kbinput_len);
/* Display all the verbatim characters at once, not filtering out
- * control characters. */
+ * control characters, and not filtering out nulls unless we're at
+ * the "Write File" prompt or the "Insert File" prompt. */
output = charalloc(kbinput_len + 1);
for (i = 0; i < kbinput_len; i++)
output[i] = (char)kbinput[i];
output[i] = '\0';
- do_statusbar_output(output, kbinput_len, got_enter, TRUE);
+ do_statusbar_output(output, kbinput_len, got_enter, TRUE,
+ currshortcut != writefile_list && currshortcut !=
+ insertfile_list);
free(output);
}
diff --git a/src/proto.h b/src/proto.h
@@ -496,7 +496,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
bool do_statusbar_mouse(void);
#endif
void do_statusbar_output(char *output, size_t output_len, bool
- *got_enter, bool allow_cntrls);
+ *got_enter, bool allow_cntrls, bool allow_nulls);
void do_statusbar_home(void);
void do_statusbar_end(void);
void do_statusbar_left(void);