2.2.19: inconsistency between sys_utime and sys_utimes

From: Kai Großjohann (Kai.Grossjohann@CS.Uni-Dortmund.DE)
Date: Sun Apr 22 2001 - 14:44:21 EST


In fs/open.c I see the following code in sys_utime in case the struct
utimbuf * is NULL:

                if (current->fsuid != inode->i_uid &&
                    (error = permission(inode,MAY_WRITE)) != 0)
                        goto dput_and_out;

In sys_utimes, there is a similar piece of code in case the struct
timeval * is NULL:

                if ((error = permission(inode,MAY_WRITE)) != 0)
                        goto dput_and_out;

Is this intentional?

I'm very much a newbie with respect to the kernel internals, but I
observe the following behavior: calling `touch' on my own file on an
NFS mounted directory works nicely. However, if I don't own the file,
only have write permissions to it and the containing directory due to
being in the right group and the file (and directory) having g+w
permissions, then I see this:

/----
| grossjoh@lucy> strace touch xxirql.bbl
| execve("/usr/bin/touch", ["touch", "xxirql.bbl"], [/* 86 vars */]) = 0
| brk(0) = 0x804e5c8
| open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
| open("/usr/sw/pilot/null.0/lib/i686/mmx/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| stat("/usr/sw/pilot/null.0/lib/i686/mmx", 0xbfffe6e4) = -1 ENOENT (No such file or directory)
| open("/usr/sw/pilot/null.0/lib/i686/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| stat("/usr/sw/pilot/null.0/lib/i686", 0xbfffe6e4) = -1 ENOENT (No such file or directory)
| open("/usr/sw/pilot/null.0/lib/mmx/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| stat("/usr/sw/pilot/null.0/lib/mmx", 0xbfffe6e4) = -1 ENOENT (No such file or directory)
| open("/usr/sw/pilot/null.0/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| stat("/usr/sw/pilot/null.0/lib", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
| open("i686/mmx/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| open("i686/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| open("mmx/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| open("libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
| open("/etc/ld.so.cache", O_RDONLY) = 3
| fstat(3, {st_mode=S_IFREG|0644, st_size=24988, ...}) = 0
| old_mmap(NULL, 24988, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40014000
| close(3) = 0
| open("/lib/libc.so.6", O_RDONLY) = 3
| fstat(3, {st_mode=S_IFREG|0755, st_size=887712, ...}) = 0
| read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\244\213"..., 4096) = 4096
| old_mmap(NULL, 902044, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4001b000
| mprotect(0x400f0000, 29596, PROT_NONE) = 0
| old_mmap(0x400f0000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd4000) = 0x400f0000
| old_mmap(0x400f4000, 13212, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400f4000
| close(3) = 0
| old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x400f8000
| munmap(0x40014000, 24988) = 0
| getpid() = 25522
| brk(0) = 0x804e5c8
| brk(0x804e600) = 0x804e600
| brk(0x804f000) = 0x804f000
| open("xxirql.bbl", O_WRONLY|O_CREAT|0x8000, 0666) = 3
| close(3) = 0
| utime("xxirql.bbl", NULL) = -1 EPERM (Operation not permitted)
| write(2, "touch: ", 7touch: ) = 7
| write(2, "xxirql.bbl", 10xxirql.bbl) = 10
| write(2, ": Operation not permitted", 25: Operation not permitted) = 25
| write(2, "\n", 1
| ) = 1
| _exit(1) = ?
\----

Note how utime tells me the operation is not permitted, yet:

/----
| grossjoh@lucy> ls -ld . xxirql.bbl
| drwxrws--- 4 fuhr crew 1024 Apr 20 19:08 .
| -rw-rw---- 1 fuhr crew 5081 Mar 30 16:42 xxirql.bbl
| grossjoh@lucy> groups
| crew dialout floppy medoc cyclades mind teaching exam secware system software cvs_rcp ncstrl bibdb research wwwadm carmen daffodil
\----

... I can write to the file because I'm in the right group.

This behavior seems counter-intuitive.

Thanks,
kai

-- 
The passive voice should never be used.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Apr 23 2001 - 21:00:43 EST