aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/drivers/win32/win_efile.c
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2011-09-16 14:39:00 +0200
committerBjörn-Egil Dahlberg <[email protected]>2011-09-16 14:39:00 +0200
commit0c41940bef1d80b6b335cb0a77d5608d9bbe27fd (patch)
tree2eb9bfdf8723b593b2d8428cbc5e738648547a6f /erts/emulator/drivers/win32/win_efile.c
parent9c87b49e4433cf910a9f8d4548c5c3d2da3c5a5f (diff)
parente7580bdbd1a84f53e78625c26d548025aeb585f0 (diff)
downloadotp-0c41940bef1d80b6b335cb0a77d5608d9bbe27fd.tar.gz
otp-0c41940bef1d80b6b335cb0a77d5608d9bbe27fd.tar.bz2
otp-0c41940bef1d80b6b335cb0a77d5608d9bbe27fd.zip
Merge branch 'pan/win_symbolic_link_fixes/OTP-9279' into dev
* pan/win_symbolic_link_fixes/OTP-9279: Add error code for cyclic symbolic links and make directory links readable
Diffstat (limited to 'erts/emulator/drivers/win32/win_efile.c')
-rwxr-xr-xerts/emulator/drivers/win32/win_efile.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/erts/emulator/drivers/win32/win_efile.c b/erts/emulator/drivers/win32/win_efile.c
index 3d59564f7b..931bb196f1 100755
--- a/erts/emulator/drivers/win32/win_efile.c
+++ b/erts/emulator/drivers/win32/win_efile.c
@@ -127,6 +127,8 @@ static int errno_map(DWORD last_error) {
return EBUSY;
case ERROR_NO_PROC_SLOTS:
return EAGAIN;
+ case ERROR_CANT_RESOLVE_FILENAME:
+ return EMLINK;
case ERROR_ARENA_TRASHED:
case ERROR_INVALID_BLOCK:
case ERROR_BAD_ENVIRONMENT:
@@ -1405,7 +1407,7 @@ efile_readlink(Efile_error* errInfo, char* name, char* buffer, size_t size)
DWORD fileAttributes = GetFileAttributesW(wname);
if ((fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
BOOLEAN success = 0;
- HANDLE h = CreateFileW(wname, GENERIC_READ, 0,NULL, OPEN_EXISTING, 0, NULL);
+ HANDLE h = CreateFileW(wname, GENERIC_READ, 0,NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
int len;
if(h != INVALID_HANDLE_VALUE) {
success = pGetFinalPathNameByHandle(h, wbuffer, size,0);
@@ -1421,7 +1423,7 @@ efile_readlink(Efile_error* errInfo, char* name, char* buffer, size_t size)
if (*wbuffer == L'\\')
*wbuffer = L'/';
CloseHandle(h);
- }
+ }
FreeLibrary(hModule);
if (success) {
return 1;