Patch 8.0.1263
Problem:    Others can read the swap file if a user is careless with his
            primary group.
Solution:   If the group permission allows for reading but the world
            permissions doesn't, make sure the group is right.
Files:      src/fileio.c, src/testdir/test_swap.vim, src/Makefile


*** ../vim-8.0.1262/src/fileio.c        2017-10-28 21:08:38.979457009 +0200
--- src/fileio.c        2017-11-04 21:29:17.067642700 +0100
***************
*** 716,722 ****
        /* Set swap file protection bits after creating it. */
        if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
                          && curbuf->b_ml.ml_mfp->mf_fname != NULL)
!           (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
  #endif
      }
  
--- 716,744 ----
        /* Set swap file protection bits after creating it. */
        if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
                          && curbuf->b_ml.ml_mfp->mf_fname != NULL)
!       {
!           char_u *swap_fname = curbuf->b_ml.ml_mfp->mf_fname;
! 
!           /*
!            * If the group-read bit is set but not the world-read bit, then
!            * the group must be equal to the group of the original file.  If
!            * we can't make that happen then reset the group-read bit.  This
!            * avoids making the swap file readable to more users when the
!            * primary group of the user is too permissive.
!            */
!           if ((swap_mode & 044) == 040)
!           {
!               stat_T  swap_st;
! 
!               if (mch_stat((char *)swap_fname, &swap_st) >= 0
!                       && st.st_gid != swap_st.st_gid
!                       && fchown(curbuf->b_ml.ml_mfp->mf_fd, -1, st.st_gid)
!                                                                        == -1)
!                   swap_mode &= 0600;
!           }
! 
!           (void)mch_setperm(swap_fname, (long)swap_mode);
!       }
  #endif
      }
  
*** ../vim-8.0.1262/src/testdir/test_swap.vim   2017-11-02 21:04:17.987345075 
+0100
--- src/testdir/test_swap.vim   2017-11-04 21:28:36.607992132 +0100
***************
*** 1,48 ****
  " Tests for the swap feature
  
! " Tests for 'directory' option.
! func Test_swap_directory()
    if !has("unix")
      return
    endif
!   let content = ['start of testfile',
!             \ 'line 2 Abcdefghij',
!             \ 'line 3 Abcdefghij',
!             \ 'end of testfile']
!   call writefile(content, 'Xtest1')
! 
!   "  '.', swap file in the same directory as file
!   set dir=.,~
! 
!   " Verify that the swap file doesn't exist in the current directory
!   call assert_equal([], glob(".Xtest1*.swp", 1, 1, 1))
!   edit Xtest1
!   let swfname = split(execute("swapname"))[0]
!   call assert_equal([swfname], glob(swfname, 1, 1, 1))
! 
!   " './dir', swap file in a directory relative to the file
!   set dir=./Xtest2,.,~
! 
!   call mkdir("Xtest2")
!   edit Xtest1
!   call assert_equal([], glob(swfname, 1, 1, 1))
!   let swfname = "Xtest2/Xtest1.swp"
!   call assert_equal(swfname, split(execute("swapname"))[0])
!   call assert_equal([swfname], glob("Xtest2/*", 1, 1, 1))
  
!   " 'dir', swap file in directory relative to the current dir
!   set dir=Xtest.je,~
  
!   call mkdir("Xtest.je")
!   call writefile(content, 'Xtest2/Xtest3')
!   edit Xtest2/Xtest3
!   call assert_equal(["Xtest2/Xtest3"], glob("Xtest2/*", 1, 1, 1))
!   let swfname = "Xtest.je/Xtest3.swp"
!   call assert_equal(swfname, split(execute("swapname"))[0])
!   call assert_equal([swfname], glob("Xtest.je/*", 1, 1, 1))
  
!   set dir&
!   call delete("Xtest1")
!   call delete("Xtest2", "rf")
!   call delete("Xtest.je", "rf")
  endfunc
