Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package nodejs26 for openSUSE:Factory checked in at 2026-08-26 19:55:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/nodejs26 (Old) and /work/SRC/openSUSE:Factory/.nodejs26.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "nodejs26" Wed Aug 26 19:55:32 2026 rev:4 rq:1373780 version:26.7.0 Changes: -------- --- /work/SRC/openSUSE:Factory/nodejs26/nodejs26.changes 2026-08-02 23:14:34.096571368 +0200 +++ /work/SRC/openSUSE:Factory/.nodejs26.new.1258/nodejs26.changes 2026-08-26 19:55:42.339942136 +0200 @@ -1,0 +2,38 @@ +Tue Aug 25 10:56:32 UTC 2026 - Adam Majer <[email protected]> + +- Update to 26.7.0: + - crypto: support loading private keys through STORE loaders + - lib: add perfetto support + - module: implement Symbol.dispose in ModuleHooks + - st_runner: add support for --test-coverage-include-all + +For details, see https://github.com/nodejs/node/releases#release-v26.7.0 + +- fix_ci_tests.patch: look up libnode location instead of hardcoding it +- no_avx2_on_i586.patch: remove AVX2 from i586 + +------------------------------------------------------------------- +Tue Aug 25 10:39:43 UTC 2026 - Adam Majer <[email protected]> + +- npm-line-truncation.patch: do not truncate long lines in help output (bsc#1276224) + +------------------------------------------------------------------- +Mon Aug 3 14:39:30 UTC 2026 - Adam Majer <[email protected]> + +- Add shared library (bsc#1174792) +- versioned.patch: use libnode.so.* instead of versioning it + as soname is already unique between major versions +- no-rpath.patch: remove fixed RPATH + +------------------------------------------------------------------- +Mon Aug 3 14:27:08 UTC 2026 - Adam Majer <[email protected]> + +- Update to 26.6.0: + - ffi: add getCurrentEventLoop + - test_runner: add context.log() and test:log event + - test_runner: report entryFile in TestStream events + +- CVE-2026-54272: ip-address.patch: misclassification of IPv4-mapped/NAT64 IPv6 addresses allows for bypass of SSRF and trust-boundary checks (bsc#1272882) +- For details, see https://github.com/nodejs/node/releases#release-v26.6.0 + +------------------------------------------------------------------- Old: ---- node-v26.5.1.tar.xz New: ---- ip-address.patch no-rpath.patch no_avx2_on_i586.patch node-v26.7.0.tar.xz npm-line-truncation.patch ----------(New B)---------- New: - CVE-2026-54272: ip-address.patch: misclassification of IPv4-mapped/NAT64 IPv6 addresses allows for bypass of SSRF and trust-boundary checks (bsc#1272882) - For details, see https://github.com/nodejs/node/releases#release-v26.6.0 New: as soname is already unique between major versions - no-rpath.patch: remove fixed RPATH New:- fix_ci_tests.patch: look up libnode location instead of hardcoding it - no_avx2_on_i586.patch: remove AVX2 from i586 New: - npm-line-truncation.patch: do not truncate long lines in help output (bsc#1276224) ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ nodejs26.spec ++++++ --- /var/tmp/diff_new_pack.ugfhMK/_old 2026-08-26 19:55:44.920033256 +0200 +++ /var/tmp/diff_new_pack.ugfhMK/_new 2026-08-26 19:55:44.922033326 +0200 @@ -25,7 +25,7 @@ %endif Name: nodejs26 -Version: 26.5.1 +Version: 26.7.0 Release: 0 # Double DWZ memory limits @@ -119,8 +119,12 @@ ## Patches not distribution specific Patch1: v8-i586.patch +Patch2: no-rpath.patch Patch3: fix_ci_tests.patch +Patch4: no_avx2_on_i586.patch Patch5: icu_781.patch +Patch6: ip-address.patch +Patch7: npm-line-truncation.patch ## Patches specific to SUSE and openSUSE # PATCH-FIX-OPENSUSE -- set correct path for dtrace if it is built @@ -223,7 +227,7 @@ %if ! 0%{with intree_cares} BuildRequires: pkgconfig(libcares) >= 1.17.0 %else -Provides: bundled(libcares2) = 1.34.6 +Provides: bundled(libcares2) = 1.34.8 %endif %if %node_version_number >= 22 @@ -242,7 +246,7 @@ %if ! 0%{with intree_nghttp2} BuildRequires: libnghttp2-devel >= 1.41.0 %else -Provides: bundled(nghttp2) = 1.69.0 +Provides: bundled(nghttp2) = 1.70.0 %endif %if 0%{with valgrind_tests} @@ -301,17 +305,18 @@ # bundled url-ada parser, not ada Provides: bundled(LIEF) = 0.17.0 -Provides: bundled(ada) = 3.4.4 +Provides: bundled(ada) = 4.0.0 Provides: bundled(libuv) = 1.52.1 Provides: bundled(llhttp) = 9.4.3 Provides: bundled(merve) = 1.2.2 -Provides: bundled(ngtcp2) = 1.23.0 -Provides: bundled(node-acorn) = 8.17.0 +Provides: bundled(nghttp3) = 1.18.0 +Provides: bundled(ngtcp2) = 1.25.0 +Provides: bundled(node-acorn) = 8.18.0 Provides: bundled(node-acorn-walk) = 8.3.5 -Provides: bundled(node-amaro) = 1.1.10 -Provides: bundled(node-minimatch) = 10.2.5 +Provides: bundled(node-amaro) = 1.1.11 +Provides: bundled(node-minimatch) = 10.2.6 Provides: bundled(node-undici) = 8.9.0 -Provides: bundled(simdjson) = 4.6.4 +Provides: bundled(simdjson) = 4.6.6 Provides: bundled(uvwasi) = 0.0.23 Provides: bundled(v8) = 14.6.202.34 ## END NON-NPM PROVIDES ## @@ -360,7 +365,7 @@ Provides: bundled(node-balanced-match) = 4.0.4 Provides: bundled(node-bin-links) = 6.0.2 Provides: bundled(node-binary-extensions) = 3.1.0 -Provides: bundled(node-brace-expansion) = 5.0.6 +Provides: bundled(node-brace-expansion) = 5.0.7 Provides: bundled(node-cacache) = 20.0.4 Provides: bundled(node-chalk) = 5.6.2 Provides: bundled(node-chownr) = 3.0.0 @@ -395,11 +400,11 @@ Provides: bundled(node-just-diff) = 6.0.2 Provides: bundled(node-just-diff-apply) = 5.5.0 Provides: bundled(node-libnpmaccess) = 10.0.3 -Provides: bundled(node-libnpmdiff) = 8.1.10 -Provides: bundled(node-libnpmexec) = 10.3.0 -Provides: bundled(node-libnpmfund) = 7.0.24 +Provides: bundled(node-libnpmdiff) = 8.1.12 +Provides: bundled(node-libnpmexec) = 10.3.2 +Provides: bundled(node-libnpmfund) = 7.0.26 Provides: bundled(node-libnpmorg) = 8.0.1 -Provides: bundled(node-libnpmpack) = 9.1.10 +Provides: bundled(node-libnpmpack) = 9.1.12 Provides: bundled(node-libnpmpublish) = 11.2.0 Provides: bundled(node-libnpmsearch) = 9.0.1 Provides: bundled(node-libnpmteam) = 8.0.2 @@ -427,7 +432,7 @@ Provides: bundled(node-npm-package-arg) = 13.0.2 Provides: bundled(node-npm-packlist) = 10.0.4 Provides: bundled(node-npm-pick-manifest) = 11.0.3 -Provides: bundled(node-npm-profile) = 12.0.1 +Provides: bundled(node-npm-profile) = 12.0.2 Provides: bundled(node-npm-registry-fetch) = 19.1.1 Provides: bundled(node-npm-user-validate) = 4.0.0 Provides: bundled(node-p-map) = 7.0.4 @@ -445,7 +450,7 @@ Provides: bundled(node-read) = 5.0.1 Provides: bundled(node-read-cmd-shim) = 6.0.0 Provides: bundled(node-safer-buffer) = 2.1.2 -Provides: bundled(node-semver) = 7.8.4 +Provides: bundled(node-semver) = 7.8.5 Provides: bundled(node-signal-exit) = 4.1.0 Provides: bundled(node-sigstore) = 4.1.1 Provides: bundled(node-smart-buffer) = 4.2.0 @@ -456,13 +461,13 @@ Provides: bundled(node-spdx-license-ids) = 3.0.23 Provides: bundled(node-ssri) = 13.0.1 Provides: bundled(node-supports-color) = 10.2.2 -Provides: bundled(node-tar) = 7.5.16 +Provides: bundled(node-tar) = 7.5.19 Provides: bundled(node-text-table) = 0.2.0 Provides: bundled(node-tiny-relative-date) = 2.0.2 Provides: bundled(node-tinyglobby) = 0.2.17 Provides: bundled(node-treeverse) = 3.0.0 Provides: bundled(node-tuf-js) = 4.1.0 -Provides: bundled(node-undici) = 6.26.0 +Provides: bundled(node-undici) = 6.27.0 Provides: bundled(node-util-deprecate) = 1.0.2 Provides: bundled(node-validate-npm-package-name) = 7.0.2 Provides: bundled(node-walk-up-path) = 4.0.0 @@ -596,6 +601,8 @@ %endif %if %{node_version_number} >= 22 --shared-zstd \ + --shared \ + --libdir=%_lib \ %endif %if %{node_version_number} >= 16 && (0%{?suse_version} > 1550 || 0%{?sle_version} >= 150400) --openssl-default-cipher-list=PROFILE=SYSTEM \ @@ -612,6 +619,11 @@ . ./spec.build.config decoupled_cmd %make_install %{?_smp_mflags} + +pushd %{buildroot}%{_libdir} +ln -s libnode.so.* %{buildroot}%{_libdir}/libnode.so +popd + rm %{buildroot}%{_datadir}/doc/node/gdbinit rm -f %{buildroot}%{_datadir}/doc/node/lldbinit rm -f %{buildroot}%{_datadir}/doc/node/lldb_commands.py @@ -710,6 +722,7 @@ export CI_JS_SUITES=default export NODE_TEST_NO_INTERNET=1 +export LD_LIBRARY_PATH=%{buildroot}%{_libdir} %ifarch %{ix86} %{arm} rm -f test/parallel/test-fs-utimes-y2K38.js @@ -802,6 +815,7 @@ %dir %{_datadir}/libalternatives/node %{_datadir}/libalternatives/node/%{node_version_number}.conf %{_bindir}/node%{node_version_number} +%{_libdir}/libnode.so.* %{_mandir}/man1/node%{node_version_number}.1%{ext_man} %if ! 0%{with libalternatives} %ghost %{_bindir}/node-default @@ -844,6 +858,7 @@ %files devel %defattr(-, root, root) %{_includedir}/node%{node_version_number} +%{_libdir}/libnode.so %if %{node_version_number} < 19 %dir %{_datadir}/systemtap %dir %{_datadir}/systemtap/tapset ++++++ SHASUMS256.txt ++++++ --- /var/tmp/diff_new_pack.ugfhMK/_old 2026-08-26 19:55:45.019036752 +0200 +++ /var/tmp/diff_new_pack.ugfhMK/_new 2026-08-26 19:55:45.024036929 +0200 @@ -1,33 +1,33 @@ -0bafe816b17bcaee285e79e325b7a44eea605d12d81b2caa78cddcadf5d1b5f6 node-v26.5.1-aix-ppc64.tar.gz -01875f52263953ad81972d304263f36a71e5e97873fa9fa60989e8973d18d00b node-v26.5.1-arm64.msi -f4387df0b46556516d19abf2f2d6806481ac8368aa7f9d96bafed422a56a1d01 node-v26.5.1-darwin-arm64.tar.gz -f4665a1e764653ec6fe7686309e8907e9ebb9ba68c4b88b9185fdc29f221559b node-v26.5.1-darwin-arm64.tar.xz -077d5c936868dab19d21f77f1e71ce13697e80b3e86a399dcab238902a2ebf93 node-v26.5.1-darwin-x64.tar.gz -4436be8db0e2bd5ca3dee8c48aa8a157c9a8fef99580036ff1da8ef6aba44708 node-v26.5.1-darwin-x64.tar.xz -598a3139679db65461f8af50463d668008eaee5e0d09df4eeaa27f3eeefecc03 node-v26.5.1-headers.tar.gz -f72d24a5a34b40ba738f6d28cdcd50e3f4976558d4f14bebfa64fdbdcfc4951a node-v26.5.1-headers.tar.xz -21194bbf41c18d9ec277545c4d14cce8597d57a9d9f494c323d8121a25de33e8 node-v26.5.1-linux-arm64.tar.gz -0b6b0cc2a1eecbe736f9918de8b5a6c9a48d286b88bec1298a3c1e3376182ea8 node-v26.5.1-linux-arm64.tar.xz -cf518dd2772ea7e5046daf4a4ba9e348fce01e2b9741f32ba21b4bbd87b8dfaf node-v26.5.1-linux-ppc64le.tar.gz -692d0c45896bf232e22b8b64a4a826ed0a70fec75545f208d120c109d0a86752 node-v26.5.1-linux-ppc64le.tar.xz -af5a58fca0c3fc130c6a649bd6c29f4b000145055eb7a364bde189abdf1516f5 node-v26.5.1-linux-s390x.tar.gz -ff4635062f82308dda7c7164337ad9bb383568dac984ff64b35b888e7d7a4ef3 node-v26.5.1-linux-s390x.tar.xz -2b07f09c218d473a26442bff5a90151f53f7b7c0a23bad244eda2c26303a2ba7 node-v26.5.1-linux-x64.tar.gz -cc7b3484ade63bd203a9d304f21ec37a3b622b988d7bdecf1dc4d68fc44a91b7 node-v26.5.1-linux-x64.tar.xz -a6e6cfdb0af6d7d68b50a6f663b8ff321923089309076ea7943a19dbe5eb662a node-v26.5.1-win-arm64.7z -467f425228a2fdcc83a330f5f38b124b5b43b42f5033d7848b4e47c9becc36f9 node-v26.5.1-win-arm64.zip -0c8a1a3604e57400432089cf7e179eac4f25b26445a156aaa98cca5619e50f5c node-v26.5.1-win-x64.7z -c432c996b95cbf7568f13a0fbb37526de84a27e3a5c520c3be15f05a9a168212 node-v26.5.1-win-x64.zip -826a4551bb9d3c00c61c17a2521a1e901ac7304e3090a3c2d07c1e0fe2b4d60d node-v26.5.1-x64.msi -ae175856e12aadc081a539af37a70a71d3233b2e710fa00266137e23e24faca2 node-v26.5.1.pkg -1143281232fc4640188aaa20afb0f9c4f06031f554cd3f1e5ac86e8a0387511a node-v26.5.1.tar.gz -df7770a9a99346f8b73ba6d31ad89bd6f868b51c7387c3627dcb44ca065f4948 node-v26.5.1.tar.xz -c6ca33154ee426f46e02aa9f5676d69b768808b564aa22652fe18bb08c188fe5 win-arm64/node.exe +6a26e53441fb7e1097fa0b19616000a030a9b96156eb15a0fe22682cfdf19ad2 node-v26.7.0-aix-ppc64.tar.gz +1c0b19dbbdc485aae6a2a43a647c94ba3b75cb5f191d154f6798344fc84721e3 node-v26.7.0-arm64.msi +7ee659a7768e641bbfd5360940660b8e8fd0052f77488f365562bac522fc15d4 node-v26.7.0-darwin-arm64.tar.gz +595d2f934e081b82961d1a5fd41c6dbd0c5a952d9e8be5b4566ab754426968d2 node-v26.7.0-darwin-arm64.tar.xz +f279d1ed28ce57f7788bf23435d2ad7fdd7438904ad5c4d8a1081a7cde3d4b96 node-v26.7.0-darwin-x64.tar.gz +bd19c6b98d923fb049f64b547163b9f7d52ae73f16fdee09ecef9ab248c4d6ff node-v26.7.0-darwin-x64.tar.xz +00ef24b4724342592aa7a14f9105282a59a7397c8ff7a28166243f5029ce2217 node-v26.7.0-headers.tar.gz +453153ebefe7999965211df9ad3029f99a3c57b89eded9862e17be7ee0aaf1ba node-v26.7.0-headers.tar.xz +925aa6157dd37542d0d7f2e28b7bf61e7b39284411210b0498bc3788db4aef68 node-v26.7.0-linux-arm64.tar.gz +afc7a004018485092ac8985b817b0d5684472bd9472e0b57d2ab88737e50090d node-v26.7.0-linux-arm64.tar.xz +b41dfc68169e20e54d79e0b0443d0acf5b652535a4010a3258d6ddb1d118d914 node-v26.7.0-linux-ppc64le.tar.gz +c3f7cd5c9e149dce1f5955b182c21468ffa20f602aba863ca93cb198b76c07ea node-v26.7.0-linux-ppc64le.tar.xz +c335e3a78ff723f36c17929390d1bd4003f267befba12c92764acbf6a37267ee node-v26.7.0-linux-s390x.tar.gz +ff3a5c7b93a2ec4c6188ed9992495363a22892853db7ce466b57ce55119d20f4 node-v26.7.0-linux-s390x.tar.xz +bd6b6c31e377bad9ad579bed72e5bc11f4c879ac9452ad51d30e646ea3d828df node-v26.7.0-linux-x64.tar.gz +982aa24dd8be4c889c6a8ab337ddff3b0896645b20f4239356e80552c16277ee node-v26.7.0-linux-x64.tar.xz +a1d534dcb6c060f486d88e126318657725569da9d30cbb47a26ef6cf0d5afa60 node-v26.7.0-win-arm64.7z +be8775204cfceca5a73c30f91bf0de5e85274c01b776dc13f16b91aa251ebb01 node-v26.7.0-win-arm64.zip +073be1a597ff9f0130b067fb35eb84225d3970fdd7a84ee898f4b6270aadec0f node-v26.7.0-win-x64.7z +d3bd72755141ed32bbcd841228ee81897c8a98d50dfa7dae2179399a0a7c90f8 node-v26.7.0-win-x64.zip +28dd9d5e53f829a32310a4fed334000a1681a7534641c599d05617f893c06a2b node-v26.7.0-x64.msi +18a470bd132cb3b135455304ae7c86aea23bdd7dce9af5d2fc257ddd2f9a9943 node-v26.7.0.pkg +e7feefd8d65781c9bbca1a128f8c80b357275156e6e15a3ed32cb7992035bdb2 node-v26.7.0.tar.gz +e6b182cbeeab032d1082ca4ac4fe15e3a57de691d3bde78ecf8a761fd56ee356 node-v26.7.0.tar.xz +ed13b0ca216ef8d9e8a1781cf26e95ec7f56983d25beaf46b01cb472132d8e80 win-arm64/node.exe c01ce0d5e4e956f0e5e73cdba925d15a6d6f86883aa49f8f0b0de87aa93508ce win-arm64/node.lib -83961c8a59f1771a2e0ffcf89487b3fa0a7ca18a69f1061683c27671b36665e5 win-arm64/node_pdb.7z -7b40fa280b35d3aef700852220075f262a25c4cdd9a6f90fb8a3a4b1bed9cf8b win-arm64/node_pdb.zip -b48b0224081224cda1f49374e2fc63d143041ade51754f0cc6608fe8510ba29e win-x64/node.exe +ca037cb8e6ee9029cd5059ad61c1aedf5e7910ba08fa6c6faac2d4f46a7fcb22 win-arm64/node_pdb.7z +5fa0b2b4656f3ccf3e4c0724a5fb8dec73ce34857a47e7921f969de16ed20e25 win-arm64/node_pdb.zip +e921fe5307e29bf6fd00000dd594356affd3a7b044e52720c7f10decbdc305b9 win-x64/node.exe 56f06350037085fce04930befd98327afc86ee46f52af6f6f8a68a03630e8380 win-x64/node.lib -cbd18315c40cb831d1a398c0df64a43876999e77eb56b52589b64ee8a5bf93d0 win-x64/node_pdb.7z -fb3b232e033a25d0aae20c0413589569688807471e98a1620ef7f7ec959fbf83 win-x64/node_pdb.zip +c88a9b921f1fd208c2988c5a927d147a3e1dc780549b4f214a18019fec9179c8 win-x64/node_pdb.7z +1b226fa023bdca9c29d93f908eb1ffc32eb43744840eae5b3dd0a940e281429c win-x64/node_pdb.zip ++++++ SHASUMS256.txt.sig ++++++ Binary files /var/tmp/diff_new_pack.ugfhMK/_old and /var/tmp/diff_new_pack.ugfhMK/_new differ ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.ugfhMK/_old 2026-08-26 19:55:45.127040566 +0200 +++ /var/tmp/diff_new_pack.ugfhMK/_new 2026-08-26 19:55:45.136040884 +0200 @@ -1,6 +1,6 @@ -mtime: 1785512532 -commit: 10a80b222b7bb32dde8050f3c4136021153459322528c63d4f3a05030fead613 +mtime: 1787738537 +commit: 28b3eaf1e60d4baa367ed93c476851a99b32521593446561096152c66d2e07a7 url: https://src.opensuse.org/nodejs/nodejs26 -revision: 10a80b222b7bb32dde8050f3c4136021153459322528c63d4f3a05030fead613 +revision: 28b3eaf1e60d4baa367ed93c476851a99b32521593446561096152c66d2e07a7 projectscmsync: https://src.opensuse.org/nodejs/_ObsPrj.git ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-08-26 12:02:17.000000000 +0200 @@ -0,0 +1,8 @@ +*.obscpio +*.osc +_build.* +.pbuild +.assets +*.obsinfo +_service:* +nodejs26-*-build/ ++++++ fix_ci_tests.patch ++++++ --- /var/tmp/diff_new_pack.ugfhMK/_old 2026-08-26 19:55:45.376049361 +0200 +++ /var/tmp/diff_new_pack.ugfhMK/_new 2026-08-26 19:55:45.383049608 +0200 @@ -2,10 +2,10 @@ Date: Dec 20 09:18:49 UTC 2017 Summary: Fix CI unit tests framework for OBS building -Index: node-v26.2.0/test/parallel/test-module-loading-globalpaths.js +Index: node-v26.7.0/test/parallel/test-module-loading-globalpaths.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-module-loading-globalpaths.js -+++ node-v26.2.0/test/parallel/test-module-loading-globalpaths.js +--- node-v26.7.0.orig/test/parallel/test-module-loading-globalpaths.js ++++ node-v26.7.0/test/parallel/test-module-loading-globalpaths.js @@ -11,6 +11,9 @@ const { addLibraryPath } = require('../c addLibraryPath(process.env); @@ -16,10 +16,10 @@ if (process.argv[2] === 'child') { console.log(require(pkgName).string); } else { -Index: node-v26.2.0/test/parallel/test-tls-passphrase.js +Index: node-v26.7.0/test/parallel/test-tls-passphrase.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-tls-passphrase.js -+++ node-v26.2.0/test/parallel/test-tls-passphrase.js +--- node-v26.7.0.orig/test/parallel/test-tls-passphrase.js ++++ node-v26.7.0/test/parallel/test-tls-passphrase.js @@ -223,7 +223,7 @@ server.listen(0, common.mustCall(functio }, onSecureConnect()); })).unref(); @@ -29,10 +29,10 @@ // Missing passphrase assert.throws(function() { -Index: node-v26.2.0/test/parallel/test-repl-envvars.js +Index: node-v26.7.0/test/parallel/test-repl-envvars.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-repl-envvars.js -+++ node-v26.2.0/test/parallel/test-repl-envvars.js +--- node-v26.7.0.orig/test/parallel/test-repl-envvars.js ++++ node-v26.7.0/test/parallel/test-repl-envvars.js @@ -3,6 +3,8 @@ // Flags: --expose-internals @@ -42,10 +42,10 @@ const stream = require('stream'); const { describe, test } = require('node:test'); const REPL = require('internal/repl'); -Index: node-v26.2.0/Makefile +Index: node-v26.7.0/Makefile =================================================================== ---- node-v26.2.0.orig/Makefile -+++ node-v26.2.0/Makefile +--- node-v26.7.0.orig/Makefile ++++ node-v26.7.0/Makefile @@ -414,7 +414,6 @@ ADDONS_HEADERS_PREREQS := tools/install. $(wildcard deps/uv/include/*/*.h) \ $(wildcard deps/v8/include/*.h) \ @@ -72,10 +72,10 @@ echo "Skipping tools/doc/node_modules (no crypto and/or no ICU)"; \ else \ cd tools/doc && $(call available-node,$(run-npm-ci)) \ -Index: node-v26.2.0/tools/test.py +Index: node-v26.7.0/tools/test.py =================================================================== ---- node-v26.2.0.orig/tools/test.py -+++ node-v26.2.0/tools/test.py +--- node-v26.7.0.orig/tools/test.py ++++ node-v26.7.0/tools/test.py @@ -1400,7 +1400,7 @@ def BuildOptions(): result.add_argument("-s", "--suite", help="A test suite", default=[], action="append") @@ -85,10 +85,10 @@ result.add_argument("--arch", help='The architecture to run tests for', default='none') result.add_argument("--snapshot", help="Run the tests with snapshot turned on", -Index: node-v26.2.0/test/parallel/test-crypto-dh.js +Index: node-v26.7.0/test/parallel/test-crypto-dh.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-crypto-dh.js -+++ node-v26.2.0/test/parallel/test-crypto-dh.js +--- node-v26.7.0.orig/test/parallel/test-crypto-dh.js ++++ node-v26.7.0/test/parallel/test-crypto-dh.js @@ -93,7 +93,7 @@ const { dh3.computeSecret(''); }, { message: process.features.openssl_is_boringssl ? @@ -98,10 +98,10 @@ } } -Index: node-v26.2.0/test/parallel/test-dns.js +Index: node-v26.7.0/test/parallel/test-dns.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-dns.js -+++ node-v26.2.0/test/parallel/test-dns.js +--- node-v26.7.0.orig/test/parallel/test-dns.js ++++ node-v26.7.0/test/parallel/test-dns.js @@ -451,7 +451,7 @@ assert.throws(() => { const server = dgram.createSocket('udp4'); @@ -111,10 +111,10 @@ const parsed = dnstools.parseDNSPacket(msg); const domain = parsed.questions[0].domain; assert.strictEqual(domain, 'example.org'); -Index: node-v26.2.0/test/wpt/test-webcrypto.js +Index: node-v26.7.0/test/wpt/test-webcrypto.js =================================================================== ---- node-v26.2.0.orig/test/wpt/test-webcrypto.js -+++ node-v26.2.0/test/wpt/test-webcrypto.js +--- node-v26.7.0.orig/test/wpt/test-webcrypto.js ++++ node-v26.7.0/test/wpt/test-webcrypto.js @@ -1,7 +1,8 @@ 'use strict'; @@ -125,10 +125,10 @@ common.skip('missing crypto'); const { WPTRunner } = require('../common/wpt'); -Index: node-v26.2.0/test/parallel/test-sqlite.js +Index: node-v26.7.0/test/parallel/test-sqlite.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-sqlite.js -+++ node-v26.2.0/test/parallel/test-sqlite.js +--- node-v26.7.0.orig/test/parallel/test-sqlite.js ++++ node-v26.7.0/test/parallel/test-sqlite.js @@ -243,6 +243,7 @@ suite('SQL APIs enabled at build time', }); @@ -153,10 +153,10 @@ const db = new DatabaseSync(':memory:'); db.exec(` CREATE VIRTUAL TABLE t1 USING geopoly(a,b,c); -Index: node-v26.2.0/test/parallel/test-internal-util-construct-sab.js +Index: node-v26.7.0/test/parallel/test-internal-util-construct-sab.js =================================================================== ---- node-v26.2.0.orig/test/parallel/test-internal-util-construct-sab.js -+++ node-v26.2.0/test/parallel/test-internal-util-construct-sab.js +--- node-v26.7.0.orig/test/parallel/test-internal-util-construct-sab.js ++++ node-v26.7.0/test/parallel/test-internal-util-construct-sab.js @@ -1,7 +1,6 @@ // Flags: --enable-sharedarraybuffer-per-context --expose-internals 'use strict'; @@ -165,11 +165,11 @@ const assert = require('assert'); const { kMaxLength } = require('buffer'); const { isSharedArrayBuffer } = require('util/types'); -Index: node-v26.2.0/test/common/index.js +Index: node-v26.7.0/test/common/index.js =================================================================== ---- node-v26.2.0.orig/test/common/index.js -+++ node-v26.2.0/test/common/index.js -@@ -968,6 +968,7 @@ function resolveBuiltBinary(binary) { +--- node-v26.7.0.orig/test/common/index.js ++++ node-v26.7.0/test/common/index.js +@@ -1003,6 +1003,7 @@ function resolveBuiltBinary(binary) { const common = { allowGlobals, @@ -177,10 +177,10 @@ buildType, canCreateSymLink, childShouldThrowAndAbort, -Index: node-v26.2.0/test/common/index.mjs +Index: node-v26.7.0/test/common/index.mjs =================================================================== ---- node-v26.2.0.orig/test/common/index.mjs -+++ node-v26.2.0/test/common/index.mjs +--- node-v26.7.0.orig/test/common/index.mjs ++++ node-v26.7.0/test/common/index.mjs @@ -5,6 +5,7 @@ const common = require('./index.js'); const { @@ -189,4 +189,40 @@ buildType, canCreateSymLink, childShouldThrowAndAbort, +Index: node-v26.7.0/test/common/shared-lib-util.js +=================================================================== +--- node-v26.7.0.orig/test/common/shared-lib-util.js ++++ node-v26.7.0/test/common/shared-lib-util.js +@@ -1,6 +1,7 @@ + 'use strict'; + const common = require('../common'); + const path = require('path'); ++const fs = require('fs'); + + const kNodeShared = Boolean(process.config.variables.node_shared); + const kShlibSuffix = process.config.variables.shlib_suffix; +@@ -35,6 +36,23 @@ function getSharedLibPath() { + if (common.isWindows) { + return path.join(kExecPath, 'node.dll'); + } ++ ++ // On Linux/Unix, dynamically find the real loaded library path from the process memory map ++ try { ++ const maps = fs.readFileSync('/proc/self/maps', 'utf8'); ++ const targetLib = `libnode.${kShlibSuffix}`; ++ for (const line of maps.split('\n')) { ++ if (line.includes(targetLib)) { ++ const match = line.match(/(\/\S+)/); ++ if (match) { ++ return match[1]; ++ } ++ } ++ } ++ } catch { ++ // Graceful fallback if /proc/self/maps is unavailable ++ } ++ + return path.join(kExecPath, `libnode.${kShlibSuffix}`); + } + ++++++ ip-address.patch ++++++ Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/common.js =================================================================== --- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/common.js +++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/common.js @@ -1,20 +1,43 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isInSubnet = isInSubnet; +exports.isHostInSubnet = isHostInSubnet; exports.isCorrect = isCorrect; exports.prefixLengthFromMask = prefixLengthFromMask; exports.numberToPaddedHex = numberToPaddedHex; exports.stringToPaddedHex = stringToPaddedHex; exports.testBit = testBit; const address_error_1 = require("./address-error"); +/** + * Returns whether this address's *network* is contained within `address`, + * i.e. whether every address this one can represent also falls inside + * `address`. A network wider than `address` is not contained in it, so + * `10.0.0.0/8` is not in `10.0.0.0/16`. + * + * To ask whether the address itself falls inside a range, ignoring any CIDR + * suffix it was written with, use {@link isHostInSubnet} instead. That is the + * question the special-use classifiers ask. + */ function isInSubnet(address) { if (this.subnetMask < address.subnetMask) { return false; } - if (this.mask(address.subnetMask) === address.mask()) { - return true; - } - return false; + return isHostInSubnet.call(this, address); +} +/** + * Returns whether this address's host bits fall inside `address`, ignoring + * this address's own subnet mask. + * + * This is the primitive the special-use classifiers (`isLoopback`, + * `isPrivate`, `isLinkLocal`, `getType`, …) are built on: they answer a + * question about the address, so the answer must not change with the CIDR + * suffix the caller happened to write. Use this rather than + * {@link isInSubnet} when classifying a single address — notably when the + * address came from untrusted input and the result backs a trust-boundary + * decision such as an SSRF allow/deny filter. + */ +function isHostInSubnet(address) { + return this.mask(address.subnetMask) === address.mask(); } function isCorrect(defaultBits) { return function () { Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv4.js =================================================================== --- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/ipv4.js +++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv4.js @@ -35,6 +35,7 @@ const isCorrect4 = common.isCorrect(cons */ class Address4 { constructor(address) { + this.addressMinusSuffix = ''; this.groups = constants.GROUPS; this.parsedAddress = []; this.parsedSubnet = ''; @@ -51,6 +52,13 @@ class Address4 { * @returns {boolean} */ this.isInSubnet = common.isInSubnet; + /** + * Returns true if this address's host bits fall inside the given subnet, + * ignoring this address's own subnet mask. See + * {@link common.isHostInSubnet}. + * @returns {boolean} + */ + this.isHostInSubnet = common.isHostInSubnet; this.address = address; const subnet = constants.RE_SUBNET_STRING.exec(address); if (subnet) { @@ -403,49 +411,49 @@ class Address4 { * @returns {boolean} */ isMulticast() { - return this.isInSubnet(MULTICAST_V4); + return this.isHostInSubnet(MULTICAST_V4); } /** * Returns true if the address is in one of the [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private address ranges (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`). * @returns {boolean} */ isPrivate() { - return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet)); + return PRIVATE_V4.some((subnet) => this.isHostInSubnet(subnet)); } /** * Returns true if the address is in the loopback range `127.0.0.0/8` ([RFC 1122](https://datatracker.ietf.org/doc/html/rfc1122)). * @returns {boolean} */ isLoopback() { - return this.isInSubnet(LOOPBACK_V4); + return this.isHostInSubnet(LOOPBACK_V4); } /** * Returns true if the address is in the link-local range `169.254.0.0/16` ([RFC 3927](https://datatracker.ietf.org/doc/html/rfc3927)). * @returns {boolean} */ isLinkLocal() { - return this.isInSubnet(LINK_LOCAL_V4); + return this.isHostInSubnet(LINK_LOCAL_V4); } /** * Returns true if the address is the unspecified address `0.0.0.0`. * @returns {boolean} */ isUnspecified() { - return this.isInSubnet(UNSPECIFIED_V4); + return this.isHostInSubnet(UNSPECIFIED_V4); } /** * Returns true if the address is the limited broadcast address `255.255.255.255` ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)). * @returns {boolean} */ isBroadcast() { - return this.isInSubnet(BROADCAST_V4); + return this.isHostInSubnet(BROADCAST_V4); } /** * Returns true if the address is in the carrier-grade NAT range `100.64.0.0/10` ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)). * @returns {boolean} */ isCGNAT() { - return this.isInSubnet(CGNAT_V4); + return this.isHostInSubnet(CGNAT_V4); } /** * Returns a zero-padded base-2 string representation of the address @@ -463,7 +471,7 @@ class Address4 { */ groupForV6() { const segments = this.parsedAddress; - return this.address.replace(constants.RE_ADDRESS, `<span class="hover-group group-v4 group-6">${segments + return this.correctForm().replace(constants.RE_ADDRESS, `<span class="hover-group group-v4 group-6">${segments .slice(0, 2) .join('.')}</span>.<span class="hover-group group-v4 group-7">${segments .slice(2, 4) Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv6.js =================================================================== --- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/ipv6.js +++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv6.js @@ -98,6 +98,13 @@ class Address6 { */ this.isInSubnet = common.isInSubnet; /** + * Returns true if this address's host bits fall inside the given subnet, + * ignoring this address's own subnet mask. See + * {@link common.isHostInSubnet}. + * @returns {boolean} + */ + this.isHostInSubnet = common.isHostInSubnet; + /** * Returns true if the address is correct, false otherwise * @returns {boolean} */ @@ -184,9 +191,11 @@ class Address6 { let host; let port = null; let result; + // Remove the protocol prefix, if any + const stripped = url.replace(/^[a-z][a-z0-9+.-]*:\/\//i, ''); // If we have brackets parse them and find a port - if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) { - result = constants6.RE_URL_WITH_PORT.exec(url); + if (stripped.indexOf('[') !== -1 && stripped.indexOf(']:') !== -1) { + result = constants6.RE_URL_WITH_PORT.exec(stripped); if (result === null) { return { error: 'failed to parse address with port', @@ -196,13 +205,9 @@ class Address6 { } host = result[1]; port = result[2]; - // If there's a URL extract the address } - else if (url.indexOf('/') !== -1) { - // Remove the protocol prefix - url = url.replace(/^[a-z0-9]+:\/\//, ''); - // Parse the address - result = constants6.RE_URL.exec(url); + else { + result = constants6.RE_URL.exec(stripped); if (result === null) { return { error: 'failed to parse address from URL', @@ -210,11 +215,7 @@ class Address6 { port: null, }; } - host = result[1]; - // Otherwise just assign the URL to the host and let the library parse it - } - else { - host = url; + host = result[1] ?? result[2]; } // If there's a port convert it to an integer if (port) { @@ -493,7 +494,7 @@ class Address6 { getType() { for (let i = 0; i < TYPE_SUBNETS.length; i++) { const entry = TYPE_SUBNETS[i]; - if (this.isInSubnet(entry[0])) { + if (this.isHostInSubnet(entry[0])) { return entry[1]; } } @@ -638,7 +639,8 @@ class Address6 { const address4 = lastGroup.match(constants4.RE_ADDRESS); if (address4) { this.parsedAddress4 = address4[0]; - this.address4 = new ipv4_1.Address4(this.parsedAddress4); + const v4Suffix = this.subnetMask >= 96 ? `/${this.subnetMask - 96}` : ''; + this.address4 = new ipv4_1.Address4(`${this.parsedAddress4}${v4Suffix}`); for (let i = 0; i < this.address4.groups; i++) { if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) { // The prefix groups haven't been through the bad-character check @@ -734,7 +736,11 @@ class Address6 { return BigInt(`0x${this.parsedAddress.map(paddedHex).join('')}`); } /** - * Return the last two groups of this address as an IPv4 address string + * Return the last two groups of this address as an IPv4 address string. + * If this address carries a CIDR prefix that covers the trailing 32 bits + * (i.e. `subnetMask >= 96`), the resulting `Address4` inherits the + * corresponding v4 prefix (`subnetMask - 96`); otherwise it defaults to + * `/32`. * @returns {Address4} * @example * var address = new Address6('2001:4860:4001::1825:bf11'); @@ -742,7 +748,16 @@ class Address6 { */ to4() { const binary = this.binaryZeroPad().split(''); - return ipv4_1.Address4.fromHex(BigInt(`0b${binary.slice(96, 128).join('')}`).toString(16).padStart(8, '0')); + const hex = BigInt(`0b${binary.slice(96, 128).join('')}`).toString(16).padStart(8, '0'); + if (this.subnetMask >= 96) { + const v4Mask = this.subnetMask - 96; + const groups = []; + for (let i = 0; i < 8; i += 2) { + groups.push(parseInt(hex.slice(i, i + 2), 16)); + } + return new ipv4_1.Address4(`${groups.join('.')}/${v4Mask}`); + } + return ipv4_1.Address4.fromHex(hex); } /** * Return the v4-in-v6 form of the address @@ -756,7 +771,7 @@ class Address6 { if (!/:$/.test(correct)) { infix = ':'; } - return correct + infix + address4.address; + return correct + infix + address4.correctForm(); } /** * Decodes the Teredo tunneling fields embedded in this address. Returns the @@ -902,7 +917,7 @@ class Address6 { if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && pl !== 96) { throw new address_error_1.AddressError('NAT64 prefix length must be 32, 40, 48, 56, 64, or 96'); } - if (!this.isInSubnet(prefix6)) { + if (!this.isHostInSubnet(prefix6)) { return null; } const bits = this.binaryZeroPad(); @@ -982,7 +997,11 @@ class Address6 { * @returns {boolean} */ isLinkLocal() { - // Zeroes are required, i.e. we can't check isInSubnet with 'fe80::/10' + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLinkLocal(); + } + // Zeroes are required, i.e. we can't check isHostInSubnet with 'fe80::/10' if (this.getBitsBase2(0, 64) === '1111111010000000000000000000000000000000000000000000000000000000') { return true; @@ -994,6 +1013,10 @@ class Address6 { * @returns {boolean} */ isMulticast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isMulticast(); + } const type = this.getType(); return type === 'Multicast' || type.startsWith('Multicast '); } @@ -1016,27 +1039,54 @@ class Address6 { * @returns {boolean} */ isMapped4() { - return this.isInSubnet(IPV4_MAPPED_SUBNET); + return this.isHostInSubnet(IPV4_MAPPED_SUBNET); + } + /** + * If this address embeds a routable IPv4 address — i.e. it is IPv4-mapped + * (`::ffff:0:0/96`) or sits in the NAT64 well-known prefix (`64:ff9b::/96`, + * [RFC 6052](https://datatracker.ietf.org/doc/html/rfc6052)) — return that + * embedded address as an {@link Address4}; otherwise return null. + * + * The special-property checks (`isLoopback`, `isLinkLocal`, `isMulticast`, + * `isUnspecified`, `isPrivate`, `isCGNAT`, `isBroadcast`) call this first and + * delegate to the embedded {@link Address4} when present, so a literal such as + * `::ffff:127.0.0.1` is classified by what it actually reaches (loopback) + * rather than by its IPv6 wrapper (which `getType()` reports as IPv4-mapped). + * This matters wherever the checks back a trust-boundary decision (e.g. an + * SSRF allow/deny filter): without normalization, `::ffff:10.0.0.1`, + * `::ffff:169.254.169.254`, `64:ff9b::7f00:1`, etc. would all read as + * non-internal. + * @returns {Address4 | null} + */ + embeddedIPv4() { + if (this.isMapped4() || this.isHostInSubnet(NAT64_WELL_KNOWN_SUBNET)) { + return this.to4(); + } + return null; } /** * Returns true if the address is a Teredo address, false otherwise * @returns {boolean} */ isTeredo() { - return this.isInSubnet(TEREDO_SUBNET); + return this.isHostInSubnet(TEREDO_SUBNET); } /** * Returns true if the address is a 6to4 address, false otherwise * @returns {boolean} */ is6to4() { - return this.isInSubnet(SIX_TO_FOUR_SUBNET); + return this.isHostInSubnet(SIX_TO_FOUR_SUBNET); } /** * Returns true if the address is a loopback address, false otherwise * @returns {boolean} */ isLoopback() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLoopback(); + } return this.getType() === 'Loopback'; } /** @@ -1044,13 +1094,64 @@ class Address6 { * @returns {boolean} */ isULA() { - return this.isInSubnet(ULA_SUBNET); + return this.isHostInSubnet(ULA_SUBNET); + } + /** + * Returns true if the address is private, i.e. a Unique Local Address in + * `fc00::/7` ([RFC 4193](https://datatracker.ietf.org/doc/html/rfc4193)) or an + * IPv4-mapped / NAT64 address whose embedded IPv4 address is in one of the + * [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private ranges + * (e.g. `::ffff:10.0.0.1`). This is the IPv6 counterpart to + * {@link Address4.isPrivate}; use it instead of {@link isULA} when you need to + * catch mapped RFC 1918 addresses as well as native ULAs. + * @returns {boolean} + */ + isPrivate() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isPrivate(); + } + return this.isULA(); + } + /** + * Returns true if the address is an IPv4-mapped / NAT64 address whose embedded + * IPv4 address is in the carrier-grade NAT range `100.64.0.0/10` + * ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)), false + * otherwise. There is no native IPv6 CGNAT range, so this only ever returns + * true for an embedded IPv4 address (e.g. `::ffff:100.64.0.1`). + * @returns {boolean} + */ + isCGNAT() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isCGNAT(); + } + return false; + } + /** + * Returns true if the address is an IPv4-mapped / NAT64 address whose embedded + * IPv4 address is the limited broadcast address `255.255.255.255` + * ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)), false otherwise. + * There is no IPv6 broadcast, so this only ever returns true for an embedded + * IPv4 address (e.g. `::ffff:255.255.255.255`). + * @returns {boolean} + */ + isBroadcast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isBroadcast(); + } + return false; } /** * Returns true if the address is the unspecified address `::`. * @returns {boolean} */ isUnspecified() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isUnspecified(); + } return this.getType() === 'Unspecified'; } /** @@ -1058,7 +1159,7 @@ class Address6 { * @returns {boolean} */ isDocumentation() { - return this.isInSubnet(DOCUMENTATION_SUBNET); + return this.isHostInSubnet(DOCUMENTATION_SUBNET); } // #endregion // #region HTML @@ -1214,4 +1315,5 @@ const SIX_TO_FOUR_SUBNET = new Address6( const ULA_SUBNET = new Address6('fc00::/7'); const DOCUMENTATION_SUBNET = new Address6('2001:db8::/32'); const IPV4_MAPPED_SUBNET = new Address6('::ffff:0:0/96'); +const NAT64_WELL_KNOWN_SUBNET = new Address6('64:ff9b::/96'); //# sourceMappingURL=ipv6.js.map \ No newline at end of file Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/v6/constants.js =================================================================== --- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/v6/constants.js +++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/v6/constants.js @@ -44,6 +44,7 @@ exports.TYPES = { 'ff05::1:3/128': 'Multicast (All DHCP servers in this site)', '::/128': 'Unspecified', '::1/128': 'Loopback', + '::ffff:0:0/96': 'IPv4-mapped', 'ff00::/8': 'Multicast', 'fe80::/10': 'Link-local unicast', 'fc00::/7': 'Unique local', @@ -76,6 +77,6 @@ exports.RE_SUBNET_STRING = /\/\d{1,3}(?= * @static */ exports.RE_ZONE_STRING = /%.*$/; -exports.RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/; -exports.RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/; +exports.RE_URL = /^(?:\[([0-9a-f:.]+)\]|([0-9a-f:.]+))(?:[/?#].*)?$/i; +exports.RE_URL_WITH_PORT = /^\[([0-9a-f:.]+)\]:([0-9]{1,5})(?:[/?#].*)?$/i; //# sourceMappingURL=constants.js.map \ No newline at end of file Index: node-v24.18.1/deps/npm/node_modules/ip-address/package.json =================================================================== --- node-v24.18.1.orig/deps/npm/node_modules/ip-address/package.json +++ node-v24.18.1/deps/npm/node_modules/ip-address/package.json @@ -16,7 +16,7 @@ "bigint", "browser" ], - "version": "10.2.0", + "version": "10.2.2", "author": "Beau Gunderson <[email protected]> (https://beaugunderson.com/)", "license": "MIT", "main": "dist/ip-address.js", ++++++ maintainer_scripts.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maintainer_scripts/bundling.sh new/maintainer_scripts/bundling.sh --- old/maintainer_scripts/bundling.sh 2026-07-31 17:42:12.000000000 +0200 +++ new/maintainer_scripts/bundling.sh 2026-08-26 12:02:17.000000000 +0200 @@ -86,10 +86,11 @@ { extract_version_from_string_define ncrypto.h '#define NCRYPTO_VERSION ' } -# merged into ngtcp2 packages... +# merged into ngtcp2 packages... so we need full path as this is called directly now function load_nghttp3_version { - extract_version_from_string_define lib/includes/nghttp3/version.h 'NGHTTP3_VERSION ' + # extract_version_from_string_define lib/includes/nghttp3/version.h 'NGHTTP3_VERSION ' + extract_version_from_string_define ngtcp2/nghttp3/lib/includes/nghttp3/version.h 'NGHTTP3_VERSION ' } function load_ngtcp2_version { @@ -207,7 +208,7 @@ (icu-small) load_icu_small_version ;; - (ada|brotli|cares|http_parser|LIEF|merve|nbytes|ncrypto|nghttp2|nghttp3|openssl|uv|v8|llhttp|uvwasi|ngtcp2|npm|base64|simdutf|simdjson|zstd): + (ada|brotli|cares|http_parser|LIEF|merve|nbytes|ncrypto|nghttp2|openssl|uv|v8|llhttp|uvwasi|ngtcp2|npm|base64|simdutf|simdjson|zstd): load_${PKG}_version ;; (*): @@ -221,6 +222,19 @@ exit 20 fi } +function load_special_bundled_version +{ + local PKG=$1 + BUNDLED_VERSION="" + case $PKG in + (nghttp3): + load_${PKG}_version + esac + if [ -z "$BUNDLED_VERSION" ]; then + echo "!!! cannot get bundled version for $PKG! FIX!" + exit 20 + fi +} function find_npm_packages { local IS_NPM_MODE=$1 @@ -284,6 +298,9 @@ load_bundled_version cares; CARES_VER=$BUNDLED_VERSION load_bundled_version icu-small; ICU_VER=$BUNDLED_VERSION load_bundled_version nghttp2; NGHTTP2_VER=$BUNDLED_VERSION +# We load special versions +load_special_bundled_version nghttp3; NGHTTP3_VER=$BUNDLED_VERSION + NPM_PROVIDES=$(find_npm_packages "node") cat <<INNER_EOF > final_replacement_raw.txt Provides: bundled(uvwasi) = $UVWASI_VER @@ -293,6 +310,7 @@ Provides: bundled(merve) = $MERVE_VER Provides: bundled(llhttp) = $LLHTTP_VER Provides: bundled(ngtcp2) = $NGTCP2_VER +Provides: bundled(nghttp3) = $NGHTTP3_VER Provides: bundled(simdjson) = $SIMDJSON_VER # bundled url-ada parser, not ada Provides: bundled(ada) = $ADA_VER ++++++ no-rpath.patch ++++++ Index: node-v26.6.0/node.gyp =================================================================== --- node-v26.6.0.orig/node.gyp +++ node-v26.6.0/node.gyp @@ -705,13 +705,6 @@ 'xcode_settings': { 'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', '-Wl,-rpath,@loader_path/../lib'], }, - 'conditions': [ - ['OS=="linux" or OS=="openharmony"', { - 'ldflags': [ - '-Wl,-rpath,\\$$ORIGIN/../lib' - ], - }], - ], }], [ 'enable_lto=="true"', { 'xcode_settings': { @@ -1617,12 +1610,7 @@ 'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', ], } }], - ['OS=="linux"', { - 'ldflags': [ - '-Wl,-rpath,\\$$ORIGIN' - ], - }], - ], + ], }, # shared_embedtest { Index: node-v26.6.0/tools/gyp/pylib/gyp/generator/make.py =================================================================== --- node-v26.6.0.orig/tools/gyp/pylib/gyp/generator/make.py +++ node-v26.6.0/tools/gyp/pylib/gyp/generator/make.py @@ -1738,12 +1738,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj) target_postbuilds[configname] = target_postbuild else: ldflags = config.get("ldflags", []) - # Compute an rpath for this output if needed. - if any(dep.endswith(".so") or ".so." in dep for dep in deps): - # We want to get the literal string "$ORIGIN" - # into the link command, so we need lots of escaping. - ldflags.append(r"-Wl,-rpath=\$$ORIGIN/") - ldflags.append(r"-Wl,-rpath-link=\$(builddir)/") + if library_dirs := config.get("library_dirs", []): library_dirs = [Sourceify(self.Absolutify(i)) for i in library_dirs] ldflags += [("-L%s" % library_dir) for library_dir in library_dirs] ++++++ no_avx2_on_i586.patch ++++++ =================================================================== Index: node-v26.7.0/deps/histogram/src/hdr_histogram.c =================================================================== --- node-v26.7.0.orig/deps/histogram/src/hdr_histogram.c +++ node-v26.7.0/deps/histogram/src/hdr_histogram.c @@ -36,7 +36,7 @@ /* Runtime-dispatched AVX2 path: keep the rest of this TU at the project's baseline ISA so the shipped binary does not silently require AVX2. */ -#if (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) \ +#if (defined(__x86_64__) || defined(_M_X64)) \ && (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) && !defined(_MSC_VER) # define HDR_HAS_AVX2_DISPATCH 1 # include <immintrin.h> ++++++ node-v26.5.1.tar.xz -> node-v26.7.0.tar.xz ++++++ /work/SRC/openSUSE:Factory/nodejs26/node-v26.5.1.tar.xz /work/SRC/openSUSE:Factory/.nodejs26.new.1258/node-v26.7.0.tar.xz differ: char 27, line 1 ++++++ node_modules.obscpio ++++++ /work/SRC/openSUSE:Factory/nodejs26/node_modules.obscpio /work/SRC/openSUSE:Factory/.nodejs26.new.1258/node_modules.obscpio differ: char 49, line 1 ++++++ npm-line-truncation.patch ++++++ Index: node-v26.6.0/deps/npm/lib/base-cmd.js =================================================================== --- node-v26.6.0.orig/deps/npm/lib/base-cmd.js +++ node-v26.6.0/deps/npm/lib/base-cmd.js @@ -104,7 +104,7 @@ class BaseCommand { fullUsage.push('') for (const def of cmdDefs) { if (def.description) { - const desc = def.description.trim().split('\n')[0] + const desc = def.description.split('\n\n')[0].trim().replace(/\s+/g, ' ') const shortcuts = def.short ? `-${def.short}` : '' const aliases = (def.alias || []).map(v => `--${v}`).join('|') const mainFlag = `--${def.key}` ++++++ versioned.patch ++++++ --- /var/tmp/diff_new_pack.ugfhMK/_old 2026-08-26 19:55:45.720061510 +0200 +++ /var/tmp/diff_new_pack.ugfhMK/_new 2026-08-26 19:55:45.725061686 +0200 @@ -18,11 +18,11 @@ tools/test.py | 2 +- 7 files changed, 28 insertions(+), 27 deletions(-) -Index: node-v26.4.0/Makefile +Index: node-v26.6.0/Makefile =================================================================== ---- node-v26.4.0.orig/Makefile 2026-06-29 17:19:15.696302706 +0200 -+++ node-v26.4.0/Makefile 2026-06-29 17:19:33.819512691 +0200 -@@ -77,7 +77,7 @@ +--- node-v26.6.0.orig/Makefile ++++ node-v26.6.0/Makefile +@@ -77,7 +77,7 @@ BUILDTYPE_LOWER := $(shell echo $(BUILDT EXEEXT := $(shell $(PYTHON) -c \ "import sys; print('.exe' if sys.platform == 'win32' else '')") @@ -31,10 +31,10 @@ NODE_G_EXE = node_g$(EXEEXT) NPM ?= ./deps/npm/bin/npm-cli.js -Index: node-v26.4.0/doc/node.1 +Index: node-v26.6.0/doc/node.1 =================================================================== ---- node-v26.4.0.orig/doc/node.1 2026-06-24 09:02:39.000000000 +0200 -+++ node-v26.4.0/doc/node.1 2026-06-29 17:20:55.538396086 +0200 +--- node-v26.6.0.orig/doc/node.1 ++++ node-v26.6.0/doc/node.1 @@ -10,22 +10,22 @@ .Dt NODE 1 . @@ -62,11 +62,11 @@ .Op Fl -v8-options . .Sh DESCRIPTION -Index: node-v26.4.0/node.gyp +Index: node-v26.6.0/node.gyp =================================================================== ---- node-v26.4.0.orig/node.gyp 2026-06-24 09:02:38.000000000 +0200 -+++ node-v26.4.0/node.gyp 2026-06-29 17:21:28.974035930 +0200 -@@ -7,12 +7,12 @@ +--- node-v26.6.0.orig/node.gyp ++++ node-v26.6.0/node.gyp +@@ -7,7 +7,7 @@ 'force_dynamic_crt%': 0, 'node_builtin_modules_path%': '', # `node` executable target name. @@ -75,17 +75,11 @@ # `libnode` target type, `static_library` if `node_shared` is false and `shared_library` if `node_shared` is true. 'node_lib_type%': 'static_library', # `libnode` target name, can be a `static_library` or `shared_library` based on `node_shared`. - # NOTE: Gyp will prefix this with `lib` if this name does not start with `lib`. -- 'node_lib_target_name%': 'libnode', -+ 'node_lib_target_name%': 'libnode26', - 'node_module_version%': '', - 'node_no_browser_globals%': 'false', - 'node_shared_brotli%': 'false', -Index: node-v26.4.0/src/node_main.cc -=================================================================== ---- node-v26.4.0.orig/src/node_main.cc 2026-06-24 09:02:38.000000000 +0200 -+++ node-v26.4.0/src/node_main.cc 2026-06-29 17:19:33.821512133 +0200 -@@ -94,6 +94,7 @@ +Index: node-v26.6.0/src/node_main.cc +=================================================================== +--- node-v26.6.0.orig/src/node_main.cc ++++ node-v26.6.0/src/node_main.cc +@@ -94,6 +94,7 @@ int wmain(int argc, wchar_t* wargv[]) { // UNIX int main(int argc, char* argv[]) { @@ -93,11 +87,11 @@ return node::Start(argc, argv); } #endif -Index: node-v26.4.0/test/parallel/test-snapshot-warning.js +Index: node-v26.6.0/test/parallel/test-snapshot-warning.js =================================================================== ---- node-v26.4.0.orig/test/parallel/test-snapshot-warning.js 2026-06-24 09:02:39.000000000 +0200 -+++ node-v26.4.0/test/parallel/test-snapshot-warning.js 2026-06-29 17:19:33.822641133 +0200 -@@ -60,7 +60,7 @@ +--- node-v26.6.0.orig/test/parallel/test-snapshot-warning.js ++++ node-v26.6.0/test/parallel/test-snapshot-warning.js +@@ -60,7 +60,7 @@ tmpdir.refresh(); stderr(output) { let match = output.match(/Warning: test warning/g); assert.strictEqual(match.length, 1); @@ -106,7 +100,7 @@ assert.strictEqual(match.length, 1); return true; } -@@ -79,7 +79,7 @@ +@@ -79,7 +79,7 @@ tmpdir.refresh(); // Warnings should not be handled more than once. let match = output.match(/Warning: test warning/g); assert.strictEqual(match.length, 1); @@ -115,7 +109,7 @@ assert.strictEqual(match.length, 1); return true; } -@@ -114,7 +114,7 @@ +@@ -114,7 +114,7 @@ tmpdir.refresh(); console.log(warningFile1, ':', warnings1); let match = warnings1.match(/Warning: test warning/g); assert.strictEqual(match.length, 1); @@ -124,7 +118,7 @@ assert.strictEqual(match.length, 1); fs.rmSync(warningFile1, { maxRetries: 3, recursive: false, force: true -@@ -140,6 +140,6 @@ +@@ -140,6 +140,6 @@ tmpdir.refresh(); console.log(warningFile2, ':', warnings1); match = warnings2.match(/Warning: test warning/g); assert.strictEqual(match.length, 1); @@ -132,11 +126,11 @@ + match = warnings2.match(/Use `node26 --trace-warnings/g); assert.strictEqual(match.length, 1); } -Index: node-v26.4.0/tools/install.py +Index: node-v26.6.0/tools/install.py =================================================================== ---- node-v26.4.0.orig/tools/install.py 2026-06-29 17:19:20.275004906 +0200 -+++ node-v26.4.0/tools/install.py 2026-06-29 17:19:33.820017142 +0200 -@@ -93,7 +93,7 @@ +--- node-v26.6.0.orig/tools/install.py ++++ node-v26.6.0/tools/install.py +@@ -93,7 +93,7 @@ def uninstall(options, paths, dest): try_remove(options, path, dest) def package_files(options, action, name, bins): @@ -145,7 +139,7 @@ # don't install npm if the target path is a symlink, it probably means # that a dev version of npm is installed there -@@ -114,19 +114,19 @@ +@@ -114,19 +114,19 @@ def package_files(options, action, name, if action == uninstall: action(options, [link_path], os.path.join('bin', bin_name)) elif action == install: @@ -169,7 +163,7 @@ # Not the default just yet: # 'yarn': 'dist/yarn.js', # 'yarnpkg': 'dist/yarn.js', -@@ -155,7 +155,7 @@ +@@ -155,7 +155,7 @@ def subdir_files(options, path, dest, ac action(options, files_in_path, subdir + os.path.sep) def files(options, action): @@ -178,7 +172,7 @@ if options.is_win: node_bin += '.exe' action(options, [os.path.join(options.build_dir, node_bin)], os.path.join('bin', node_bin)) -@@ -206,7 +206,7 @@ +@@ -206,7 +206,7 @@ def files(options, action): if 'openbsd' in sys.platform: action(options, ['doc/node.1'], 'man/man1/') else: @@ -187,7 +181,7 @@ if 'true' == options.variables.get('node_install_npm'): npm_files(options, action) -@@ -350,28 +350,28 @@ +@@ -350,28 +350,28 @@ def headers(options, action): 'src/node_buffer.h', 'src/node_object_wrap.h', 'src/node_version.h', @@ -224,11 +218,11 @@ if sys.platform == 'zos': zoslibinc = os.environ.get('ZOSLIB_INCLUDES') -Index: node-v26.4.0/tools/test.py +Index: node-v26.6.0/tools/test.py =================================================================== ---- node-v26.4.0.orig/tools/test.py 2026-06-29 17:19:29.840074939 +0200 -+++ node-v26.4.0/tools/test.py 2026-06-29 17:19:33.821748629 +0200 -@@ -986,7 +986,7 @@ +--- node-v26.6.0.orig/tools/test.py ++++ node-v26.6.0/tools/test.py +@@ -986,7 +986,7 @@ class Context(object): if self.vm is not None: return self.vm if arch == 'none':
