Commit 461519cc authored by Chris Allegretta's avatar Chris Allegretta
Browse files

Add more inseure backup checks to that strange cases like with ACLs will work...

Add more inseure backup checks to that strange cases like with ACLs will work with allow_insecure_backup.



git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4509 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
parent 0acca27a
Showing with 17 additions and 9 deletions
+17 -9
...@@ -1458,6 +1458,7 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type ...@@ -1458,6 +1458,7 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type
/* The actual file, realname, we are writing to. */ /* The actual file, realname, we are writing to. */
char *tempname = NULL; char *tempname = NULL;
/* The temp file name we write to on prepend. */ /* The temp file name we write to on prepend. */
int backup_cflags;
assert(name != NULL); assert(name != NULL);
...@@ -1592,14 +1593,19 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type ...@@ -1592,14 +1593,19 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type
/* First, unlink any existing backups. Next, open the backup /* First, unlink any existing backups. Next, open the backup
file with O_CREAT and O_EXCL. If it succeeds, we file with O_CREAT and O_EXCL. If it succeeds, we
have a file descriptor to a new backup file. */ have a file descriptor to a new backup file. */
if (unlink(backupname) < 0 && errno != ENOENT) { if (unlink(backupname) < 0 && errno != ENOENT && !ISSET(INSECURE_BACKUP)) {
statusbar(_("Error writing backup file %s: %s"), backupname, statusbar(_("Error writing backup file %s: %s"), backupname,
strerror(errno)); strerror(errno));
free(backupname); free(backupname);
goto cleanup_and_exit; goto cleanup_and_exit;
} }
backup_fd = open(backupname, O_WRONLY | O_CREAT | O_EXCL | O_APPEND, if (ISSET(INSECURE_BACKUP))
backup_cflags = O_WRONLY | O_CREAT | O_APPEND;
else
backup_cflags = O_WRONLY | O_CREAT | O_EXCL | O_APPEND;
backup_fd = open(backupname, backup_cflags,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
/* Now we've got a safe file stream. If the previous open() /* Now we've got a safe file stream. If the previous open()
call failed, this will return NULL. */ call failed, this will return NULL. */
...@@ -1643,14 +1649,16 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type ...@@ -1643,14 +1649,16 @@ bool write_file(const char *name, FILE *f_open, bool tmp, append_type
/* Copy the file. */ /* Copy the file. */
copy_status = copy_file(f, backup_file); copy_status = copy_file(f, backup_file);
/* And set its metadata. */ if (copy_status != 0) {
if (copy_status != 0 || utime(backupname, &filetime) == -1) { statusbar(_("Error reading %s: %s"), realname,
if (copy_status == -1) {
statusbar(_("Error reading %s: %s"), realname,
strerror(errno)); strerror(errno));
beep(); beep();
} else goto cleanup_and_exit;
statusbar(_("Error writing backup file %s: %s"), backupname, }
/* And set its metadata. */
if (utime(backupname, &filetime) == -1 && !ISSET(INSECURE_BACKUP)) {
statusbar(_("Error writing backup file %s: %s"), backupname,
strerror(errno)); strerror(errno));
/* If we can't write to the backup, DONT go on, since /* If we can't write to the backup, DONT go on, since
whatever caused the backup file to fail (e.g. disk whatever caused the backup file to fail (e.g. disk
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment