diff --git a/ChangeLog b/ChangeLog index f971bb15..2bdf16d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ CVS code - - For consistency, when saving a file with no name, don't allow overwriting an existing file when in restricted mode. (DLR) + - Fix problem where a file could sometimes be overwritten + without a warning prompt. (DLR) GNU nano 2.0.0 - 2006.11.06 - General: diff --git a/src/files.c b/src/files.c index 25c33620..210ae60c 100644 --- a/src/files.c +++ b/src/files.c @@ -1867,42 +1867,53 @@ int do_writeout(bool exiting) break; } #endif - if (append == OVERWRITE && strcmp(answer, - openfile->filename) != 0) { - struct stat st; - if (stat(answer, &st) != -1) { - /* If we're using restricted mode, we aren't allowed - * to save a new file under the name of an existing - * file. In this case, show a "File exists" - * error. */ - if (ISSET(RESTRICTED)) { - errno = EEXIST; - statusbar(_("Error writing %s: %s"), answer, + 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); + struct stat st; + bool name_exists = (stat(full_answer, &st) != -1); + + free(full_filename); + free(full_answer); + + if (different_name) { + if (name_exists) { + /* If we're using restricted mode, we aren't + * allowed to save a new file under the name of + * an existing file. In this case, show a "File + * exists" error. */ + if (ISSET(RESTRICTED)) { + errno = EEXIST; + statusbar(_("Error writing %s: %s"), answer, strerror(errno)); - retval = -1; - break; - } else { - i = do_yesno_prompt(FALSE, + retval = -1; + break; + } else { + i = do_yesno_prompt(FALSE, _("File exists, OVERWRITE ? ")); - if (i == 0 || i == -1) - continue; - } - /* If we're using restricted mode, we aren't allowed to - * change the name of a file once it has one, because - * that would allow reading from or writing to files not - * specified on the command line. In this case, don't - * bother showing the "Different Name" prompt. */ - } else if (!ISSET(RESTRICTED) && + if (i == 0 || i == -1) + continue; + } + /* If we're using restricted mode, we aren't allowed + * to change the name of a file once it has one, + * because that would allow reading from or writing + * to files not specified on the command line. In + * this case, don't bother showing the "Different + * Name" prompt. */ + } else if (!ISSET(RESTRICTED) && openfile->filename[0] != '\0' #ifndef NANO_TINY && (exiting || !openfile->mark_set) #endif ) { - i = do_yesno_prompt(FALSE, - _("Save file under DIFFERENT NAME ? ")); - if (i == 0 || i == -1) - continue; + i = do_yesno_prompt(FALSE, + _("Save file under DIFFERENT NAME ? ")); + if (i == 0 || i == -1) + continue; + } } }