From: Jeffrey Altman Date: Wed, 21 Oct 2009 13:02:04 +0000 (-0400) Subject: Windows: Do not permit infinite attempts to obtain a pioctl file handle X-Git-Tag: openafs-devel-1_5_66~27 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=ee7399fa3795652c3d903e9af2baa9ba0174ca03;p=packages%2Fo%2Fopenafs.git Windows: Do not permit infinite attempts to obtain a pioctl file handle The recent change to detect sharing violations and initiate retries permits infinite attempts. Change this to a limit of 100 attempts and increase the sleep period between attempts from 1ms to 100ms. LICENSE MIT Reviewed-on: http://gerrit.openafs.org/697 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index a4da876c3..d13bf43e8 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -699,17 +699,17 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) sharingViolation = 0; do { if (sharingViolation) - Sleep(1); + Sleep(100); fh = CreateFile(tbuffer, FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); - sharingViolation = 1; - } while (fh == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION); + sharingViolation++; + } while (fh == INVALID_HANDLE_VALUE && + GetLastError() == ERROR_SHARING_VIOLATION && + sharingViolation < 100); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) { - int gonext = 0; - gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; @@ -728,7 +728,13 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) tbuffer,gle,buf); } errno = saveerrno; + SetLastError(gle); } + } + + if (fh == INVALID_HANDLE_VALUE && + GetLastError() != ERROR_SHARING_VIOLATION) { + int gonext = 0; lana_GetNetbiosName(szClient, LANA_NETBIOS_NAME_FULL); @@ -780,12 +786,14 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) sharingViolation = 0; do { if (sharingViolation) - Sleep(1); + Sleep(100); fh = CreateFile(tbuffer, FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); - sharingViolation = 1; - } while (fh == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION); + sharingViolation++; + } while (fh == INVALID_HANDLE_VALUE && + GetLastError() == ERROR_SHARING_VIOLATION && + sharingViolation < 100); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) { gle = GetLastError(); @@ -806,13 +814,15 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) tbuffer,gle,buf); } errno = saveerrno; + SetLastError(gle); } } } } try_lsa_principal: - if (fh == INVALID_HANDLE_VALUE) { + if (fh == INVALID_HANDLE_VALUE && + GetLastError() != ERROR_SHARING_VIOLATION) { int gonext = 0; dwSize = sizeof(szUser); @@ -856,12 +866,14 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) sharingViolation = 0; do { if (sharingViolation) - Sleep(1); + Sleep(100); fh = CreateFile(tbuffer, FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); - sharingViolation = 1; - } while (fh == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION); + sharingViolation++; + } while (fh == INVALID_HANDLE_VALUE && + GetLastError() == ERROR_SHARING_VIOLATION && + sharingViolation < 100); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) { gle = GetLastError(); @@ -882,14 +894,15 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) tbuffer,gle,buf); } errno = saveerrno; - + SetLastError(gle); } } } } try_sam_compat: - if ( fh == INVALID_HANDLE_VALUE ) { + if (fh == INVALID_HANDLE_VALUE && + GetLastError() != ERROR_SHARING_VIOLATION) { dwSize = sizeof(szUser); if (GetUserNameEx(NameSamCompatible, szUser, &dwSize)) { if ( ioctlDebug ) { @@ -927,12 +940,14 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) sharingViolation = 0; do { if (sharingViolation) - Sleep(1); + Sleep(100); fh = CreateFile(tbuffer, FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); - sharingViolation = 1; - } while (fh == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION); + sharingViolation++; + } while (fh == INVALID_HANDLE_VALUE && + GetLastError() == ERROR_SHARING_VIOLATION && + sharingViolation < 100); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) { gle = GetLastError(); @@ -962,6 +977,9 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) } } + if (fh == INVALID_HANDLE_VALUE) + return -1; + /* return fh and success code */ *handlep = fh; return 0;