Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gzm5s-0008PY-K3 for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Mar 2019 17:37:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gzm5q-0005ir-80 for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Mar 2019 17:37:06 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gzm5p-0005ik-KL for pgsql-hackers@lists.postgresql.org; Fri, 01 Mar 2019 17:37:05 +0000 Received: from mail-yw1-xc43.google.com ([2607:f8b0:4864:20::c43]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gzm5i-0007HM-8M for pgsql-hackers@postgresql.org; Fri, 01 Mar 2019 17:37:04 +0000 Received: by mail-yw1-xc43.google.com with SMTP id n12so14618240ywn.13 for ; Fri, 01 Mar 2019 09:36:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=from:subject:to:references:openpgp:autocrypt:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=oKceecNi1PvXLT2vBUHyBXSqe53ncivD5I69nDnZZWQ=; b=0wCKnj+XS6NKnwGxscM5b0An9hCaekFwIbbhfcwFMljtQ4JsQD89VZOO3Hzu7Ubug4 33q9oJPv02VaeArwgCSEs7JQZ8PI+NFPzpP5xvpdoKpLZLwSTIb1KjXmEj8PNyC5vanE 2SzBGDcw9tOKz3K4g6Yw3iYH6jQ0UJ9Vu6l4tqen/QIu5SCNgmmFh8HDCLhHG9Upuf/k EdbwNyYreRdI+qtjfLUJRga3tkpRh0gEs/K4epCHYroEzRU0E3q7m6ZT3XwIvLj6iRfo B3bamft/Zy+dXWzXUtCONqCElV5muS7751od0CH2n0cEYWnu/eLbUh0ef1a5hM9DW5rq 5xTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:references:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-transfer-encoding:content-language; bh=oKceecNi1PvXLT2vBUHyBXSqe53ncivD5I69nDnZZWQ=; b=cn7NyB0ypdTvqbVcOV8vkOxQvrpC+k1/RVLuyoAKzrz4ai/AEM/yCKNHAI3hfKNmW2 PuD3x7iWjBw65A/34y+fcCoJNYJVCB3/kUUJowWrzpJJNuXy18wvwY+BNwoZUe5OSVv6 P/dfN7h61glb7r7fHkGk1CN81c3hNbEhH9t1PmoluITfsdWy1LOo/V0APcbxTc6TZud0 VOaph86M/SsnCvmcGRjSlgLmUhiu40UehAfC/lm/UXf99nAADK7b9Q2gqUabLcslB/ZA upw8oROYsurVR6moa12lagJYl7hw2ed1YNplxWcqkummz9H3TTAHj8V3r8gvb0i2Tkha UjxA== X-Gm-Message-State: APjAAAUXzyq+4H04kdmkM7SAvOdARQCbIjior4CIjE1ytrQ0AIVzqJ6J d53eKzJSJfadHuV0wTSLB9v+fGAAsTUatzNiLsdeRZKAp0e8Y4MDudLQP7G+M/VSX94ArnRjLZx IS2fOMIyHehOMsUi4Ok9xQPVSar5IBgxuBGG1kBaTL2H//L+J8DNqlnr7GwEBcZNe+cN2lAxve3 Bh3TvqQN3KFpYX X-Google-Smtp-Source: APXvYqycl6a08wCMFM4rE4/20Mg3/8ZR294+BmRK7vo/p1sXx9zonMZx5Yu3UgZ8L3YZG2nwS19rZQ== X-Received: by 2002:a81:2942:: with SMTP id p63mr4712012ywp.21.1551461816456; Fri, 01 Mar 2019 09:36:56 -0800 (PST) Received: from [192.168.10.146] ([98.122.175.38]) by smtp.gmail.com with ESMTPSA id y16sm15547568ywy.90.2019.03.01.09.36.55 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 09:36:55 -0800 (PST) From: Andrew Dunstan X-Google-Original-From: Andrew Dunstan Subject: Re: readdir is incorrectly implemented at Windows To: Konstantin Knizhnik , PostgreSQL Hackers References: <2cad7829-8d66-e39c-b937-ac825db5203d@postgrespro.ru> Openpgp: preference=signencrypt Autocrypt: addr=andrew.dunstan@2ndQuadrant.com; prefer-encrypt=mutual; keydata= xsBNBE7KWFkBCAClridxur2AIc7eW2AR7izbfp3EnNefie2HbLF0izW5Ik5UjX2HBXBx4syI gY6b0ugohXrr274+baoAlvSbq6cAoQuEVrk5IZFzt20b1Xkx65FwGSEj526yiKLocqkJceSq Xr9xcA5SGY+FZv441chh5SU92v4q6z+6LPpoHOh97ptAVXZYNTtU0LevyvD5lja0TzbvJm6C eFXitJfnm1pLEr0DGJCR/iUOl/N62Kh4855zZC7NHIjQHPOvV5Stz/l5ilDhvGVk+xkXFPys SjZoUr1rXhYLpiyi5sR0X9FHXT0KnGuz1F5ERO7ZTLSSQ6fJwPj6gOk9K+vvoKvoeql5ABEB AAHNL0FuZHJldyBEdW5zdGFuIDxhbmRyZXcuZHVuc3RhbkAybmRRdWFkcmFudC5jb20+wsCY BBMBAgBCAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUJDyV6hBYhBOQ+WEYd/Hy/RGkV pZn6f8tZ/DuBBQJcH/EVAhkBAAoJEJn6f8tZ/DuB7BEH/iDWZEbVft2m2MT6SPjARzTupt/l xLLZ/Cl6n2US2hov5+fBbnR5xvECk/YCOfG9ICvKNlpFjceqNLRKStd8cmndnI+kDw91uNM2 hpL4aJMeW65XCHvqXlOLSwv5chBpXz9NG7FMaJ+q+59sWEWjcTNmjXgkEHn53y+1pc7nSLDe cr5ZI1aB3nGXRm1SoDY5PYZkUKMykW+YBZwgcs/Q5tRaE+siN7DKbz8E628+PerwAkmHPVXN MdJFD6gs4S0gDFA8IxcyIwZU2v4By+brzcJ9Se3FK5BYxBDHtaYZxgSrJAvOUOrLIZPQTQfL TtnVs3C3JTfrxCH1ceHtnA6dRuTOwE0ETspYWQEIANGc4zQULOxhbqO2dyD51YhqCNRmm9oK Waqf+wmW4tpDe/VVcxAnNizd4LWCHfzpb5cHAtGkOPePMfzWVf6nvdF7d3eglbtf59+zG7O7 llV0xSSoFiieQBsrGvqDInXYX/4mRRXMtyhM353/tixC9RWLs1oofyYmCPPXXY7h9R7en3B8 BoVrRFcdzlIY/NFNhFGW/9dkEiGjgna2Rk6e15kln4ZvFBWUg23p93w/pqXcxY6+k/8TEk+C 4R+M6w7o2PLGOjdZ+kPiUcw5H85zf/yZJwQXzisXaNduwWB6Vads9YC9dj6kPR1c4VGRqAaY L++LAEOqrlvm2TvqQqZRtnEAEQEAAcLAZQQYAQIADwIbDAUCXA6fpAUJDyV6xAAKCRCZ+n/L Wfw7geU4B/9vFFsVmWxerDWgNjyiK80zIPmlw/iwdUlU6FIu0JWLMg4093kvxBs7RMZV9hBq n3ekBvD4IvFsVLJrw9qzSI2FH3UeYy5WXpEs01Ppia60NOlvRDqXbryzuvfe+iYo6bVP3Ikr TPTNYL/BePUTD2DPvSI82SbGTyzuA7SJv6NRqqQDMIy1fU6KyQFLmQJp/QJyhKWzm9jWh8ee w8jVaoMY0Kbq5N7RqisEx1Lu/Iw646UphdYzQNymf+kbiU5Kf4I6DhzV8w9sie1Bo1juNj3I c5/fFJsmxljbnaDbXPcnFsur1Oo9mIHFakgWgOBMuxoWfjONiLjjLh/9+ZIqSSLX Message-ID: <7b740522-3c48-1217-03f0-e2acf8f6b345@2ndQuadrant.com> Date: Fri, 1 Mar 2019 12:36:55 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 In-Reply-To: <2cad7829-8d66-e39c-b937-ac825db5203d@postgrespro.ru> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-MW List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk 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