On Saturday 17 January 2026 12:53:28 Pali Rohár wrote:
> On Thursday 15 January 2026 11:21:05 LIU Hao wrote:
> > 在 2025-12-20 00:38, Pali Rohár 写道:
> > > msvcrt _fstat function is broken and for directory fd it returns S_ISREG
> > > type. 32-bit pre-msvcr110 _fstat does not properly signal size overflow.
> > > UCRT seems to work correctly.
> > > 
> > > Add mingw-w64 fstat wrappers around msvcrt _fstat functions which change
> > > S_IFMT to S_IFDIR if winapi filehandle has FILE_ATTRIBUTE_DIRECTORY
> > > attribute set. Provide wrapper for all 4 fstat size_t/time_t variants.
> > > For 32-bit pre-msvcr110 builds, adds similar workaround like for existing
> > > mingw-w64 stat functions.
> > > 
> > 
> > How would you obtain an FD of a directory? `_open("C:/Windows", _O_RDONLY)` 
> > fails with EPERM.
> 
> I know two options:
> 
> - for msvcr110, msvcr120 and UCRT builds via _open() with _O_OBTAIN_DIR flag:
>   https://godbolt.org/z/9fon7zY1q
> 
> - for any build via WinAPI CreateFile() with FILE_FLAG_BACKUP_SEMANTICS flag
>   followed by the CRT _open_osfhandle() call:
>   https://godbolt.org/z/b68rnssYP
> 
> Seems that mingw-w64 does not define _O_OBTAIN_DIR flag in header files.
> But as can be seen on the godbolt, it works with msvc. Second option
> works also with mingw-w64.
> 
> _O_OBTAIN_DIR is not mentioned in the _open documentation:
> https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen
> 
> But FILE_FLAG_BACKUP_SEMANTICS is documented as a way how to obtain a handle 
> to a directory:
> https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea

Anyway, the change itself contains the automated test via the
_open_osfhandle which obtains directory FD and which check that fstat
correctly signals the S_IFDIR type.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to