]> git.wh0rd.org Git - nano.git/commitdiff
don't allow filenames entered at the "Write File" prompt or the "Insert
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 27 Nov 2006 02:41:59 +0000 (02:41 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 27 Nov 2006 02:41:59 +0000 (02:41 +0000)
File" prompt to contain nulls

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3971 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c
src/prompt.c
src/proto.h

index 1bf4fc78c5881cf166ff4bb60c9398e231693afb..4d78000154d722c311db5882a5eddad1bb70310d 100644 (file)
--- 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)
index db219f7955536df1b4ccee4d2a7051e62a5e42d0..e5ce3a64e9360d783c2239923f48467cc3171fc0 100644 (file)
@@ -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();
index 67d5aa0df3bf948ade344385c000a5b5c287fd9a..68336b7b3189b8acb75f3ab83b26dcd8a22044f3 100644 (file)
@@ -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);
 }
index ed908d03821a5b1d9c10f3219bcf55a349d68451..c983046f1e671e6bda94d98929a7ffcdab8ba397 100644 (file)
@@ -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);