You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Branko Čibej <br...@xbc.nu> on 2002/04/22 00:26:55 UTC

Re: cvs commit: apr/include apr_errno.h

William A. Rowe, Jr. wrote:

> At 09:32 AM 4/16/2002, you wrote:
>
>> brane       02/04/16 07:32:03
>>
>>   Modified:    include  apr_errno.h
>>   Log:
>>   On Windows, ERROR_PATH_NOT_FOUND is an ENOENT, not an ENOTDIR -- 
>> same as OS/2.
>
>
> I'm somewhat dubious of this change.  Can you please point to the use 
> case
> (a specific scenario) that this existing define misbehaved?  The 
> greatest risk is
> that Apache -needs- to see ENOTDIR in the right times to avoid a ton 
> of extra
> effort, but most importantly, to make the right security decisions on 
> errors.
>
> Bill
>

I finally got some time to write a small test program, to compare the 
errors returned on Windows an Unix for various operations on 
(nonexistent) files and directories. The Unix variants I tried were 
HP-UX 10.20 and Solaris 7, where results were identical. I'm attaching 
the program itself and raw HP-UX and Win32 results.


First, the more interesting differences

    * open dir: Unix: SUCCESS, Windows: EACCES
      Not much can be done about this, and I don't think we should. This
      is a basic difference between the OS's. (Actually, you *can* open
      a directory as a file on Windows, but it's not something you'd
      want to do in normal circumstances. Well, you wouldn't want to do
      it on Unix in normal circumstances, either ...)

    * remove dir: Unix EPERM, Windows EACCES
      Basically the same result; I wonder, though, if it would make
      sense to include EPERM in APR_STATUS_IS_EACCES?

    * rmdir file: Unix ENOTDIR, Windows ERROR_DIRECTORY
      That's "The directory name is invalid" on Windows. Perhaps this
      code should be included in APR_STATUS_IS_ENOTDIR?


Now, the cases where the Unix status is ENOENT and the Windows status is 
ENOTDIR:

    open under noex
    mkdir under noex
    stat under noex
    remove under noex
    rmdir under noex

These are all tests where the parameter is a path (i.e., contains at 
least one path separator), and one of the components doesn't exist; this 
is what originally prompted me to make the change -- too hastily, I admit.

But it's exactly such cases that are giving me grief in Subversion on 
Windows, so I've been thinking what to do about them. Trying to get 100% 
correct codes would be a pain, because every time you got an 
ERROR_PATH_NOT_FOUND, you'd have to do a lot of extra stats. OTOH, if 
you want to make security decisions, you'd better have correct error 
information in the first place.

There's another, less clean solution: to include ERROR_PATH_NOT_FOUND in 
*both* APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR. This would fix 
the particular problem I'm having in Subversion, but might be a major 
PITA in other ways I'm not aware of.

Suggestions?

-- 
Brane Čibej   <br...@xbc.nu>   http://www.xbc.nu/brane/