You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/11/04 13:52:09 UTC

svn commit: r1197541 - in /commons/proper/daemon/trunk/src/native/windows: apps/prunsrv/prunsrv.c src/javajni.c

Author: mturk
Date: Fri Nov  4 12:52:08 2011
New Revision: 1197541

URL: http://svn.apache.org/viewvc?rev=1197541&view=rev
Log:
Make a code a bit safer on invalid parameters. Make sure it doesn't crash at least

Modified:
    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
    commons/proper/daemon/trunk/src/native/windows/src/javajni.c

Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1197541&r1=1197540&r2=1197541&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Fri Nov  4 12:52:08 2011
@@ -1303,9 +1303,15 @@ void WINAPI serviceMain(DWORD argc, LPTS
     if (IS_VALID_STRING(SO_STARTMODE)) {
         if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) {
             _jni_startup = TRUE;
-            _jni_rclass  = WideToANSI(SO_STARTCLASS);
-            /* Exchange all dots with slashes */
-            apxStrCharReplaceA(_jni_rclass, '.', '/');
+            if (IS_VALID_STRING(SO_STARTCLASS)) {
+                _jni_rclass  = WideToANSI(SO_STARTCLASS);
+                /* Exchange all dots with slashes */
+                apxStrCharReplaceA(_jni_rclass, '.', '/');
+            }
+            else {
+                /* Presume its main */
+                _jni_rclass = WideToANSI(L"Main");
+            }
             _jni_rparam = SO_STARTPARAMS;
         }
         else if (!lstrcmpiW(SO_STARTMODE, PRSRV_JAVA)) {
@@ -1345,14 +1351,14 @@ void WINAPI serviceMain(DWORD argc, LPTS
     if (IS_VALID_STRING(SO_STOPMODE)) {
         if (!lstrcmpiW(SO_STOPMODE, PRSRV_JVM)) {
             _jni_shutdown = TRUE;
-            _jni_sclass = WideToANSI(SO_STOPCLASS);
             if (IS_VALID_STRING(SO_STOPCLASS)) {
+                _jni_sclass = WideToANSI(SO_STOPCLASS);
                 apxStrCharReplaceA(_jni_sclass, '.', '/');
-                _jni_sparam = SO_STOPPARAMS;
             }
             else {
-                _jni_sclass = "java/lang/System";
+                _jni_sclass = WideToANSI(L"java/lang/System");
             }
+            _jni_sparam = SO_STOPPARAMS;
         }
         else if (!lstrcmpiW(SO_STOPMODE, PRSRV_JAVA)) {
             LPWSTR jx = NULL, szJH = SO_JAVAHOME;

Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=1197541&r1=1197540&r2=1197541&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Fri Nov  4 12:52:08 2011
@@ -792,8 +792,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
     if (hJava->dwType != APXHANDLE_TYPE_JVM)
         return FALSE;
     lpJava = APXHANDLE_DATA(hJava);
-    if (!__apxJvmAttach(lpJava))
+    if (!lpJava)
         return FALSE;
+    if (IS_EMPTY_STRING(szMethodName))
+        szMethodName = "main";
+    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
+        /* Usable only for exit method, so force */
+        szSignature  = "(I)V";
+        szMethodName = "exit";
+    }
+    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
+    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
+
     jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING);
     if (!jClazz) {
         JVM_EXCEPTION_CLEAR(lpJava);
@@ -802,7 +812,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
     }
     lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz);
     JNI_LOCAL_UNREF(jClazz);
-
     /* Find the class */
     jClazz  = JNICALL_1(FindClass, szClassName);
     if (!jClazz) {
@@ -814,15 +823,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
     lpJava->clWorker.jClazz  = JNICALL_1(NewGlobalRef, jClazz);
     JNI_LOCAL_UNREF(jClazz);
 
-    if (!szMethodName)
-        szMethodName = "main";
-    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
-        /* Usable only for exit method, so force */
-        szSignature  = "(I)V";
-        szMethodName = "exit";
-    }
-    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
-    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
     lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
                                          lpJava->clWorker.jClazz,
                                          szMethodName, szSignature);
@@ -855,16 +855,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
  */
 static DWORD WINAPI __apxJavaWorkerThread(LPVOID lpParameter)
 {
-#define WORKER_EXIT(x)  { rv = x; goto finished; }
+#define WORKER_EXIT(x)  do { rv = x; goto finished; } while(0)
     DWORD rv = 0;
-    LPAPXJAVAVM lpJava;
+    LPAPXJAVAVM lpJava = NULL;
     LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter;
     APXHANDLE hJava;
 
-    hJava = (APXHANDLE)pArgs->hJava;
+    hJava  = (APXHANDLE)pArgs->hJava;
     if (hJava->dwType != APXHANDLE_TYPE_JVM)
         WORKER_EXIT(1);
-
+    lpJava = APXHANDLE_DATA(pArgs->hJava);
+    if (!lpJava)
+        WORKER_EXIT(1);
     if (!apxJavaInitialize(pArgs->hJava,
                            pArgs->szClassPath,
                            pArgs->lpOptions,
@@ -882,17 +884,16 @@ static DWORD WINAPI __apxJavaWorkerThrea
                               pArgs->szClassName,
                               pArgs->szMethodName,
                               pArgs->lpArguments)) {
-        WORKER_EXIT(2);
+        WORKER_EXIT(3);
     }
     apxJavaSetOut(pArgs->hJava, TRUE,  pArgs->szStdErrFilename);
     apxJavaSetOut(pArgs->hJava, FALSE, pArgs->szStdOutFilename);
 
-    lpJava = APXHANDLE_DATA(pArgs->hJava);
     /* Check if we have a class and a method */
     if (!lpJava->clWorker.jClazz || !lpJava->clWorker.jMethod)
-        WORKER_EXIT(2);
+        WORKER_EXIT(4);
     if (!__apxJvmAttach(lpJava))
-        WORKER_EXIT(3);
+        WORKER_EXIT(5);
     apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
                 lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
     lpJava->dwWorkerStatus = 1;
@@ -902,26 +903,30 @@ static DWORD WINAPI __apxJavaWorkerThrea
               lpJava->clWorker.jMethod,
               lpJava->clWorker.jArgs);
     if (JVM_EXCEPTION_CHECK(lpJava)) {
-        WORKER_EXIT(4);
+        WORKER_EXIT(6);
     }
     else {
         __apxJvmDetach(lpJava);
     }
 finished:
-    lpJava->dwWorkerStatus = 0;
-    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
-                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
-    SetEvent(lpJava->hWorkerSync);
+    if (lpJava) {
+        lpJava->dwWorkerStatus = 0;
+        apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
+                    lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
+        SetEvent(lpJava->hWorkerSync);
+    }
     ExitThread(rv);
     /* never gets here but keep the compiler happy */
-    return 0;
+    return rv;
 }
 