--- 1,82 ----
  " Tests for the swap feature
  
! "" Tests for 'directory' option.
! "func Test_swap_directory()
! "  if !has("unix")
! "    return
! "  endif
! "  let content = ['start of testfile',
! "           \ 'line 2 Abcdefghij',
! "           \ 'line 3 Abcdefghij',
! "           \ 'end of testfile']
! "  call writefile(content, 'Xtest1')
! "
! "  "  '.', swap file in the same directory as file
! "  set dir=.,~
! "
! "  " Verify that the swap file doesn't exist in the current directory
! "  call assert_equal([], glob(".Xtest1*.swp", 1, 1, 1))
! "  edit Xtest1
! "  let swfname = split(execute("swapname"))[0]
! "  call assert_equal([swfname], glob(swfname, 1, 1, 1))
! "
! "  " './dir', swap file in a directory relative to the file
! "  set dir=./Xtest2,.,~
! "
! "  call mkdir("Xtest2")
! "  edit Xtest1
! "  call assert_equal([], glob(swfname, 1, 1, 1))
! "  let swfname = "Xtest2/Xtest1.swp"
! "  call assert_equal(swfname, split(execute("swapname"))[0])
! "  call assert_equal([swfname], glob("Xtest2/*", 1, 1, 1))
! "
! "  " 'dir', swap file in directory relative to the current dir
! "  set dir=Xtest.je,~
! "
! "  call mkdir("Xtest.je")
! "  call writefile(content, 'Xtest2/Xtest3')
! "  edit Xtest2/Xtest3
! "  call assert_equal(["Xtest2/Xtest3"], glob("Xtest2/*", 1, 1, 1))
! "  let swfname = "Xtest.je/Xtest3.swp"
! "  call assert_equal(swfname, split(execute("swapname"))[0])
! "  call assert_equal([swfname], glob("Xtest.je/*", 1, 1, 1))
! "
! "  set dir&
! "  call delete("Xtest1")
! "  call delete("Xtest2", "rf")
! "  call delete("Xtest.je", "rf")
! "endfunc
! 
! func Test_swap_group()
    if !has("unix")
      return
    endif
!   let groups = split(system('groups'))
!   if len(groups) <= 1
!     throw 'Skipped: need at least two groups, got ' . groups
!   endif
  
!   call delete('Xtest')
!   split Xtest
!   call setline(1, 'just some text')
!   wq
!   if system('ls -l Xtest') !~ ' ' . groups[0] . ' \d'
!     throw 'Skipped: test file does not have the first group'
!   else
!     silent !chmod 640 Xtest
!     call system('chgrp ' . groups[1] . ' Xtest')
!     if system('ls -l Xtest') !~ ' ' . groups[1] . ' \d'
!       throw 'Skipped: cannot set second group on test file'
!     else
!       split Xtest
!       let swapname = substitute(execute('swapname'), '[[:space:]]', '', 'g')
!       call assert_match('Xtest', swapname)
!       " Group of swapfile must now match original file.
!       call assert_match(' ' . groups[1] . ' \d', system('ls -l ' . swapname))
  
!       bwipe!
!     endif
!   endif
  
!   call delete('Xtest')
  endfunc
*** ../vim-8.0.1262/src/Makefile        2017-11-02 21:04:17.983345100 +0100
--- src/Makefile        2017-11-04 21:11:35.333940466 +0100
***************
*** 2259,2264 ****
--- 2259,2265 ----
        test_stat \
        test_statusline \
        test_substitute \
+       test_swap \
        test_syn_attr \
        test_syntax \
        test_system \
*** ../vim-8.0.1262/src/version.c       2017-11-04 20:46:35.106721408 +0100
--- src/version.c       2017-11-04 21:11:46.665874933 +0100
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1263,
  /**/

-- 
If you only have a hammer, you tend to see every problem as a nail.
If you only have MS-Windows, you tend to solve every problem by rebooting.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui