nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 8d31ad8a705ea2b94bafb61c75cc47d88b63a103
parent 3480518a5ce1232e005ff4907599193c1ff8394f
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Thu, 28 May 2020 14:15:40 +0200

files: ignore errors when calling chmod() on a backup file

First, it is very unlikely that chmod() would fail as the user just
created the file herself.  Second, even if chmod() would fail, this
is not a problem, because we have created the file with read+write
permissions for the owner only, so the file cannot accidentally be
left accessible to unintended others.

But most of all, such a failure should not stop nano from trying to
write the backup file.  Only when the actual *writing* fails, should
we bother the user with a prompt.

Diffstat:
Msrc/files.c | 17+++++------------
1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/files.c b/src/files.c @@ -1666,7 +1666,7 @@ bool write_file(const char *name, FILE *thefile, bool tmp, backup_cflags = O_WRONLY | O_CREAT | O_EXCL; /* Create the backup file (or truncate the existing one). */ - backup_fd = open(backupname, backup_cflags, RW_FOR_ALL); + backup_fd = open(backupname, backup_cflags, S_IRUSR|S_IWUSR); if (backup_fd >= 0) backup_file = fdopen(backup_fd, "wb"); @@ -1683,17 +1683,10 @@ bool write_file(const char *name, FILE *thefile, bool tmp, IGNORE_CALL_RESULT(fchown(backup_fd, openfile->current_stat->st_uid, openfile->current_stat->st_gid)); - /* Set the backup's mode bits. */ - if (fchmod(backup_fd, openfile->current_stat->st_mode) == -1 && - !ISSET(INSECURE_BACKUP)) { - fclose(backup_file); - if (prompt_failed_backupwrite(backupname)) - goto skip_backup; - statusline(HUSH, _("Error writing backup file %s: %s"), - backupname, strerror(errno)); - free(backupname); - goto cleanup_and_exit; - } + /* Set the backup's permissions to those of the original file. + * It is not a security issue if this fails, as we have created + * the file with just read and write permission for the owner. */ + IGNORE_CALL_RESULT(fchmod(backup_fd, openfile->current_stat->st_mode)); /* Copy the existing file to the backup. */ verdict = copy_file(original, backup_file, FALSE);