0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.0.1287: temp file used for viminfo may have wrong permissions

Problem:    The temp file used when updating the viminfo file may have the
            wrong permissions if setting the group fails.
Solution:   Check if the group matches and reduce permissions if not.
This commit is contained in:
Bram Moolenaar
2017-11-11 16:45:19 +01:00
parent 5fd8b78214
commit aeeb6888ca
2 changed files with 26 additions and 5 deletions

View File

@@ -2007,7 +2007,8 @@ write_viminfo(char_u *file, int forceit)
/* /*
* If we can't create in the same directory, try creating a * If we can't create in the same directory, try creating a
* "normal" temp file. * "normal" temp file. This is just an attempt, renaming the temp
* file might fail as well.
*/ */
if (fp_out == NULL) if (fp_out == NULL)
{ {
@@ -2018,11 +2019,29 @@ write_viminfo(char_u *file, int forceit)
#if defined(UNIX) && defined(HAVE_FCHOWN) #if defined(UNIX) && defined(HAVE_FCHOWN)
/* /*
* Make sure the owner can read/write it. This only works for * Make sure the original owner can read/write the tempfile and
* root. * otherwise preserve permissions, making sure the group matches.
*/ */
if (fp_out != NULL) if (fp_out != NULL)
ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); {
stat_T tmp_st;
if (mch_stat((char *)tempname, &tmp_st) >= 0)
{
if (st_old.st_uid != tmp_st.st_uid)
/* Changing the owner might fail, in which case the
* file will now owned by the current user, oh well. */
ignored = fchown(fileno(fp_out), st_old.st_uid, -1);
if (st_old.st_gid != tmp_st.st_gid
&& fchown(fileno(fp_out), -1, st_old.st_gid) == -1)
/* can't set the group to what it should be, remove
* group permissions */
(void)mch_setperm(tempname, 0600);
}
else
/* can't stat the file, set conservative permissions */
(void)mch_setperm(tempname, 0600);
}
#endif #endif
} }
} }
@@ -7536,7 +7555,7 @@ ex_sign(exarg_T *eap)
int idx; int idx;
sign_T *sp; sign_T *sp;
sign_T *sp_prev; sign_T *sp_prev;
buf_T *buf; buf_T *buf = NULL;
/* Parse the subcommand. */ /* Parse the subcommand. */
p = skiptowhite(arg); p = skiptowhite(arg);

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1287,
/**/ /**/
1286, 1286,
/**/ /**/