On Sat, Jun 6, 2020, at 2:25 PM, Charles Forsyth wrote:
> execute permission on files, meaning here non-directories, is a special 
> variant of read. a file with mode 0111 can be opened with OEXEC and read(2) 
> will work as well as exec(2),
> but can't be opened with OREAD, because it's not got any of 0444 set. bits 
> 0111 distinguish a file with contents that are intended to be executed once 
> read from files with only 0444 that do not contain executable content.
> you wouldn't want every readable file to be executable (especially if you've 
> used systems that didn't have that distinction).
> on the other hand, in a distributed file system, the client needs the 
> contents of the file to run it (whether code or #!script) so it needs to be 
> able to read files with just OEXEC.
> I suppose the rule could have been that it would need mode 5 (r+x) to make 
> clear that the file was also readable, but it isn't.
> 
> that OEXEC allows reading isn't true for a directory because exec means 
> "search", so if it's mode 0111 (say) you can chdir into it but not read the 
> names within it.
> if you know a name of a file in that directory, though, you can still open 
> that. that's entirely enforced by the server.
> 
> as the bug in access(2) suggests, only the server knows whether access should 
> be granted, and the open call gets it to do that,
> but it doesn't work for OEXEC for directories as others have noted. perhaps 
> stat+chdir is the most accurate test, since you need x (search) permission to 
> walk(5) into a directory,
> but the caller won't thank you for the chdir (and there's no easy or certain 
> way back), and ... that restriction isn't enforced by fossil or ramfs. (ramfs 
> wrongly allows you to read a directory that's mode 0.)
> 
> probably the best thing is just to ignore the owner/group/other distinction, 
> and if the open(...OEXEC) fails, dirstat it, and if it's a directory with any 
> of 0111 set, it's fine (a little better than now).

thanks for the analysis, charles. the dirstat you suggest wouldn't do any good 
for my case because rc-httpd runs as user none. the common problem it's trying 
to catch is a directory which isn't world-readable & world-searchable. 770 750 
and 700 are common permissions. perhaps i should have rc-httpd just run the 
commands and test their status rather than trying to test ahead of time, but 
this would somewhat spoil the neat and simple design.

------------------------------------------
9fans: 9fans
Permalink: 
https://9fans.topicbox.com/groups/9fans/Tdd7a9b1b32d01f54-M84c47e7be623cb8feb49865e
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

Reply via email to