diff --git a/ChangeLog b/ChangeLog index 952daf08..34f3b610 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ CVS code - - General: - Miscellaneous comment fixes. (DLR) +- browser.c: + do_browser() + - Properly handle directories that contain nulls. (DLR) - files.c: do_insertfile() - Properly handle filenames and executable commands that contain diff --git a/src/browser.c b/src/browser.c index ef0d9133..a37cf599 100644 --- a/src/browser.c +++ b/src/browser.c @@ -231,7 +231,9 @@ char *do_browser(char *path, DIR *dir) #endif bottombars(browser_list); - if (i < 0) { + /* If the directory begins with a newline (i.e. an + * encoded null), treat it as though it's blank. */ + if (i < 0 || answer[0] == '\n') { /* We canceled. Indicate that on the statusbar, and * blank out ans, since we're done with it. */ statusbar(_("Cancelled")); @@ -251,6 +253,11 @@ char *do_browser(char *path, DIR *dir) * with it. */ ans = mallocstrcpy(ans, ""); + /* Convert newlines to nulls, just before we go to the + * directory. */ + sunder(answer); + align(&answer); + new_path = real_dir_from_tilde(answer); if (new_path[0] != '/') { diff --git a/src/files.c b/src/files.c index d027eec2..10e069eb 100644 --- a/src/files.c +++ b/src/files.c @@ -739,7 +739,7 @@ void do_insertfile( statusbar(_("Cancelled")); break; } else { - size_t pww_save = openfile->placewewant, answer_len; + size_t pww_save = openfile->placewewant; ans = mallocstrcpy(ans, answer); @@ -802,11 +802,10 @@ void do_insertfile( } #endif - answer_len = strlen(answer); - - /* Convert newlines to nulls, just before we insert a file - * or execute a command. */ + /* Convert newlines to nulls, just before we insert the file + * or execute the command. */ sunder(answer); + align(&answer); #ifndef NANO_TINY if (execute) { @@ -842,10 +841,6 @@ void do_insertfile( } #endif - /* Convert nulls to newlines. answer_len is answer's real - * length. */ - unsunder(answer, answer_len); - #ifdef ENABLE_MULTIBUFFER if (ISSET(MULTIBUFFER)) /* Update the screen to account for the current @@ -1885,18 +1880,29 @@ int do_writeout(bool exiting) #endif if (append == OVERWRITE) { - char *full_answer = get_full_path(answer); - char *full_filename = get_full_path(openfile->filename); - bool different_name = (strcmp(full_answer, - full_filename) != 0); + size_t answer_len = strlen(answer); + bool name_exists, different_name; + char *full_answer, *full_filename; struct stat st; - bool name_exists; + + /* Convert newlines to nulls, just before we get the + * full path. */ + sunder(answer); + + name_exists = (stat(answer, &st) != -1); + full_answer = get_full_path(answer); + + /* Convert nulls to newlines. answer_len is the + * string's real length. */ + unsunder(answer, answer_len); + + full_filename = get_full_path(openfile->filename); + different_name = (strcmp(full_answer, + full_filename) != 0); free(full_filename); free(full_answer); - name_exists = (stat(answer, &st) != -1); - if (different_name) { if (name_exists) { /* If we're using restricted mode, we aren't @@ -1927,6 +1933,11 @@ int do_writeout(bool exiting) } } + /* Convert newlines to nulls, just before we save the + * file. */ + sunder(answer); + align(&answer); + #ifndef NANO_TINY /* Here's where we allow the selected text to be written to * a separate file. If we're using restricted mode, this is