From ee7399fa3795652c3d903e9af2baa9ba0174ca03 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 21 Oct 2009 09:02:04 -0400 Subject: [PATCH] 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 --- src/sys/pioctl_nt.c | 52 ++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) 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; -- 2.39.5