pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Andrew Dunstan <andrew.dunstan@2ndquadrant.com>
To: Konstantin Knizhnik <k.knizhnik@postgrespro.ru>
To: PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Subject: Re: readdir is incorrectly implemented at Windows
Date: Fri, 1 Mar 2019 12:36:55 -0500
Message-ID: <7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com> (raw)
In-Reply-To: <2cad7829-8d66-e39c-b937-ac825db5203d@postgrespro.ru>
References: <2cad7829-8d66-e39c-b937-ac825db5203d@postgrespro.ru>


On 2/25/19 10:38 AM, Konstantin Knizhnik wrote:
> Hi hackers,
>
> Small issue with readir implementation for Windows.
> Right now it returns ENOENT in case of any error returned by
> FindFirstFile.
> So all places in Postgres where opendir/listdir are used will assume
> that directory is empty and
> do nothing without reporting any error.
> It is not so good if directory is actually not empty but there are not
> enough permissions for accessing the directory and FindFirstFile
> returns ERROR_ACCESS_DENIED:
>
> struct dirent *
> readdir(DIR *d)
> {
>     WIN32_FIND_DATA fd;
>
>     if (d->handle == INVALID_HANDLE_VALUE)
>     {
>         d->handle = FindFirstFile(d->dirname, &fd);
>         if (d->handle == INVALID_HANDLE_VALUE)
>         {
>             errno = ENOENT;
>             return NULL;
>         }
>     }
>
>
> Attached please find small patch fixing the problem.
>

Diagnosis seems correct. I wonder if this is responsible for some odd
things we've seen over time on Windows.

This reads a bit oddly:


             {
    -            errno = ENOENT;
    +            if (GetLastError() == ERROR_FILE_NOT_FOUND)
    +            {
    +                /* No more files, force errno=0 (unlike mingw) */
    +                errno = 0;
    +                return NULL;
    +            }
    +            _dosmaperr(GetLastError());
                 return NULL;
             }


Why not something like:


    if (GetLastError() == ERROR_FILE_NOT_FOUND)
        errno = 0;
    else
        _dosmaperr(GetLastError());
    return NULL;


cheers


andrew


-- 
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services





view thread (8+ messages)  latest in thread

Message-ID: <7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com>
Permalink:  ../7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com/
Also on:    postgresql.org/message-id/7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: andrew.dunstan@2ndquadrant.com, k.knizhnik@postgrespro.ru
  Subject: Re: readdir is incorrectly implemented at Windows
  In-Reply-To: <7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox