Small fix for GetCurrentDirectoryA()

Felix Nawothnig felix.nawothnig at t-online.de
Fri Jun 10 04:02:00 CDT 2005


Andreas Mohr wrote:
> Does Win9x GetCurrentDirectoryA() really use an IsBadWritePtr to protect
> against invalid output buffers?
> Somehow I slightly doubt it...
> (IsBadWritePtr isn't the fastest thing in the world...)

Well, no. Looking at the disassembly it does about this:

static WINE_EXCEPTION_FILTER(foo)
{
     if(GetExceptionCode() & 6)
         return EXCEPTION_EXECUTE_HANDLER;
     else
         return EXCEPTION_CONTINUE_SEARCH;
}

UINT WINAPI GetCurrentDirectoryA( UINT buflen, LPSTR buf )
{
   if(buflen > 0)
   {
     __TRY {
       buf[0] += 0;
       buf[buflen] += 0;
     } __EXCEPT(foo) {
       SetLastError(ERROR_INVALID_PARAMETER);
       return 0;
     }
   }

    ...
}

But does the speed-difference really matter for GetCurrentDirectoryA()?

> Aren't you  covering up a previous bug with buffer allocation or so?

No. WaveMix v1.72 tries to do:

CHAR buf[MAX_PATH];
lstrcpyA(buf + GetCurrentDirectoryA(buf, sizeof(buf)), "\WAVEMIX.INI");
/* sic, they got the argument order wrong */

and since GetCurrentDirectoryA() returns 0 on failure (on Win9x) they 
end up with "\WAVEMIX.INI"...

On WinXP it crashes just as in Wine but since we strive for 
bug-compatibility...

-flx



More information about the wine-devel mailing list