diff options
-rw-r--r-- | src/history.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/history.cpp b/src/history.cpp index c526eb39..5d9528b2 100644 --- a/src/history.cpp +++ b/src/history.cpp @@ -1443,6 +1443,20 @@ bool history_t::save_internal_via_rewrite() else { wcstring new_name = history_filename(name, wcstring()); + + /* Ensure we maintain the ownership and permissions of the original (#2355). + * If the stat fails, we assume (hope) our default permissions are correct. This + * corresponds to e.g. someone running sudo -E as the very first command. If they + * did, it would be tricky to set the permissions correctly. (bash doesn't get this + * case right either). */ + struct stat sbuf; + if (wstat(new_name, &sbuf) >= 0) + { + /* Success */ + fchown(out_fd, sbuf.st_uid, sbuf.st_gid); + fchmod(out_fd, sbuf.st_mode); + } + if (0 > wrename(tmp_name, new_name)) { debug(2, L"Error when renaming history file"); |