From 46a528e93d3ca9bf5d3e0d5ce94863a488d41502 Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Sat, 15 Mar 2025 08:27:31 +0100 Subject: [PATCH] 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 --- src/jdk.jpackage/share/native/common/app.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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(); -- 2.30.2