tools/jpackage/share/AppLauncherEnvTest.java fails with dynamically linked libstdc++
authorVladimir Petko <vpetko@openjdk.org>
Wed, 22 Jan 2025 07:58:11 +0000 (08:58 +0100)
committerMatthias Klose <doko@ubuntu.com>
Wed, 22 Jan 2025 07:58:11 +0000 (08:58 +0100)
Origin: upstream, https://github.com/openjdk/jdk/commit/78a8a99d990dcc0b77c096bb2ca2c1bb86462e3f
Bug: https://bugs.openjdk.org/browse/JDK-8312488
Reviewed-By: asemenyuk, almatvee
Last-Update: 2024-07-18

The generated image contains libjpackageapplauncheraux.so that
contains a destructor function dcon(). It calls already disposed
logger, causing a crash.
Last-Update: 2024-07-18
Gbp-Pq: Name jdk-8312488.patch

src/jdk.jpackage/share/native/common/app.cpp

index 4ee7b90c25634a2b68f7da4aac58382e4c4c1240..2a004b508d336c865febbe06991fa62386b0b769 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,7 @@
 namespace {
 const std::string* theLastErrorMsg = 0;
 
-NopLogAppender nopLogAppender;
+char nopLogAppenderMemory[sizeof(NopLogAppender)] = {};
 
 class StandardLogAppender : public LogAppender {
 public:
@@ -46,7 +46,9 @@ public:
             << ": " << v.message
             << std::endl;
     }
-} standardLogAppender;
+};
+
+char standardLogAppenderMemory[sizeof(StandardLogAppender)] = {};
 
 class LastErrorLogAppender : public LogAppender {
 public:
@@ -114,10 +116,13 @@ bool isWithLogging() {
 
 int launch(const std::nothrow_t&,
         LauncherFunc func, LogAppender* lastErrorLogAppender) {
+    // The log appender is set for the lifetime of the application.
+    // Use in-place new to avoid accessing destroyed instance
+    // when the shared object destructor logs something.
     if (isWithLogging()) {
-        Logger::defaultLogger().setAppender(standardLogAppender);
+        Logger::defaultLogger().setAppender(*new (standardLogAppenderMemory) StandardLogAppender());
     } else {
-        Logger::defaultLogger().setAppender(nopLogAppender);
+        Logger::defaultLogger().setAppender(*new (nopLogAppenderMemory) NopLogAppender());
     }
 
     LOG_TRACE_FUNCTION();