pull up r19488 from trunk
authorTom Yu <tlyu@mit.edu>
Wed, 18 Apr 2007 21:57:42 +0000 (21:57 +0000)
committerTom Yu <tlyu@mit.edu>
Wed, 18 Apr 2007 21:57:42 +0000 (21:57 +0000)
 r19488@cathode-dark-space:  jaltman | 2007-04-17 21:47:08 -0400
 ticket: new
 subject: kfwlogon corrections for XP
 component: windows
 tags: pullup

 This patch addresses a problem discovered on some XP systems.
 After rundll32.exe starts, the CreateProcess can fail to
 start kfwcpcc.exe if the current directory is not %WinDir%\System32.
 CreateProcess() should be called with the lpApplicationName parameter
 set to NULL in order to permit the use of the PATH.

 Also, in ConfigureLogonScript ensure that the trailing NUL of the
 constructed command line is processed when producing the wide
 character version of the string.

ticket: 5534
version_fixed: 1.6.1

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-6@19491 dc483132-0cff-0310-8789-dd5450dbe970

src/windows/kfwlogon/kfwlogon.c

index f76da3cab3eed6f7b67c804167c63bcc2204143f..8422f58b118c3f94408106771c29e5375c1eaa57 100644 (file)
@@ -136,6 +136,8 @@ is_windows_vista(void)
 /* Construct a Logon Script that will cause the LogonEventHandler to be executed\r
  * under in the logon session \r
  */\r
+\r
+#define RUNDLL32_CMDLINE "rundll32.exe kfwlogon.dll,LogonEventHandler "\r
 VOID \r
 ConfigureLogonScript(LPWSTR *lpLogonScript, char * filename) {\r
     DWORD dwLogonScriptLen;\r
@@ -149,23 +151,20 @@ ConfigureLogonScript(LPWSTR *lpLogonScript, char * filename) {
     if (!filename)\r
        return;\r
 \r
-    dwLogonScriptLen = strlen("rundll32.exe kfwlogon.dll,LogonEventHandler ") + strlen(filename) + 1;\r
+    dwLogonScriptLen = strlen(RUNDLL32_CMDLINE) + strlen(filename) + 2;\r
     lpTemp = (LPSTR) malloc(dwLogonScriptLen); \r
     if (!lpTemp)\r
        return;\r
 \r
-    _snprintf(lpTemp, dwLogonScriptLen, \r
-            "rundll32.exe kfwlogon.dll,LogonEventHandler %s",\r
-            filename);\r
+    _snprintf(lpTemp, dwLogonScriptLen, "%s%s", RUNDLL32_CMDLINE, filename);\r
 \r
     SetLastError(0);\r
-    dwLogonScriptLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpTemp, strlen(lpTemp), NULL, 0);\r
+    dwLogonScriptLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpTemp, -1, NULL, 0);\r
     DebugEvent("ConfigureLogonScript %s requires %d bytes gle=0x%x", lpTemp, dwLogonScriptLen, GetLastError());\r
 \r
     lpScript = LocalAlloc(LMEM_ZEROINIT, dwLogonScriptLen * 2);\r
     if (lpScript) {\r
-       if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpTemp, strlen(lpTemp), \r
-                                lpScript, 2 * dwLogonScriptLen))\r
+       if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpTemp, -1, lpScript, 2 * dwLogonScriptLen))\r
            *lpLogonScript = lpScript;\r
        else {\r
            DebugEvent("ConfigureLogonScript - MultiByteToWideChar failed gle = 0x%x", GetLastError());\r
@@ -605,7 +604,8 @@ LogonEventHandlerA(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
     _snprintf(commandline, sizeof(commandline), "kfwcpcc.exe \"%s\"", lpszCmdLine);\r
 \r
     GetStartupInfo(&startupinfo);\r
-    if (CreateProcess( "kfwcpcc.exe",\r
+    SetLastError(0);\r
+    if (CreateProcess( NULL,\r
                       commandline,\r
                       NULL,\r
                       NULL,\r
@@ -623,7 +623,9 @@ LogonEventHandlerA(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
        CloseHandle(procinfo.hThread);\r
        CloseHandle(procinfo.hProcess);\r
     } else {\r
-       DebugEvent0("KFW_Logon_Event - CreateProcessFailed");\r
+       DebugEvent("KFW_Logon_Event - CreateProcessFailed \"%s\" GLE 0x%x", \r
+                     commandline, GetLastError());\r
+        DebugEvent("KFW_Logon_Event PATH %s", getenv("PATH"));\r
     }\r
 \r
     DeleteFile(lpszCmdLine);\r