Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package java-17-openj9 for openSUSE:Factory checked in at 2026-08-09 21:34:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/java-17-openj9 (Old) and /work/SRC/openSUSE:Factory/.java-17-openj9.new.16738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "java-17-openj9" Sun Aug 9 21:34:13 2026 rev:29 rq:1370086 version:17.0.20.0 Changes: -------- --- /work/SRC/openSUSE:Factory/java-17-openj9/java-17-openj9.changes 2026-06-05 14:59:06.033329709 +0200 +++ /work/SRC/openSUSE:Factory/.java-17-openj9.new.16738/java-17-openj9.changes 2026-08-09 21:36:22.224348530 +0200 @@ -1,0 +2,36 @@ +Thu Aug 6 12:59:48 UTC 2026 - Bernhard Wiedemann <[email protected]> + +- Add patches for reproducible builds: + * reproducible-nls.patch + * reproducible-tracemerge-order.patch + * java-40y.patch + +------------------------------------------------------------------- +Thu Aug 6 05:54:52 UTC 2026 - Fridrich Strba <[email protected]> + +- Update to OpenJDK 17.0.20 with OpenJ9 0.60.0 virtual + machine +- Including Oracle July 2026 CPU changes + * CVE-2026-46968 (bsc#1272224), CVE-2026-46917 (bsc#1272223), + CVE-2026-47010 (bsc#1272225), CVE-2026-47021 (bsc#1272227), + CVE-2026-47027 (bsc#1272228), CVE-2026-60147 (bsc#1272237), + CVE-2026-47059 (bsc#1272235), CVE-2026-47063 (bsc#1272236), + CVE-2026-41254 (bsc#1264994) +- OpenJ9 specific security fixes + * CVE-2026-16439 (bsc#1272250) + * CVE-2026-16441 (bsc#1272248) + * OpenJ9 changes, see + https://www.eclipse.org/openj9/docs/version0.60/ +- Modified patch: + * openj9-openssl.patch + + rebase +- Added patches: + * omr-gcc16.patch + + remove inlining annotation that compiler cannot honour + and that is fatal with gcc16 + * openj9-gcc16.patch + + add memory barrier between zeroing a memory by memset and + constructing an object into it, since gcc16 was optimizing + out the zeroing and OpenJ9 VM heavily relies on it + +------------------------------------------------------------------- Old: ---- 6426f03fa087b257a7e58f363ef61526c896fea3.zip 99da4a533c1e55cf380c5f720cbe3e5957d9898b.zip c53b6b93f422b77b3395a3464d5578b706e9a618.zip New: ---- 16ed2938c6e109d33decb5b780b467c76ee7f23f.zip 2e3166f7afc61f577ccaa63b85444b63b82491f7.zip 396c827fb365c53b26586f55ec09d4727b37d9be.zip java-40y.patch omr-gcc16.patch openj9-gcc16.patch reproducible-nls.patch reproducible-tracemerge-order.patch ----------(New B)---------- New: * reproducible-tracemerge-order.patch * java-40y.patch New:- Added patches: * omr-gcc16.patch + remove inlining annotation that compiler cannot honour New: and that is fatal with gcc16 * openj9-gcc16.patch + add memory barrier between zeroing a memory by memset and New:- Add patches for reproducible builds: * reproducible-nls.patch * reproducible-tracemerge-order.patch New: * reproducible-nls.patch * reproducible-tracemerge-order.patch * java-40y.patch ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ java-17-openj9.spec ++++++ --- /var/tmp/diff_new_pack.qt3V5T/_old 2026-08-09 21:36:26.972510206 +0200 +++ /var/tmp/diff_new_pack.qt3V5T/_new 2026-08-09 21:36:26.992510887 +0200 @@ -35,18 +35,18 @@ # Standard JPackage naming and versioning defines. %global featurever 17 %global interimver 0 -%global updatever 19 -%global buildver 10 +%global updatever 20 +%global buildver 8 %global root_repository https://github.com/ibmruntimes/openj9-openjdk-jdk17/archive -%global root_revision 99da4a533c1e55cf380c5f720cbe3e5957d9898b -%global root_branch v0.59.0-release -%global omr_repository https://github.com/eclipse/openj9-omr/archive -%global omr_revision 6426f03fa087b257a7e58f363ef61526c896fea3 -%global omr_branch v0.59.0-release -%global openj9_repository https://github.com/eclipse/openj9/archive -%global openj9_revision c53b6b93f422b77b3395a3464d5578b706e9a618 -%global openj9_branch v0.59.0-release -%global openj9_tag openj9-0.59.0 +%global root_revision 16ed2938c6e109d33decb5b780b467c76ee7f23f +%global root_branch v0.60.0-release +%global omr_repository https://github.com/eclipse-openj9/openj9-omr/archive +%global omr_revision 2e3166f7afc61f577ccaa63b85444b63b82491f7 +%global omr_branch v0.60.0-release +%global openj9_repository https://github.com/eclipse-openj9/openj9/archive +%global openj9_revision 396c827fb365c53b26586f55ec09d4727b37d9be +%global openj9_branch v0.60.0-release +%global openj9_tag openj9-0.60.0 %if 0%{?suse_version} > 1500 %bcond_without libalternatives %else @@ -127,6 +127,9 @@ Patch5: implicit-pointer-decl.patch # Patch6: reproducible-version.patch +# Fixes for build with gcc 16 +Patch7: omr-gcc16.patch +Patch8: openj9-gcc16.patch # Patch10: system-pcsclite.patch # @@ -134,6 +137,12 @@ # Patch30: aarch64.patch # +Patch32: reproducible-nls.patch +# +Patch33: reproducible-tracemerge-order.patch +# +Patch34: java-40y.patch +# # OpenJDK specific patches # Patch300: disable-doclint-by-default.patch @@ -374,6 +383,8 @@ %patch -P 4 -p1 %patch -P 5 -p1 %patch -P 6 -p1 +%patch -P 7 -p1 +%patch -P 8 -p1 %if %{with_system_pcsc} %patch -P 10 -p1 @@ -382,6 +393,9 @@ %patch -P 20 -p1 %patch -P 30 -p1 +%patch -P 32 -p1 +%patch -P 33 -p1 +%patch -P 34 -p1 %patch -P 300 -p1 @@ -423,32 +437,32 @@ CC=gcc-%{with_gcc} \ NM=gcc-nm-%{with_gcc} \ %endif +%if %{with_system_pcsc} + --with-pcsclite=system \ +%endif +%if %{with_system_harfbuzz} + --with-harfbuzz=system \ +%endif --with-extra-cflags="$EXTRA_CFLAGS" \ --with-extra-cxxflags="$EXTRA_CPP_FLAGS" \ --with-version-pre="" \ --with-version-opt="suse-0%{?suse_version}-%{_arch}" \ + --with-debug-level=%{debugbuild} \ + --with-conf-name=%{debugbuild} \ + --with-source-date="${SOURCE_DATE_EPOCH:-$(date +%%s)}" \ + --enable-reproducible-build \ --disable-warnings-as-errors \ --disable-warnings-as-errors-omr \ --disable-warnings-as-errors-openj9 \ --disable-keep-packaged-modules \ --enable-jfr \ - --with-debug-level=%{debugbuild} \ - --with-conf-name=%{debugbuild} \ --with-zlib=system \ --with-libjpeg=system \ --with-giflib=system \ --with-libpng=system \ --with-lcms=system \ --with-openssl=system \ -%if %{with_system_pcsc} - --with-pcsclite=system \ -%endif -%if %{with_system_harfbuzz} - --with-harfbuzz=system \ -%endif --with-stdc++lib=dynamic \ - --with-extra-cxxflags="$EXTRA_CPP_FLAGS" \ - --with-extra-cflags="$EXTRA_CFLAGS" \ --disable-javac-server \ --enable-demos ++++++ 6426f03fa087b257a7e58f363ef61526c896fea3.zip -> 16ed2938c6e109d33decb5b780b467c76ee7f23f.zip ++++++ /work/SRC/openSUSE:Factory/java-17-openj9/6426f03fa087b257a7e58f363ef61526c896fea3.zip /work/SRC/openSUSE:Factory/.java-17-openj9.new.16738/16ed2938c6e109d33decb5b780b467c76ee7f23f.zip differ: char 11, line 2 ++++++ 6426f03fa087b257a7e58f363ef61526c896fea3.zip -> 2e3166f7afc61f577ccaa63b85444b63b82491f7.zip ++++++ /work/SRC/openSUSE:Factory/java-17-openj9/6426f03fa087b257a7e58f363ef61526c896fea3.zip /work/SRC/openSUSE:Factory/.java-17-openj9.new.16738/2e3166f7afc61f577ccaa63b85444b63b82491f7.zip differ: char 11, line 2 ++++++ 6426f03fa087b257a7e58f363ef61526c896fea3.zip -> 396c827fb365c53b26586f55ec09d4727b37d9be.zip ++++++ /work/SRC/openSUSE:Factory/java-17-openj9/6426f03fa087b257a7e58f363ef61526c896fea3.zip /work/SRC/openSUSE:Factory/.java-17-openj9.new.16738/396c827fb365c53b26586f55ec09d4727b37d9be.zip differ: char 11, line 2 ++++++ java-40y.patch ++++++ # Widen the currency cut-over sanity check from 10 to 40 years # # GenerateCurrencyData rejects any special-case cut-over time that is more # than 10 years away from the current time. That guard is about catching # typos in CurrencyData.properties, but it also makes the build fail when it # is run with a clock far from the data's epoch - which is what happens when # testing reproducibility with a shifted clock, and will happen anyway as # the data ages. # # Same change as java-40y.patch carries for java-17-openjdk. # diff --git a/openjdk/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java b/openjdk/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java index d599d9744fd..b544701fe66 100644 --- ./make/jdk/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java +++ ./make/jdk/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java @@ -283,8 +283,8 @@ public class GenerateCurrencyData { checkCurrencyCode(newCurrency); String timeString = currencyInfo.substring(4, length - 4); long time = format.parse(timeString).getTime(); - if (Math.abs(time - System.currentTimeMillis()) > ((long) 10) * 365 * 24 * 60 * 60 * 1000) { - throw new RuntimeException("time is more than 10 years from present: " + time); + if (Math.abs(time - System.currentTimeMillis()) > ((long) 40) * 365 * 24 * 60 * 60 * 1000) { + throw new RuntimeException("time is more than 40 years from present: " + time); } specialCaseCutOverTimes[specialCaseCount] = time; specialCaseOldCurrencies[specialCaseCount] = oldCurrency; ++++++ omr-gcc16.patch ++++++ --- a/omr/gc/base/MemorySubSpaceGenerational.hpp +++ b/omr/gc/base/MemorySubSpaceGenerational.hpp @@ -107,7 +107,7 @@ class MM_MemorySubSpaceGenerational : public MM_MemorySubSpace virtual uintptr_t releaseFreeMemoryPages(MM_EnvironmentBase* env, uintptr_t memoryType); - virtual MMINLINE uintptr_t getContractionSize() const { return _memorySubSpaceOld->getContractionSize(); } + virtual uintptr_t getContractionSize() const { return _memorySubSpaceOld->getContractionSize(); } /** * Create a MemorySubSpaceGenerational object. ++++++ openj9-gcc16.patch ++++++ --- a/openj9/runtime/compiler/control/CompilationThread.cpp +++ b/openj9/runtime/compiler/control/CompilationThread.cpp @@ -778,6 +778,7 @@ bool TR::CompilationInfo::createCompilationInfo(J9JITConfig *jitConfig) /* Note: there are embedded objects in TR::CompilationInfo that rely on the fact that we do memset this object to 0 */ memset(alloc, 0, sizeof(TR::CompilationInfo)); + __asm__("" : : : "memory"); _compilationRuntime = new (alloc) TR::CompilationInfo(jitConfig); jitConfig->compilationRuntime = (void *)_compilationRuntime; #ifdef DEBUG ++++++ openj9-openssl.patch ++++++ --- /var/tmp/diff_new_pack.qt3V5T/_old 2026-08-09 21:36:28.116549161 +0200 +++ /var/tmp/diff_new_pack.qt3V5T/_new 2026-08-09 21:36:28.124549434 +0200 @@ -8,7 +8,7 @@ +#define SSL_R_UNEXPECTED_EOF_WHILE_READING 294 +#endif + - static bool - handleOpenSSLConnectionError(int connfd, SSL *&ssl, BIO *&bio, const char *errMsg, int ret, TR::CompilationInfo *compInfo) - { + static bool handleOpenSSLConnectionError(int connfd, SSL *&ssl, BIO *&bio, const char *errMsg, int ret, + TR::CompilationInfo *compInfo) + { ++++++ reproducible-nls.patch ++++++ diff --git a/openj9/sourcetools/j9nls/com/ibm/oti/NLSTool/J9NLS.java b/openj9/sourcetools/j9nls/com/ibm/oti/NLSTool/J9NLS.java index 25aa5c221..2fea566e0 100644 --- a/openj9/sourcetools/j9nls/com/ibm/oti/NLSTool/J9NLS.java +++ b/openj9/sourcetools/j9nls/com/ibm/oti/NLSTool/J9NLS.java @@ -22,6 +22,7 @@ package com.ibm.oti.NLSTool; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -291,8 +292,8 @@ public class J9NLS implements NLSConstants { } else { String fileName = getNameWithLocale(outFileName, locale); if (propertiesDifferentFromCopyOnDisk(fileName)) { - out = new FileOutputStream(fileName); - outputProperties.store(out, null); + out = new FileOutputStream(fileName); + storeOutputProperties(out); out.flush(); dp("** Generated " + fileName + "\n"); totalPropertiesFilesCreated++; @@ -308,6 +309,22 @@ public class J9NLS implements NLSConstants { } } + /** + * Writes the generated properties, dropping the leading comment line in + * which Properties.store() records the current time: it would make the + * generated files differ between otherwise identical builds. + * + * @param out + * @throws IOException + */ + private void storeOutputProperties(OutputStream out) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + outputProperties.store(buffer, null); + /* Properties.store(OutputStream, String) writes ISO 8859-1. */ + String stored = buffer.toString("ISO-8859-1"); + out.write(stored.substring(stored.indexOf('\n') + 1).getBytes("ISO-8859-1")); + } + private MsgInfo createMsgInfo(String macro, String key, String msg, Properties nlsProperties) { MsgInfo msgInfo = new MsgInfo(); msgInfo.setMacro(macro); ++++++ reproducible-tracemerge-order.patch ++++++ diff --git a/omr/tools/tracegen/FileUtils.cpp b/omr/tools/tracegen/FileUtils.cpp index 7db9723f8..b015970fb 100644 --- a/omr/tools/tracegen/FileUtils.cpp +++ b/omr/tools/tracegen/FileUtils.cpp @@ -120,44 +120,106 @@ FileUtils::getMtime(const char *filePath) return statbuf.st_mtime; } +/* + * Compare two directory entry names. strcmp() is used rather than strcoll() + * so that the ordering is a plain byte comparison, and hence does not depend + * on the locale the build happens to run in. + */ +static int +compareEntryNames(const void *left, const void *right) +{ + return strcmp(*(const char *const *)left, *(const char *const *)right); +} + +static void +freeEntryNames(char ***entries, size_t entryCount) +{ + if (NULL != *entries) { + size_t index = 0; + for (index = 0; index < entryCount; index += 1) { + Port::omrmem_free((void **)&(*entries)[index]); + } + Port::omrmem_free((void **)entries); + } +} + RCType FileUtils::visitDirectory(J9TDFOptions *options, const char *dirName, const char *fileExtFilter, void *targetObject, VisitFileCallBack callback) { char *resultBuffer = NULL; RCType rc = RC_OK; intptr_t handle = PORT_INVALID_FIND_FILE_HANDLE; + char **entries = NULL; + size_t entryCount = 0; + size_t entryCapacity = 0; + size_t index = 0; rc = Port::omrfile_findfirst(dirName, &resultBuffer, &handle); if (RC_OK != rc) { printError("Failed to open directory %s\n", dirName); - goto failed; + /* findfirst leaves no handle open when it fails, so there is nothing to close. */ + return RC_FAILED; } + /* + * Collect the entries before visiting any of them. The order in which the + * filesystem reports directory entries is not stable, and that order used + * to reach the merged trace data, so otherwise identical builds produced + * different output. + */ while (RC_FAILED != rc) { - char *nextEntry = NULL; - size_t nextEntrySize = 0; /* skip current and parent dir */ if ((0 == strcmp(resultBuffer, ".")) || (0 == strcmp(resultBuffer, ".."))) { - goto next; + Port::omrmem_free((void **)&resultBuffer); + } else { + if (entryCount == entryCapacity) { + size_t newCapacity = (0 == entryCapacity) ? 16 : (entryCapacity * 2); + char **newEntries = (char **)Port::omrmem_calloc(newCapacity, sizeof(char *)); + if (NULL == newEntries) { + goto failed; + } + if (NULL != entries) { + memcpy(newEntries, entries, entryCount * sizeof(char *)); + Port::omrmem_free((void **)&entries); + } + entries = newEntries; + entryCapacity = newCapacity; + } + /* the array takes ownership of the name allocated by findfirst/findnext */ + entries[entryCount] = resultBuffer; + entryCount += 1; + resultBuffer = NULL; } + rc = Port::omrfile_findnext(handle, &resultBuffer); + } + Port::omrfile_findclose(handle); + handle = PORT_INVALID_FIND_FILE_HANDLE; + + if (0 != entryCount) { + qsort(entries, entryCount, sizeof(char *), compareEntryNames); + } + + for (index = 0; index < entryCount; index += 1) { + const char *entryName = entries[index]; + size_t nextEntrySize = strlen(dirName) + strlen(PATH_SEP) + strlen(entryName) + 1; + char *nextEntry = (char *)Port::omrmem_calloc(1, nextEntrySize); + struct J9FileStat buf; - nextEntrySize = strlen(dirName) + 1 /* PATH_SEP */ + strlen(resultBuffer) + 1; - nextEntry = (char *)Port::omrmem_calloc(1, nextEntrySize); if (NULL == nextEntry) { goto failed; } - snprintf(nextEntry, nextEntrySize, "%s" PATH_SEP "%s", dirName, resultBuffer); + snprintf(nextEntry, nextEntrySize, "%s" PATH_SEP "%s", dirName, entryName); - struct J9FileStat buf; if (RC_OK != Port::omrfile_stat(nextEntry, 0, &buf)) { if (options->statErrorsAreFatal) { printError("stat failed %s\n", nextEntry); + Port::omrmem_free((void **)&nextEntry); goto failed; } } else if (buf.isDir) { visitDirectory(options, nextEntry, fileExtFilter, targetObject, callback); } else { - const char *ext = FileUtils::getFileExt(resultBuffer); + const char *ext = FileUtils::getFileExt(entryName); if (NULL != ext) { if (0 == strcmp(ext, fileExtFilter)) { callback(targetObject, options, nextEntry); @@ -165,17 +227,17 @@ FileUtils::visitDirectory(J9TDFOptions *options, const char *dirName, const char } } Port::omrmem_free((void **)&nextEntry); -next: - Port::omrmem_free((void **)&resultBuffer); - rc = Port::omrfile_findnext(handle, &resultBuffer); } - Port::omrfile_findclose(handle); + freeEntryNames(&entries, entryCount); return RC_OK; failed: - Port::omrfile_findclose(handle); + if (PORT_INVALID_FIND_FILE_HANDLE != handle) { + Port::omrfile_findclose(handle); + } Port::omrmem_free((void **)&resultBuffer); + freeEntryNames(&entries, entryCount); return RC_FAILED; }
