On Wed, 23 Oct 2024 19:54:17 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

>> src/java.desktop/unix/native/libawt/awt/awt_LoadLibrary.c line 70:
>> 
>>> 68:         graphicsEnvClass = (*env)->FindClass(env,
>>> 69:                                              
>>> "java/awt/GraphicsEnvironment");
>>> 70:         CHECK_EXCEPTION_FATAL(env, "java/awt/GraphicsEnvironment class 
>>> not found");
>> 
>> Taking out any discussion about graal/etc as well as absent of any classes 
>> and methods, I agree that the current code is questionable.
>> 
>> But the solution to always print "java/awt/GraphicsEnvironment class not 
>> found" does not seems to be correct as well.
>>  
>> One of the problem with this code is an actual conflict between two patches. 
>> Both are related to warning caused by pending java exceptions, but 
>> implemented differently:
>>  - https://bugs.openjdk.org/browse/JDK-8031001: treated the java exceptions 
>> as a fatal errors and fail fast
>>  - https://bugs.openjdk.org/browse/JDK-8130507: ignores  the java exceptions 
>> and tried to fallback into the headless mode in assumption that it may be 
>> fine for the application
>> 
>> Both of that patches only changes the code paths which were reported by 
>> "some tools"/checkjni - this is the reason why the next code was not 
>> reported and was not patched(which is wrong):
>> 
>> 
>>        graphicsEnvClass = (*env)->FindClass(env,
>>                                              "java/awt/GraphicsEnvironment");
>>         if (graphicsEnvClass == NULL) {
>>             return JNI_TRUE;
>>         }
>>         headlessFn = (*env)->GetStaticMethodID(env,
>>                                                graphicsEnvClass, 
>> "isHeadless", "()Z");
>>         if (headlessFn == NULL) {
>>             return JNI_TRUE;
>>         }
>> 
>> If we would like to follow JDK-8031001 approach we should use fatal error 
>> here and fail fast, for example if OOM is occurred.
>> If we would like to follow JDK-8130507 we should clear an exceptions and try 
>> to use headless mode.
>> 
>> I guess ignoring an exceptions is not that good and the fix for JDK-8130507 
>> should be rethinking.
>
> You can change the CHECK_EXCEPTION_FATAL macro to something like
> 
> #define CHECK_EXCEPTION_FATAL(env, message) \
>     if ((*env)->ExceptionCheck(env)) { \
>         (*env)->ExceptionDescribe(env);
>         (*env)->FatalError(env, message); \
>     }
> 
> In this case the root cause of the bug will always be printed.
> And then update the fatal message to some generic text.
> 
> Note that the FatalError is used in this code since we always should load the 
> library(libawt_xawt or libawt_headless) or fail fast, otherwise we most 
> probably will get an error later.

@mrserb Perhaps, `ExceptionDescribe` isn't part of the `CHECK_EXCEPTION_FATAL` 
macro to avoid leaking sensitive information. Therefore, `ExceptionClear` which 
has been used previously is safer.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/20169#discussion_r1922864473

Reply via email to