From: Vladimir Petko Date: Thu, 23 Oct 2025 10:14:51 +0000 (+0200) Subject: tools/jpackage/share/AppLauncherEnvTest.java fails with dynamically linked libstdc++ X-Git-Tag: archive/raspbian/21.0.9+10-1_deb13u1+rpi1^2~4 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=45ece09cd958904b870b59a9d143e9bb703176b3;p=openjdk-21.git tools/jpackage/share/AppLauncherEnvTest.java fails with dynamically linked libstdc++ 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 --- diff --git a/src/jdk.jpackage/share/native/common/app.cpp b/src/jdk.jpackage/share/native/common/app.cpp index 4ee7b90c2..2a004b508 100644 --- a/src/jdk.jpackage/share/native/common/app.cpp +++ b/src/jdk.jpackage/share/native/common/app.cpp @@ -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();