I was looking at the source code to the which(1) command (apt-get source 
which = which-2.14 ).

As you might imagine, which(1) prepends the path to a name, checks if 
it exists and then checks if it's executable by the current process 
(your uid).

In the which package is a file "bash.c" that contains the following 
code.  At this point the file has been found and now it's just checking 
permissions.

  /* If we are the owner of the file, the owner execute bit applies. */
  if (user_id == finfo.st_uid && X_BIT (u_mode_bits (finfo.st_mode)))
    return (FS_EXISTS | FS_EXECABLE);

  /* If we are in the owning group, the group permissions apply. */
  if (group_member (finfo.st_gid) && X_BIT (g_mode_bits (finfo.st_mode)))
    return (FS_EXISTS | FS_EXECABLE);

  /* If `others' have execute permission to the file, then so do we,
     since we are also `others'. */
  if (X_BIT (o_mode_bits (finfo.st_mode)))
    return (FS_EXISTS | FS_EXECABLE);
  else
    return (FS_EXISTS);

This seems wrong, if I understand Linux permissions correctly.  If you 
are the *owner* of a file, then it's the *owner* permissions that count.  
If the owner perms say you can't read it then it doesn't matter what the 
group and other perms are.

In that code above if you are the owner but don't have execute perms 
then it moves onto checking the group perms, and then "other" perms.

Am I crazy is is that code wrong?


[EMAIL PROTECTED]:~$ cat t.c
#include <stdio.h>
int main( void )
{
   printf("hello world\n"); 
   return 0;
}

[EMAIL PROTECTED]:~$ gcc -o t t.c

[EMAIL PROTECTED]:~$ chmod 755 t

[EMAIL PROTECTED]:~$ ./t
hello world

[EMAIL PROTECTED]:~$ chmod 655 t

[EMAIL PROTECTED]:~$ ./t
bash: ./t: Permission denied

[EMAIL PROTECTED]:~$ ls -l t
-rw-r-xr-x    1 moseley  moseley      4161 2003-09-04 21:42 t



-- 
Bill Moseley
[EMAIL PROTECTED]


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED] 
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to