On 4 November 2011 13:22, sebb <seb...@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-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to