+BOOL
 apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
 {
-
     LPAPXJAVAVM lpJava;
     lpJava = APXHANDLE_DATA(pArgs->hJava);
+    if (!lpJava)
+        return FALSE;
     lpJava->dwWorkerStatus = 0;
     lpJava->hWorkerSync    = CreateEvent(NULL, FALSE, FALSE, NULL);
     lpJava->hWorkerThread  = CreateThread(NULL,
@@ -936,6 +941,8 @@ apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
     ResumeThread(lpJava->hWorkerThread);
     /* Wait until the worker thread initializes */
     WaitForSingleObject(lpJava->hWorkerSync, INFINITE);
+    if (lpJava->dwWorkerStatus == 0)
+        return FALSE;
     if (lstrcmpA(lpJava->clWorker.sClazz, "java/lang/System")) {
         /* Give some time to initialize the thread
          * Unless we are calling System.exit(0).



Re: svn commit: r1197541 - in /commons/proper/daemon/trunk/src/native/windows: apps/prunsrv/prunsrv.c src/javajni.c

Posted by sebb <se...@gmail.com>.
On 4 November 2011 13:22, sebb <se...@gmail.com> wrote:
> On 4 November 2011 12:52,  <mt...@apache.org> wrote:
>> Author: mturk
>> Date: Fri Nov  4 12:52:08 2011
>> New Revision: 1197541
>>
>> URL: http://svn.apache.org/viewvc?rev=1197541&view=rev
>> Log:
>> Make a code a bit safer on invalid parameters. Make sure it doesn't crash at least
>
> The default --StartClass is now "Main", and --StopClass defaults to
> "java/lang/System" - in which case the default --StopMethod is "exit"
> - is that correct?
>
> If so, I can update the docs accordingly.

PING?

>> Modified:
>>    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
>>    commons/proper/daemon/trunk/src/native/windows/src/javajni.c
>>
>> Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
>> URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1197541&r1=1197540&r2=1197541&view=diff
>> ==============================================================================
>> --- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c (original)
>> +++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Fri Nov  4 12:52:08 2011
>> @@ -1303,9 +1303,15 @@ void WINAPI serviceMain(DWORD argc, LPTS
>>     if (IS_VALID_STRING(SO_STARTMODE)) {
>>         if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) {
>>             _jni_startup = TRUE;
>> -            _jni_rclass  = WideToANSI(SO_STARTCLASS);
>> -            /* Exchange all dots with slashes */
>> -            apxStrCharReplaceA(_jni_rclass, '.', '/');
>> +            if (IS_VALID_STRING(SO_STARTCLASS)) {
>> +                _jni_rclass  = WideToANSI(SO_STARTCLASS);
>> +                /* Exchange all dots with slashes */
>> +                apxStrCharReplaceA(_jni_rclass, '.', '/');
>> +            }
>> +            else {
>> +                /* Presume its main */
>> +                _jni_rclass = WideToANSI(L"Main");
>> +            }
>>             _jni_rparam = SO_STARTPARAMS;
>>         }
>>         else if (!lstrcmpiW(SO_STARTMODE, PRSRV_JAVA)) {
>> @@ -1345,14 +1351,14 @@ void WINAPI serviceMain(DWORD argc, LPTS
>>     if (IS_VALID_STRING(SO_STOPMODE)) {
>>         if (!lstrcmpiW(SO_STOPMODE, PRSRV_JVM)) {
>>             _jni_shutdown = TRUE;
>> -            _jni_sclass = WideToANSI(SO_STOPCLASS);
>>             if (IS_VALID_STRING(SO_STOPCLASS)) {
>> +                _jni_sclass = WideToANSI(SO_STOPCLASS);
>>                 apxStrCharReplaceA(_jni_sclass, '.', '/');
>> -                _jni_sparam = SO_STOPPARAMS;
>>             }
>>             else {
>> -                _jni_sclass = "java/lang/System";
>> +                _jni_sclass = WideToANSI(L"java/lang/System");
>>             }
>> +            _jni_sparam = SO_STOPPARAMS;
>>         }
>>         else if (!lstrcmpiW(SO_STOPMODE, PRSRV_JAVA)) {
>>             LPWSTR jx = NULL, szJH = SO_JAVAHOME;
>>
>> Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
>> URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=1197541&r1=1197540&r2=1197541&view=diff
>> ==============================================================================
>> --- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
>> +++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Fri Nov  4 12:52:08 2011
>> @@ -792,8 +792,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>>     if (hJava->dwType != APXHANDLE_TYPE_JVM)
>>         return FALSE;
>>     lpJava = APXHANDLE_DATA(hJava);
>> -    if (!__apxJvmAttach(lpJava))
>> +    if (!lpJava)
>>         return FALSE;
>> +    if (IS_EMPTY_STRING(szMethodName))
>> +        szMethodName = "main";
>> +    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
>> +        /* Usable only for exit method, so force */
>> +        szSignature  = "(I)V";
>> +        szMethodName = "exit";
>> +    }
>> +    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
>> +    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
>> +
>>     jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING);
>>     if (!jClazz) {
>>         JVM_EXCEPTION_CLEAR(lpJava);
>> @@ -802,7 +812,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>>     }
>>     lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz);
>>     JNI_LOCAL_UNREF(jClazz);
>> -
>>     /* Find the class */
>>     jClazz  = JNICALL_1(FindClass, szClassName);
>>     if (!jClazz) {
>> @@ -814,15 +823,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>>     lpJava->clWorker.jClazz  = JNICALL_1(NewGlobalRef, jClazz);
>>     JNI_LOCAL_UNREF(jClazz);
>>
>> -    if (!szMethodName)
>> -        szMethodName = "main";
>> -    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
>> -        /* Usable only for exit method, so force */
>> -        szSignature  = "(I)V";
>> -        szMethodName = "exit";
>> -    }
>> -    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
>> -    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
>>     lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
>>                                          lpJava->clWorker.jClazz,
>>                                          szMethodName, szSignature);
>> @@ -855,16 +855,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>>  */
>>  static DWORD WINAPI __apxJavaWorkerThread(LPVOID lpParameter)
>>  {
>> -#define WORKER_EXIT(x)  { rv = x; goto finished; }
>> +#define WORKER_EXIT(x)  do { rv = x; goto finished; } while(0)
>>     DWORD rv = 0;
>> -    LPAPXJAVAVM lpJava;
>> +    LPAPXJAVAVM lpJava = NULL;
>>     LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter;
>>     APXHANDLE hJava;
>>
>> -    hJava = (APXHANDLE)pArgs->hJava;
>> +    hJava  = (APXHANDLE)pArgs->hJava;
>>     if (hJava->dwType != APXHANDLE_TYPE_JVM)
>>         WORKER_EXIT(1);
>> -
>> +    lpJava = APXHANDLE_DATA(pArgs->hJava);
>> +    if (!lpJava)
>> +        WORKER_EXIT(1);
>>     if (!apxJavaInitialize(pArgs->hJava,
>>                            pArgs->szClassPath,
>>                            pArgs->lpOptions,
>> @@ -882,17 +884,16 @@ static DWORD WINAPI __apxJavaWorkerThrea
>>                               pArgs->szClassName,
>>                               pArgs->szMethodName,
>>                               pArgs->lpArguments)) {
>> -        WORKER_EXIT(2);
>> +        WORKER_EXIT(3);
>>     }
>>     apxJavaSetOut(pArgs->hJava, TRUE,  pArgs->szStdErrFilename);
>>     apxJavaSetOut(pArgs->hJava, FALSE, pArgs->szStdOutFilename);
>>
>> -    lpJava = APXHANDLE_DATA(pArgs->hJava);
>>     /* Check if we have a class and a method */
>>     if (!lpJava->clWorker.jClazz || !lpJava->clWorker.jMethod)
>> -        WORKER_EXIT(2);
>> +        WORKER_EXIT(4);
>>     if (!__apxJvmAttach(lpJava))
>> -        WORKER_EXIT(3);
>> +        WORKER_EXIT(5);
>>     apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
>>                 lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
>>     lpJava->dwWorkerStatus = 1;
>> @@ -902,26 +903,30 @@ static DWORD WINAPI __apxJavaWorkerThrea
>>               lpJava->clWorker.jMethod,
>>               lpJava->clWorker.jArgs);
>>     if (JVM_EXCEPTION_CHECK(lpJava)) {
>> -        WORKER_EXIT(4);
>> +        WORKER_EXIT(6);
>>     }
>>     else {
>>         __apxJvmDetach(lpJava);
>>     }
>>  finished:
>> -    lpJava->dwWorkerStatus = 0;
>> -    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
>> -                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
>> -    SetEvent(lpJava->hWorkerSync);
>> +    if (lpJava) {
>> +        lpJava->dwWorkerStatus = 0;
>> +        apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
>> +                    lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
>> +        SetEvent(lpJava->hWorkerSync);
>> +    }
>>     ExitThread(rv);
>>     /* never gets here but keep the compiler happy */
>> -    return 0;
>> +    return rv;
>>  }
>>
>> +BOOL
>>  apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
>>  {
>> -
>>     LPAPXJAVAVM lpJava;
>>     lpJava = APXHANDLE_DATA(pArgs->hJava);
>> +    if (!lpJava)
>> +        return FALSE;
>>     lpJava->dwWorkerStatus = 0;
>>     lpJava->hWorkerSync    = CreateEvent(NULL, FALSE, FALSE, NULL);
>>     lpJava->hWorkerThread  = CreateThread(NULL,
>> @@ -936,6 +941,8 @@ apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
>>     ResumeThread(lpJava->hWorkerThread);
>>     /* Wait until the worker thread initializes */
>>     WaitForSingleObject(lpJava->hWorkerSync, INFINITE);
>> +    if (lpJava->dwWorkerStatus == 0)
>> +        return FALSE;
>>     if (lstrcmpA(lpJava->clWorker.sClazz, "java/lang/System")) {
>>         /* Give some time to initialize the thread
>>          * Unless we are calling System.exit(0).
>>
>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1197541 - in /commons/proper/daemon/trunk/src/native/windows: apps/prunsrv/prunsrv.c src/javajni.c

Posted by sebb <se...@gmail.com>.
On 4 November 2011 12:52,  <mt...@apache.org> wrote:
> Author: mturk
> Date: Fri Nov  4 12:52:08 2011
> New Revision: 1197541
>
> URL: http://svn.apache.org/viewvc?rev=1197541&view=rev
> Log:
> Make a code a bit safer on invalid parameters. Make sure it doesn't crash at least

The default --StartClass is now "Main", and --StopClass defaults to
"java/lang/System" - in which case the default --StopMethod is "exit"
- is that correct?

If so, I can update the docs accordingly.

> Modified:
>    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
>    commons/proper/daemon/trunk/src/native/windows/src/javajni.c
>
> Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
> URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1197541&r1=1197540&r2=1197541&view=diff
> ==============================================================================
> --- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c (original)
> +++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Fri Nov  4 12:52:08 2011
> @@ -1303,9 +1303,15 @@ void WINAPI serviceMain(DWORD argc, LPTS
>     if (IS_VALID_STRING(SO_STARTMODE)) {
>         if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) {
>             _jni_startup = TRUE;
> -            _jni_rclass  = WideToANSI(SO_STARTCLASS);
> -            /* Exchange all dots with slashes */
> -            apxStrCharReplaceA(_jni_rclass, '.', '/');
> +            if (IS_VALID_STRING(SO_STARTCLASS)) {
> +                _jni_rclass  = WideToANSI(SO_STARTCLASS);
> +                /* Exchange all dots with slashes */
> +                apxStrCharReplaceA(_jni_rclass, '.', '/');
> +            }
> +            else {
> +                /* Presume its main */
> +                _jni_rclass = WideToANSI(L"Main");
> +            }
>             _jni_rparam = SO_STARTPARAMS;
>         }
>         else if (!lstrcmpiW(SO_STARTMODE, PRSRV_JAVA)) {
> @@ -1345,14 +1351,14 @@ void WINAPI serviceMain(DWORD argc, LPTS
>     if (IS_VALID_STRING(SO_STOPMODE)) {
>         if (!lstrcmpiW(SO_STOPMODE, PRSRV_JVM)) {
>             _jni_shutdown = TRUE;
> -            _jni_sclass = WideToANSI(SO_STOPCLASS);
>             if (IS_VALID_STRING(SO_STOPCLASS)) {
> +                _jni_sclass = WideToANSI(SO_STOPCLASS);
>                 apxStrCharReplaceA(_jni_sclass, '.', '/');
> -                _jni_sparam = SO_STOPPARAMS;
>             }
>             else {
> -                _jni_sclass = "java/lang/System";
> +                _jni_sclass = WideToANSI(L"java/lang/System");
>             }
> +            _jni_sparam = SO_STOPPARAMS;
>         }
>         else if (!lstrcmpiW(SO_STOPMODE, PRSRV_JAVA)) {
>             LPWSTR jx = NULL, szJH = SO_JAVAHOME;
>
> Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
> URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=1197541&r1=1197540&r2=1197541&view=diff
> ==============================================================================
> --- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
> +++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Fri Nov  4 12:52:08 2011
> @@ -792,8 +792,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>     if (hJava->dwType != APXHANDLE_TYPE_JVM)
>         return FALSE;
>     lpJava = APXHANDLE_DATA(hJava);
> -    if (!__apxJvmAttach(lpJava))
> +    if (!lpJava)
>         return FALSE;
> +    if (IS_EMPTY_STRING(szMethodName))
> +        szMethodName = "main";
> +    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
> +        /* Usable only for exit method, so force */
> +        szSignature  = "(I)V";
> +        szMethodName = "exit";
> +    }
> +    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
> +    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
> +
>     jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING);
>     if (!jClazz) {
>         JVM_EXCEPTION_CLEAR(lpJava);
> @@ -802,7 +812,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>     }
>     lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz);
>     JNI_LOCAL_UNREF(jClazz);
> -
>     /* Find the class */
>     jClazz  = JNICALL_1(FindClass, szClassName);
>     if (!jClazz) {
> @@ -814,15 +823,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>     lpJava->clWorker.jClazz  = JNICALL_1(NewGlobalRef, jClazz);
>     JNI_LOCAL_UNREF(jClazz);
>
> -    if (!szMethodName)
> -        szMethodName = "main";
> -    if (lstrcmpA(szClassName, "java/lang/System") == 0) {
> -        /* Usable only for exit method, so force */
> -        szSignature  = "(I)V";
> -        szMethodName = "exit";
> -    }
> -    lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
> -    lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
>     lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
>                                          lpJava->clWorker.jClazz,
>                                          szMethodName, szSignature);
> @@ -855,16 +855,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
>  */
>  static DWORD WINAPI __apxJavaWorkerThread(LPVOID lpParameter)
>  {
> -#define WORKER_EXIT(x)  { rv = x; goto finished; }
> +#define WORKER_EXIT(x)  do { rv = x; goto finished; } while(0)
>     DWORD rv = 0;
> -    LPAPXJAVAVM lpJava;
> +    LPAPXJAVAVM lpJava = NULL;
>     LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter;
>     APXHANDLE hJava;
>
> -    hJava = (APXHANDLE)pArgs->hJava;
> +    hJava  = (APXHANDLE)pArgs->hJava;
>     if (hJava->dwType != APXHANDLE_TYPE_JVM)
>         WORKER_EXIT(1);
> -
> +    lpJava = APXHANDLE_DATA(pArgs->hJava);
> +    if (!lpJava)
> +        WORKER_EXIT(1);
>     if (!apxJavaInitialize(pArgs->hJava,
>                            pArgs->szClassPath,
>                            pArgs->lpOptions,
> @@ -882,17 +884,16 @@ static DWORD WINAPI __apxJavaWorkerThrea
>                               pArgs->szClassName,
>                               pArgs->szMethodName,
>                               pArgs->lpArguments)) {
> -        WORKER_EXIT(2);
> +        WORKER_EXIT(3);
>     }
>     apxJavaSetOut(pArgs->hJava, TRUE,  pArgs->szStdErrFilename);
>     apxJavaSetOut(pArgs->hJava, FALSE, pArgs->szStdOutFilename);
>
> -    lpJava = APXHANDLE_DATA(pArgs->hJava);
>     /* Check if we have a class and a method */
>     if (!lpJava->clWorker.jClazz || !lpJava->clWorker.jMethod)
> -        WORKER_EXIT(2);
> +        WORKER_EXIT(4);
>     if (!__apxJvmAttach(lpJava))
> -        WORKER_EXIT(3);
> +        WORKER_EXIT(5);
>     apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
>                 lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
>     lpJava->dwWorkerStatus = 1;
> @@ -902,26 +903,30 @@ static DWORD WINAPI __apxJavaWorkerThrea
>               lpJava->clWorker.jMethod,
>               lpJava->clWorker.jArgs);
>     if (JVM_EXCEPTION_CHECK(lpJava)) {
> -        WORKER_EXIT(4);
> +        WORKER_EXIT(6);
>     }
>     else {
>         __apxJvmDetach(lpJava);
>     }
>  finished:
> -    lpJava->dwWorkerStatus = 0;
> -    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
> -                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
> -    SetEvent(lpJava->hWorkerSync);
> +    if (lpJava) {
> +        lpJava->dwWorkerStatus = 0;
> +        apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
> +                    lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
> +        SetEvent(lpJava->hWorkerSync);
> +    }
>     ExitThread(rv);
>     /* never gets here but keep the compiler happy */
> -    return 0;
> +    return rv;
>  }
>
> +BOOL
>  apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
>  {
> -
>     LPAPXJAVAVM lpJava;
>     lpJava = APXHANDLE_DATA(pArgs->hJava);
> +    if (!lpJava)
> +        return FALSE;
>     lpJava->dwWorkerStatus = 0;
>     lpJava->hWorkerSync    = CreateEvent(NULL, FALSE, FALSE, NULL);
>     lpJava->hWorkerThread  = CreateThread(NULL,
> @@ -936,6 +941,8 @@ apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
>     ResumeThread(lpJava->hWorkerThread);
>     /* Wait until the worker thread initializes */
>     WaitForSingleObject(lpJava->hWorkerSync, INFINITE);
> +    if (lpJava->dwWorkerStatus == 0)
> +        return FALSE;
>     if (lstrcmpA(lpJava->clWorker.sClazz, "java/lang/System")) {
>         /* Give some time to initialize the thread
>          * Unless we are calling System.exit(0).
>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org