From ea56a5e3ae463a1b9d28298f47f27b40e519ca6d Mon Sep 17 00:00:00 2001 From: Jason Schonberg Date: Wed, 13 May 2026 19:29:20 -0400 Subject: [PATCH] nodejs: upgrade 22.22.2 -> 22.22.3 With this upgrade, nodejs updated the llhttp dependency to version 9.3.1 So some of the patches are nolonger necessary. Changelog: https://github.com/nodejs/node/releases/tag/v22.22.3 Signed-off-by: Jason Schonberg Signed-off-by: Khem Raj --- .../0001-detect-aarch64-Neon-correctly.patch | 51 ---------------- .../0001-fix-arm-Neon-intrinsics-types.patch | 59 ------------------ ...header-value-__builtin_ctzll-undefin.patch | 60 ------------------- .../{nodejs_22.22.2.bb => nodejs_22.22.3.bb} | 5 +- 4 files changed, 1 insertion(+), 174 deletions(-) delete mode 100644 meta-oe/recipes-devtools/nodejs/nodejs/0001-detect-aarch64-Neon-correctly.patch delete mode 100644 meta-oe/recipes-devtools/nodejs/nodejs/0001-fix-arm-Neon-intrinsics-types.patch delete mode 100644 meta-oe/recipes-devtools/nodejs/nodejs/0001-llhttp-fix-NEON-header-value-__builtin_ctzll-undefin.patch rename meta-oe/recipes-devtools/nodejs/{nodejs_22.22.2.bb => nodejs_22.22.3.bb} (96%) diff --git a/meta-oe/recipes-devtools/nodejs/nodejs/0001-detect-aarch64-Neon-correctly.patch b/meta-oe/recipes-devtools/nodejs/nodejs/0001-detect-aarch64-Neon-correctly.patch deleted file mode 100644 index 15de2c1119..0000000000 --- a/meta-oe/recipes-devtools/nodejs/nodejs/0001-detect-aarch64-Neon-correctly.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 41ec2d5302b77be27ca972102c29ce12471ed4b0 Mon Sep 17 00:00:00 2001 -From: Gyorgy Sarvari -Date: Thu, 12 Feb 2026 11:09:44 +0100 -Subject: [PATCH 2/2] detect aarch64 Neon correctly - -The llhttp vendored dependency of nodejs takes advantage of Arm NEON -instructions when they are available, however they are detected by -checking for an outdated CPU feature macro: it checks for __ARM_NEON__, -however it is not defined by new compilers for aarch64, rather they -set __ARM_NEON. The Arm C extension guide[1] refers to __ARM_NEON macro -aswell. - -This patch changes the detection to check for both macros when detecting -the availability of NEON instructions. - -The code this patch modifies is generated, so the patch itself isn't -suitable for upstream submission, as the root cause of the error is -in the generator itself. A PR has been submitted[2] to the generator -project to rectify this issue. - -[1]: https://developer.arm.com/documentation/ihi0053/d/ - pdf, section 6.9 -[2]: https://github.com/nodejs/llparse/pull/84 - -Upstream-Status: Inappropriate [see above] -Signed-off-by: Gyorgy Sarvari ---- - deps/llhttp/src/llhttp.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c -index a0e59e50..b069bbbb 100644 ---- a/deps/llhttp/src/llhttp.c -+++ b/deps/llhttp/src/llhttp.c -@@ -10,7 +10,7 @@ - #endif /* _MSC_VER */ - #endif /* __SSE4_2__ */ - --#ifdef __ARM_NEON__ -+#if defined(__ARM_NEON__) || defined(__ARM_NEON) - #include - #endif /* __ARM_NEON__ */ - -@@ -2625,7 +2625,7 @@ static llparse_state_t llhttp__internal__run( - goto s_n_llhttp__internal__n_header_value_otherwise; - } - #endif /* __SSE4_2__ */ -- #ifdef __ARM_NEON__ -+ #if defined(__ARM_NEON__) || defined(__ARM_NEON) - while (endp - p >= 16) { - uint8x16_t input; - uint8x16_t single; diff --git a/meta-oe/recipes-devtools/nodejs/nodejs/0001-fix-arm-Neon-intrinsics-types.patch b/meta-oe/recipes-devtools/nodejs/nodejs/0001-fix-arm-Neon-intrinsics-types.patch deleted file mode 100644 index ddbad575f0..0000000000 --- a/meta-oe/recipes-devtools/nodejs/nodejs/0001-fix-arm-Neon-intrinsics-types.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 3f4283dac7d88a89b42f1f2966a862cee5afe486 Mon Sep 17 00:00:00 2001 -From: Gyorgy Sarvari -Date: Thu, 12 Feb 2026 11:03:53 +0100 -Subject: [PATCH 1/2] fix arm Neon intrinsics types - -The current code calls these intrinsics with incorrect datatypes -(it uses a vector of uint16 instead of uint8), causing compilation -to fail with the following error: - -| ../deps/llhttp/src/llhttp.c: In function 'llhttp__internal__run': -| ../deps/llhttp/src/llhttp.c:2645:9: note: use '-flax-vector-conversions' to permit conversions between vectors with differing element types or numbers of subparts -| 2645 | ); -| | ^ -| ../deps/llhttp/src/llhttp.c:2643:11: error: incompatible type for argument 1 of 'vandq_u16' -| 2643 | vcgeq_u8(input, vdupq_n_u8(' ')), - -To avoid this, set the correct intrinsics call that matches the -actual arguments. - -The code that this patch modifies is generated code, so in itself -this change isn't appropriate for upstream. The actual problem -is in the code generator itself, for which a PR is already pending -for merging[1]. This patch is a port of that PR. - -[1]: https://github.com/nodejs/llparse/pull/79 - -Upstream-Status: Inappropriate [see above] -Signed-off-by: Gyorgy Sarvari ---- - deps/llhttp/src/llhttp.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c -index aa4c4682..887603fd 100644 ---- a/deps/llhttp/src/llhttp.c -+++ b/deps/llhttp/src/llhttp.c -@@ -2639,17 +2639,17 @@ static llparse_state_t llhttp__internal__run( - /* Find first character that does not match `ranges` */ - single = vceqq_u8(input, vdupq_n_u8(0x9)); - mask = single; -- single = vandq_u16( -+ single = vandq_u8( - vcgeq_u8(input, vdupq_n_u8(' ')), - vcleq_u8(input, vdupq_n_u8('~')) - ); -- mask = vorrq_u16(mask, single); -- single = vandq_u16( -+ mask = vorrq_u8(mask, single); -+ single = vandq_u8( - vcgeq_u8(input, vdupq_n_u8(0x80)), - vcleq_u8(input, vdupq_n_u8(0xff)) - ); -- mask = vorrq_u16(mask, single); -- narrow = vshrn_n_u16(mask, 4); -+ mask = vorrq_u8(mask, single); -+ narrow = vshrn_n_u16(vreinterpretq_u16_u8(mask), 4); - match_mask = ~vget_lane_u64(vreinterpret_u64_u8(narrow), 0); - match_len = __builtin_ctzll(match_mask) >> 2; - if (match_len != 16) { diff --git a/meta-oe/recipes-devtools/nodejs/nodejs/0001-llhttp-fix-NEON-header-value-__builtin_ctzll-undefin.patch b/meta-oe/recipes-devtools/nodejs/nodejs/0001-llhttp-fix-NEON-header-value-__builtin_ctzll-undefin.patch deleted file mode 100644 index 683dddcf04..0000000000 --- a/meta-oe/recipes-devtools/nodejs/nodejs/0001-llhttp-fix-NEON-header-value-__builtin_ctzll-undefin.patch +++ /dev/null @@ -1,60 +0,0 @@ -From a63a5faea54055973bf5f0a514444532563cc20d Mon Sep 17 00:00:00 2001 -From: Telukula Jeevan Kumar Sahu -Date: Fri, 27 Feb 2026 20:58:43 +0530 -Subject: [PATCH] llhttp: fix NEON header value __builtin_ctzll undefined - behavior - -When all 16 bytes match the allowed range, match_mask becomes 0 after -the bitwise NOT. Calling __builtin_ctzll(0) is undefined behavior per -the C standard. - -The code expects match_len == 16 when all bytes match (so the branch -is skipped and p += 16 continues the loop), but this relied on -ctzll(0) returning 64, which is not guaranteed. - -GCC at -O2 exploits this UB by deducing that __builtin_ctzll() result -is always in range [0, 63], and after >> 2 always in [0, 15], which -is never equal to 16. The compiler then optimizes -"if (match_len != 16)" to always-true, causing every valid 16-byte -chunk to be falsely rejected as containing an invalid character. - -This manifests as HTTP 400 Bad Request (HPE_INVALID_HEADER_TOKEN) for -any HTTP header value longer than 16 characters on ARM targets with -NEON enabled. - -Fix by explicitly checking for match_mask == 0 and setting -match_len = 16, avoiding the undefined behavior entirely. This bug -affects both aarch64 and armv7 NEON targets. - -The fix has been merged upstream in llparse 7.3.1 [1] and is included -in llhttp 9.3.1. This patch can be dropped when nodejs updates its -bundled llhttp to >= 9.3.1. - -[1]: https://github.com/nodejs/llparse/pull/83 - -Upstream-Status: Inappropriate -Signed-off-by: Telukula Jeevan Kumar Sahu ---- - deps/llhttp/src/llhttp.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c -index 14b731e..b0a46c6 100644 ---- a/deps/llhttp/src/llhttp.c -+++ b/deps/llhttp/src/llhttp.c -@@ -2651,7 +2651,11 @@ static llparse_state_t llhttp__internal__run( - mask = vorrq_u8(mask, single); - narrow = vshrn_n_u16(vreinterpretq_u16_u8(mask), 4); - match_mask = ~vget_lane_u64(vreinterpret_u64_u8(narrow), 0); -- match_len = __builtin_ctzll(match_mask) >> 2; -+ if (match_mask == 0) { -+ match_len = 16; -+ } else { -+ match_len = __builtin_ctzll(match_mask) >> 2; -+ } - if (match_len != 16) { - p += match_len; - goto s_n_llhttp__internal__n_header_value_otherwise; --- -2.34.1 - diff --git a/meta-oe/recipes-devtools/nodejs/nodejs_22.22.2.bb b/meta-oe/recipes-devtools/nodejs/nodejs_22.22.3.bb similarity index 96% rename from meta-oe/recipes-devtools/nodejs/nodejs_22.22.2.bb rename to meta-oe/recipes-devtools/nodejs/nodejs_22.22.3.bb index 3a1385f70a..a13b71b762 100644 --- a/meta-oe/recipes-devtools/nodejs/nodejs_22.22.2.bb +++ b/meta-oe/recipes-devtools/nodejs/nodejs_22.22.3.bb @@ -31,9 +31,6 @@ SRC_URI = "https://nodejs.org/dist/v${PV}/node-v${PV}.tar.xz \ file://0001-positional-args.patch \ file://0001-custom-env.patch \ file://0001-build-remove-redundant-mXX-flags-for-V8.patch \ - file://0001-fix-arm-Neon-intrinsics-types.patch \ - file://0001-detect-aarch64-Neon-correctly.patch \ - file://0001-llhttp-fix-NEON-header-value-__builtin_ctzll-undefin.patch \ file://run-ptest \ " SRC_URI:append:class-target = " \ @@ -42,7 +39,7 @@ SRC_URI:append:class-target = " \ SRC_URI:append:toolchain-clang:powerpc64le = " \ file://0001-ppc64-Do-not-use-mminimal-toc-with-clang.patch \ " -SRC_URI[sha256sum] = "b6bedd3a8cacd5df7df015a5088264b12c74a277ba60684cb9642ae8eb743132" +SRC_URI[sha256sum] = "f3e6a578db1ab335a4a72785c1e87ad18a2cf6d2fc25747a1d741fb34af0bd0f" S = "${UNPACKDIR}/node-v${PV}"