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-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to