Description of Problem: if you edit a suid bit'ed file then open it up with /bin/vi then save the file, the suid bit gets removed. How Reproducible: I can reproduce it on a redhat 7.1 distro, that was upgraded from 6.2 I even removed vim-common and vim-minianl and re-installed it and the same thing happen.. I had to the rawhide rpm of vim (on jul 7 to get it working again) Steps to Reproduce: 1. > /tmp/a 2. chmod +s /tmp/a 3. vi /tmp/a 4. :wq 5. ls -l /tmp/a Actual Results: suid bit get removed Expected Results: no permission change Additional Information: here is the strace from vim version vim-minimal-6.0-0.27. execve("/bin/vi", ["vi", "a"], [/* 24 vars */]) = 0 uname({sys="Linux", node="dalycity", ...}) = 0 brk(0) = 0x80a79b0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=27090, ...}) = 0 old_mmap(NULL, 27090, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000 close(3) = 0 open("/lib/libtermcap.so.2", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\16\0\000"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=12120, ...}) = 0 old_mmap(NULL, 15208, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4001f000 mprotect(0x40022000, 2920, PROT_NONE) = 0 old_mmap(0x40022000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x40022000 close(3) = 0 open("/lib/libdl.so.2", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240 \0"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=79024, ...}) = 0 old_mmap(NULL, 13760, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40023000 mprotect(0x40026000, 1472, PROT_NONE) = 0 old_mmap(0x40026000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x40026000 close(3) = 0 open("/lib/i686/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\302"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=5634864, ...}) = 0 old_mmap(NULL, 1242920, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40027000 mprotect(0x4014d000, 38696, PROT_NONE) = 0 old_mmap(0x4014d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x125000) = 0x4014d000 old_mmap(0x40153000, 14120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40153000 close(3) = 0 munmap(0x40018000, 27090) = 0 getpid() = 23490 getrlimit(0x3, 0xbffff8b0) = 0 brk(0) = 0x80a79b0 brk(0x80a99c8) = 0x80a99c8 brk(0x80aa000) = 0x80aa000 sigaltstack({ss_sp=0x80a79b8, ss_flags=0, ss_size=8192}, NULL) = 0 brk(0x80ab000) = 0x80ab000 ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0 getcwd("/root", 1024) = 6 chdir("/root") = 0 getcwd("/root", 1025) = 6 chdir("/root") = 0 getrlimit(0x2, 0xbffff880) = 0 brk(0x80ac000) = 0x80ac000 getcwd("/root", 1024) = 6 stat64("a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 rt_sigaction(SIGWINCH, {0x807f5c0, [], 0x4000000}, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [WINCH], NULL, 8) = 0 rt_sigaction(SIGTSTP, {SIG_DFL}, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [TSTP], NULL, 8) = 0 rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [PIPE], NULL, 8) = 0 rt_sigaction(SIGINT, {0x807f5f0, [], 0x4000000}, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [INT], NULL, 8) = 0 rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [ALRM], NULL, 8) = 0 rt_sigaction(SIGHUP, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGQUIT, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGILL, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGTRAP, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGABRT, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGFPE, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGBUS, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGSEGV, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGUNUSED, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGTERM, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGVTALRM, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGPROF, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGXCPU, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGXFSZ, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGUSR1, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 rt_sigaction(SIGUSR2, {0x807f650, [], SA_STACK|0x4000000}, NULL, 8) = 0 ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0 open("/etc/termcap", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=729360, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000 _llseek(3, 0, [0], SEEK_SET) = 0 read(3, "######## TERMINAL TYPE DESCRIPTI"..., 4096) = 4096 read(3, "GHTS AND OTHER DELUSIONS below)."..., 4096) = 4096 read(3, "equest (equiv. to VT100/ANSI/ECM"..., 4096) = 4096 read(3, "ill merely succeed in looking li"..., 4096) = 4096 read(3, "?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;"..., 4096) = 4096 read(3, "terminal (Visual 102).\n# I would"..., 4096) = 4096 read(3, "si+idc:tc=ansi+idl:tc=ansi+rep:t"..., 4096) = 4096 read(3, " *\n# * response to user requests"..., 4096) = 4096 read(3, "c|linux console 1.3.x hack for n"..., 4096) = 4096 read(3, "%i%d;%dH:dc=\\E[P:dl=\\E[M:do=\\E[B"..., 4096) = 4096 read(3, "nces for every key-modifier comb"..., 4096) = 4096 read(3, "=\\E[0K:\\\n\t:cl=\\E[2J\\E[H:cm=\\E[%i"..., 4096) = 4096 read(3, "characters and highlights, they "..., 4096) = 4096 read(3, "[>9l:Zi=\\E[>6h:i1=\\E[0t:tc=qansi"..., 4096) = 4096 read(3, "d=\\E[1m:me=\\E[m\\017:mk=\\E[8m:\\\n\t"..., 4096) = 4096 read(3, "\t:DL=\\E[%dM:DO=\\E[%dB:F1=\\E[W:F2"..., 4096) = 4096 read(3, "ditional console features\n# list"..., 4096) = 4096 read(3, " operate\n# in two different mode"..., 4096) = 4096 read(3, "mooth | 1-"..., 4096) = 4096 close(3) = 0 munmap(0x40018000, 4096) = 0 ioctl(0, TIOCGWINSZ, {ws_row=62, ws_col=132, ws_xpixel=0, ws_ypixel=0}) = 0 ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(1, TIOCGWINSZ, {ws_row=62, ws_col=132, ws_xpixel=0, ws_ypixel=0}) = 0 brk(0x80af000) = 0x80af000 brk(0x80b2000) = 0x80b2000 ioctl(1, TIOCGWINSZ, {ws_row=62, ws_col=132, ws_xpixel=0, ws_ypixel=0}) = 0 open("/usr/share/vim/vim60z/macros/vimrc", O_RDONLY|O_LARGEFILE) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=3589, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000 read(3, "if v:lang =~ \"^ko\"\n set fileen"..., 4096) = 3589 read(3, "", 4096) = 0 read(3, "", 4096) = 0 close(3) = 0 munmap(0x40018000, 4096) = 0 open("/root/.vimrc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open("/root/_vimrc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open("/root/.exrc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(0, SNDCTL_TMR_START, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(0, TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 write(1, "\33[?1h\33=", 7) = 7 brk(0x80b4000) = 0x80b4000 getuid32() = 0 socket(PF_UNIX, SOCK_STREAM, 0) = 3 connect(3, {sin_family=AF_UNIX, path=" /var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory) close(3) = 0 open("/etc/nsswitch.conf", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=1680, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000 read(3, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1680 read(3, "", 4096) = 0 close(3) = 0 munmap(0x40018000, 4096) = 0 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=27090, ...}) = 0 old_mmap(NULL, 27090, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000 close(3) = 0 open("/lib/libnss_files.so.2", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\"\0\000"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=275531, ...}) = 0 old_mmap(NULL, 43432, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40157000 mprotect(0x40161000, 2472, PROT_NONE) = 0 old_mmap(0x40161000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x40161000 close(3) = 0 munmap(0x40018000, 27090) = 0 open("/etc/passwd", O_RDONLY) = 3 fcntl64(3, F_GETFD) = 0 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 fstat64(3, {st_mode=S_IFREG|0644, st_size=145113, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000 read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 4096 close(3) = 0 munmap(0x40018000, 4096) = 0 stat64("/root/a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 uname({sys="Linux", node="dalycity", ...}) = 0 getpid() = 23490 brk(0x80b6000) = 0x80b6000 stat64("a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 stat64("a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 access("a", W_OK) = 0 open("a", O_RDONLY|O_LARGEFILE) = 3 open(".a.swp", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open(".a.swp", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4 open(".a.swpx", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open(".a.swpx", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 5 fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 fstat64(5, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 close(5) = 0 unlink(".a.swpx") = 0 close(4) = 0 unlink(".a.swp") = 0 stat64(".a.swp", 0xbffff1f0) = -1 ENOENT (No such file or directory) getcwd("/root", 1024) = 6 open(".a.swp", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4 _llseek(4, 0, [0], SEEK_SET) = 0 write(4, "b0VIM 6.0z\0\0\0\20\0\0\217\314G;:P\37\0\302[\0\0root"..., 4096) = 4096 write(1, "\33[1;62r\33[H\33[J\33[62;1H\"a\"", 23) = 23 brk(0x80c7000) = 0x80c7000 read(3, "ssdasdasddas\n", 65536) = 13 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) brk(0x80d8000) = 0x80d8000 read(3, "", 65536) = 0 close(3) = 0 write(1, " 1L, 13C", 8) = 8 getcwd("/root", 1024) = 6 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\33[1;1Hssdasdasddas\r\n\33[1m~\r\n~\r\n~\r"..., 208) = 208 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {2, 350000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "i", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\33[62;1H-- INSERT --", 19) = 19 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\33[1;1H", 6) = 6 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 780000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "a", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) _llseek(4, 0, [0], SEEK_SET) = 0 write(4, "b0VIM 6.0z\0\0\0\20\0\0\217\314G;:P\37\0\302[\0\0root"..., 4096) = 4096 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\33[m\17assdasdasddas\ra", 19) = 19 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 810000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "a", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "assdasdasddas\raa", 16) = 16 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 800000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "a", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "assdasdasddas\raaa", 17) = 17 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 710000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "\33", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 25000}) = 0 (Timeout) write(1, "\33[62;1H\33[K\33[1;3H", 16) = 16 select(1, [0], NULL, [0], {1, 0}) = 1 (in [0], left {0, 850000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "\33", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {1, 0}) = 1 (in [0], left {0, 720000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, ":", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\7\33[62;1H:", 9) = 9 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 810000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "w", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "w", 1) = 1 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 920000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "q", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "q", 1) = 1 select(1, [0], NULL, [0], {4, 0}) = 1 (in [0], left {3, 610000}) select(1, [0], NULL, [0], NULL) = 1 (in [0]) read(0, "\r", 250) = 1 select(1, [0], NULL, [0], {0, 0}) = 0 (Timeout) write(1, "\r", 1) = 1 ioctl(0, SNDCTL_TMR_START, {B38400 opost isig icanon echo ...}) = 0 ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(1, "\"a\"", 3) = 3 stat64("a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 lstat64("a", {st_mode=S_IFREG|S_ISUID|S_ISGID|0755, st_size=13, ...}) = 0 stat64("4913", 0xbffff4d0) = -1 ENOENT (No such file or directory) open("4913", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0106755) = 3 close(3) = 0 chown32("4913", 0, 0) = 0 stat64("4913", {st_mode=S_IFREG|0755, st_size=0, ...}) = 0 unlink("4913") = 0 stat64("a~", 0xbffff380) = -1 ENOENT (No such file or directory) unlink("a~") = -1 ENOENT (No such file or directory) rename("a", "a~") = 0 open("a", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 write(3, "aaassdasdasddas\n", 16) = 16 close(3) = 0 chmod("a", 0106755) = 0 chown32("a", 0, 0) = 0 write(1, " 1L, 16C written", 16) = 16 _llseek(4, 0, [0], SEEK_SET) = 0 write(4, "b0VIM 6.0z\0\0\0\20\0\0\217\314G;:P\37\0\302[\0\0root"..., 4096) = 4096 unlink("a~") = 0 write(1, "\r\33[?1l\33>", 8) = 8 write(1, "\r\n", 2) = 2 close(4) = 0 unlink(".a.swp") = 0 brk(0x80b8000) = 0x80b8000 _exit(0) = ?
Fixed in the current version.