Compare commits
No commits in common. "c8-stream-10" and "c9" have entirely different histories.
c8-stream-
...
c9
|
@ -1,2 +1,6 @@
|
|||
SOURCES/icu4c-64_2-src.tgz
|
||||
SOURCES/node-v10.24.0-stripped.tar.gz
|
||||
SOURCES/cjs-module-lexer-1.2.2.tar.gz
|
||||
SOURCES/icu4c-71_1-src.tgz
|
||||
SOURCES/node-v16.20.2-stripped.tar.gz
|
||||
SOURCES/undici-5.20.0.tar.gz
|
||||
SOURCES/wasi-sdk-wasi-sdk-11.tar.gz
|
||||
SOURCES/wasi-sdk-wasi-sdk-14.tar.gz
|
||||
|
|
|
@ -1,2 +1,6 @@
|
|||
3127155ecf2b75ab4835f501b7478e39c07bb852 SOURCES/icu4c-64_2-src.tgz
|
||||
be0e0b385a852c376f452b3d94727492e05407e4 SOURCES/node-v10.24.0-stripped.tar.gz
|
||||
b0a91341ecf6c68a9d59a1c57d000fbbcc771679 SOURCES/cjs-module-lexer-1.2.2.tar.gz
|
||||
406b0c8635288b772913b6ff646451e69748878a SOURCES/icu4c-71_1-src.tgz
|
||||
0024086ed6090aaea422fb2bd329f898bf924df6 SOURCES/node-v16.20.2-stripped.tar.gz
|
||||
0b3e890fd45200fb3a2fdc14408cc51e23990480 SOURCES/undici-5.20.0.tar.gz
|
||||
8979d177dd62e3b167a6fd7dc7185adb0128c439 SOURCES/wasi-sdk-wasi-sdk-11.tar.gz
|
||||
900a50a32f0079d53c299db92b88bb3c5d2022b8 SOURCES/wasi-sdk-wasi-sdk-14.tar.gz
|
||||
|
|
|
@ -1,31 +1,26 @@
|
|||
From 2cd4c12776af3da588231d3eb498e6451c30eae5 Mon Sep 17 00:00:00 2001
|
||||
From: Zuzana Svetlikova <zsvetlik@redhat.com>
|
||||
Date: Thu, 27 Apr 2017 14:25:42 +0200
|
||||
From 39f761838b5fc10af995642bd44e6bb4c79085f1 Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Tue, 30 May 2023 13:12:35 +0200
|
||||
Subject: [PATCH] Disable running gyp on shared deps
|
||||
|
||||
Signed-off-by: rpm-build <rpm-build>
|
||||
---
|
||||
Makefile | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 73feb4c..45bbceb 100644
|
||||
index ef3eda2..8b52a4f 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -123,10 +123,9 @@ with-code-cache:
|
||||
test-code-cache: with-code-cache
|
||||
$(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) code-cache
|
||||
@@ -148,7 +148,7 @@ with-code-cache test-code-cache:
|
||||
$(warning '$@' target is a noop)
|
||||
|
||||
-out/Makefile: common.gypi deps/uv/uv.gyp deps/http_parser/http_parser.gyp \
|
||||
- deps/zlib/zlib.gyp deps/v8/gypfiles/toolchain.gypi \
|
||||
- deps/v8/gypfiles/features.gypi deps/v8/gypfiles/v8.gyp node.gyp \
|
||||
- config.gypi
|
||||
+out/Makefile: common.gypi deps/http_parser/http_parser.gyp \
|
||||
+ deps/v8/gypfiles/toolchain.gypi deps/v8/gypfiles/features.gypi \
|
||||
+ deps/v8/gypfiles/v8.gyp node.gyp config.gypi
|
||||
out/Makefile: config.gypi common.gypi node.gyp \
|
||||
- deps/uv/uv.gyp deps/llhttp/llhttp.gyp deps/zlib/zlib.gyp \
|
||||
+ deps/llhttp/llhttp.gyp \
|
||||
tools/v8_gypfiles/toolchain.gypi tools/v8_gypfiles/features.gypi \
|
||||
tools/v8_gypfiles/inspector.gypi tools/v8_gypfiles/v8.gyp
|
||||
$(PYTHON) tools/gyp_node.py -f make
|
||||
|
||||
config.gypi: configure configure.py
|
||||
--
|
||||
2.26.2
|
||||
2.41.0
|
||||
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
From e7afb2d6e2a6c8f9c9c32e12a10c3c5c4902a251 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Gallagher <sgallagh@redhat.com>
|
||||
Date: Tue, 1 May 2018 08:05:30 -0400
|
||||
Subject: [PATCH] Suppress NPM message to run global update
|
||||
|
||||
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
|
||||
Signed-off-by: rpm-build <rpm-build>
|
||||
---
|
||||
deps/npm/bin/npm-cli.js | 54 -----------------------------------------
|
||||
1 file changed, 54 deletions(-)
|
||||
|
||||
diff --git a/deps/npm/bin/npm-cli.js b/deps/npm/bin/npm-cli.js
|
||||
index c0d9be0..0f0892e 100755
|
||||
--- a/deps/npm/bin/npm-cli.js
|
||||
+++ b/deps/npm/bin/npm-cli.js
|
||||
@@ -71,65 +71,11 @@
|
||||
npm.command = 'help'
|
||||
}
|
||||
|
||||
- var isGlobalNpmUpdate = conf.global && ['install', 'update'].includes(npm.command) && npm.argv.includes('npm')
|
||||
-
|
||||
// now actually fire up npm and run the command.
|
||||
// this is how to use npm programmatically:
|
||||
conf._exit = true
|
||||
npm.load(conf, function (er) {
|
||||
if (er) return errorHandler(er)
|
||||
- if (
|
||||
- !isGlobalNpmUpdate &&
|
||||
- npm.config.get('update-notifier') &&
|
||||
- !unsupported.checkVersion(process.version).unsupported
|
||||
- ) {
|
||||
- const pkg = require('../package.json')
|
||||
- let notifier = require('update-notifier')({pkg})
|
||||
- const isCI = require('ci-info').isCI
|
||||
- if (
|
||||
- notifier.update &&
|
||||
- notifier.update.latest !== pkg.version &&
|
||||
- !isCI
|
||||
- ) {
|
||||
- const color = require('ansicolors')
|
||||
- const useColor = npm.config.get('color')
|
||||
- const useUnicode = npm.config.get('unicode')
|
||||
- const old = notifier.update.current
|
||||
- const latest = notifier.update.latest
|
||||
- let type = notifier.update.type
|
||||
- if (useColor) {
|
||||
- switch (type) {
|
||||
- case 'major':
|
||||
- type = color.red(type)
|
||||
- break
|
||||
- case 'minor':
|
||||
- type = color.yellow(type)
|
||||
- break
|
||||
- case 'patch':
|
||||
- type = color.green(type)
|
||||
- break
|
||||
- }
|
||||
- }
|
||||
- const changelog = `https://github.com/npm/cli/releases/tag/v${latest}`
|
||||
- notifier.notify({
|
||||
- message: `New ${type} version of ${pkg.name} available! ${
|
||||
- useColor ? color.red(old) : old
|
||||
- } ${useUnicode ? '→' : '->'} ${
|
||||
- useColor ? color.green(latest) : latest
|
||||
- }\n` +
|
||||
- `${
|
||||
- useColor ? color.yellow('Changelog:') : 'Changelog:'
|
||||
- } ${
|
||||
- useColor ? color.cyan(changelog) : changelog
|
||||
- }\n` +
|
||||
- `Run ${
|
||||
- useColor
|
||||
- ? color.green(`npm install -g ${pkg.name}`)
|
||||
- : `npm i -g ${pkg.name}`
|
||||
- } to update!`
|
||||
- })
|
||||
- }
|
||||
- }
|
||||
npm.commands[npm.command](npm.argv, function (err) {
|
||||
// https://genius.com/Lin-manuel-miranda-your-obedient-servant-lyrics
|
||||
if (
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
From b9370dcfba759c63e894f12abcf49699f1e8f0dc Mon Sep 17 00:00:00 2001
|
||||
From: Honza Horak <hhorak@redhat.com>
|
||||
Date: Thu, 12 Oct 2023 13:52:59 +0200
|
||||
Subject: [PATCH] disable fips options
|
||||
|
||||
Signed-off-by: rpm-build <rpm-build>
|
||||
---
|
||||
src/crypto/crypto_util.cc | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/crypto/crypto_util.cc b/src/crypto/crypto_util.cc
|
||||
index 59ae7f8..7343396 100644
|
||||
--- a/src/crypto/crypto_util.cc
|
||||
+++ b/src/crypto/crypto_util.cc
|
||||
@@ -111,6 +111,8 @@ bool ProcessFipsOptions() {
|
||||
/* Override FIPS settings in configuration file, if needed. */
|
||||
if (per_process::cli_options->enable_fips_crypto ||
|
||||
per_process::cli_options->force_fips_crypto) {
|
||||
+ fprintf(stderr, "ERROR: Using options related to FIPS is not recommended, configure FIPS in openssl instead. See https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/security_hardening/assembly_installing-the-system-in-fips-mode_security-hardening for more details.\n");
|
||||
+ return false;
|
||||
#if OPENSSL_VERSION_MAJOR >= 3
|
||||
OSSL_PROVIDER* fips_provider = OSSL_PROVIDER_load(nullptr, "fips");
|
||||
if (fips_provider == nullptr)
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
From 0028cc74dac4dd24b8599ade85cb49fdafa9f559 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Gallagher <sgallagh@redhat.com>
|
||||
Date: Fri, 6 Dec 2019 16:40:25 -0500
|
||||
Subject: [PATCH] build: auto-load ICU data from --with-icu-default-data-dir
|
||||
|
||||
When compiled with `--with-intl=small` and
|
||||
`--with-icu-default-data-dir=PATH`, Node.js will use PATH as a
|
||||
fallback location for the ICU data.
|
||||
|
||||
We will first perform an access check using fopen(PATH, 'r') to
|
||||
ensure that the file is readable. If it is, we'll set the
|
||||
icu_data_directory and proceed. There's a slight overhead for the
|
||||
fopen() check, but it should be barely measurable.
|
||||
|
||||
This will be useful for Linux distribution packagers who want to
|
||||
be able to ship a minimal node binary in a container image but
|
||||
also be able to add on the full i18n support where needed. With
|
||||
this patch, it becomes possible to ship the interpreter as
|
||||
/usr/bin/node in one package for the distribution and to ship the
|
||||
data files in another package (without a strict dependency
|
||||
between the two). This means that users of the distribution will
|
||||
not need to explicitly direct Node.js to locate the ICU data. It
|
||||
also means that in environments where full internationalization is
|
||||
not required, they do not need to carry the extra content (with
|
||||
the associated storage costs).
|
||||
|
||||
Refs: https://github.com/nodejs/node/issues/3460
|
||||
|
||||
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
|
||||
Signed-off-by: rpm-build <rpm-build>
|
||||
---
|
||||
configure.py | 9 +++++++++
|
||||
node.gypi | 7 +++++++
|
||||
src/node.cc | 20 ++++++++++++++++++++
|
||||
3 files changed, 36 insertions(+)
|
||||
|
||||
diff --git a/configure.py b/configure.py
|
||||
index 89f7bf5..d611a88 100755
|
||||
--- a/configure.py
|
||||
+++ b/configure.py
|
||||
@@ -433,6 +433,14 @@ intl_optgroup.add_option('--with-icu-source',
|
||||
'the icu4c source archive. '
|
||||
'v%d.x or later recommended.' % icu_versions['minimum_icu'])
|
||||
|
||||
+intl_optgroup.add_option('--with-icu-default-data-dir',
|
||||
+ action='store',
|
||||
+ dest='with_icu_default_data_dir',
|
||||
+ help='Path to the icuXXdt{lb}.dat file. If unspecified, ICU data will '
|
||||
+ 'only be read if the NODE_ICU_DATA environment variable or the '
|
||||
+ '--icu-data-dir runtime argument is used. This option has effect '
|
||||
+ 'only when Node.js is built with --with-intl=small-icu.')
|
||||
+
|
||||
parser.add_option('--with-ltcg',
|
||||
action='store_true',
|
||||
dest='with_ltcg',
|
||||
@@ -1359,6 +1367,7 @@ def configure_intl(o):
|
||||
locs.add('root') # must have root
|
||||
o['variables']['icu_locales'] = string.join(locs,',')
|
||||
# We will check a bit later if we can use the canned deps/icu-small
|
||||
+ o['variables']['icu_default_data'] = options.with_icu_default_data_dir or ''
|
||||
elif with_intl == 'full-icu':
|
||||
# full ICU
|
||||
o['variables']['v8_enable_i18n_support'] = 1
|
||||
diff --git a/node.gypi b/node.gypi
|
||||
index 466a174..65b97d6 100644
|
||||
--- a/node.gypi
|
||||
+++ b/node.gypi
|
||||
@@ -113,6 +113,13 @@
|
||||
'conditions': [
|
||||
[ 'icu_small=="true"', {
|
||||
'defines': [ 'NODE_HAVE_SMALL_ICU=1' ],
|
||||
+ 'conditions': [
|
||||
+ [ 'icu_default_data!=""', {
|
||||
+ 'defines': [
|
||||
+ 'NODE_ICU_DEFAULT_DATA_DIR="<(icu_default_data)"',
|
||||
+ ],
|
||||
+ }],
|
||||
+ ],
|
||||
}]],
|
||||
}],
|
||||
[ 'node_use_bundled_v8=="true" and \
|
||||
diff --git a/src/node.cc b/src/node.cc
|
||||
index 7c01187..c9840e3 100644
|
||||
--- a/src/node.cc
|
||||
+++ b/src/node.cc
|
||||
@@ -92,6 +92,7 @@
|
||||
|
||||
#if defined(NODE_HAVE_I18N_SUPPORT)
|
||||
#include <unicode/uvernum.h>
|
||||
+#include <unicode/utypes.h>
|
||||
#endif
|
||||
|
||||
#if defined(LEAK_SANITIZER)
|
||||
@@ -2643,6 +2644,25 @@ void Init(std::vector<std::string>* argv,
|
||||
// If the parameter isn't given, use the env variable.
|
||||
if (per_process_opts->icu_data_dir.empty())
|
||||
SafeGetenv("NODE_ICU_DATA", &per_process_opts->icu_data_dir);
|
||||
+
|
||||
+#ifdef NODE_ICU_DEFAULT_DATA_DIR
|
||||
+ // If neither the CLI option nor the environment variable was specified,
|
||||
+ // fall back to the configured default
|
||||
+ if (per_process_opts->icu_data_dir.empty()) {
|
||||
+ // Check whether the NODE_ICU_DEFAULT_DATA_DIR contains the right data
|
||||
+ // file and can be read.
|
||||
+ static const char full_path[] =
|
||||
+ NODE_ICU_DEFAULT_DATA_DIR "/" U_ICUDATA_NAME ".dat";
|
||||
+
|
||||
+ FILE* f = fopen(full_path, "rb");
|
||||
+
|
||||
+ if (f != nullptr) {
|
||||
+ fclose(f);
|
||||
+ per_process_opts->icu_data_dir = NODE_ICU_DEFAULT_DATA_DIR;
|
||||
+ }
|
||||
+ }
|
||||
+#endif // NODE_ICU_DEFAULT_DATA_DIR
|
||||
+
|
||||
// Initialize ICU.
|
||||
// If icu_data_dir is empty here, it will load the 'minimal' data.
|
||||
if (!i18n::InitializeICUDirectory(per_process_opts->icu_data_dir)) {
|
||||
--
|
||||
2.26.2
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,13 +0,0 @@
|
|||
diff --git a/deps/npm/node_modules/y18n/index.js b/deps/npm/node_modules/y18n/index.js
|
||||
index d720681628..727362aac0 100644
|
||||
--- a/deps/npm/node_modules/y18n/index.js
|
||||
+++ b/deps/npm/node_modules/y18n/index.js
|
||||
@@ -11,7 +11,7 @@ function Y18N (opts) {
|
||||
this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true
|
||||
|
||||
// internal stuff.
|
||||
- this.cache = {}
|
||||
+ this.cache = Object.create(null)
|
||||
this.writeQueue = []
|
||||
}
|
||||
|
|
@ -0,0 +1,575 @@
|
|||
Fix CVE-2024-22019
|
||||
|
||||
Resolves: RHEL-28064
|
||||
|
||||
This is a combination of the upstream commit from v18:
|
||||
https://github.com/nodejs/node/commit/911cb33cdadab57a75f97186290ea8f3903a6171
|
||||
|
||||
and necessary rebase of llhttp from 6.0.11 to 6.1.0 that has the needed
|
||||
chunk features.
|
||||
|
||||
From 11bd886e0a4eadd7e55502758fff6486a3fa3a4e Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Insogna <paolo@cowtech.it>
|
||||
Date: Tue, 9 Jan 2024 18:10:04 +0100
|
||||
Subject: [PATCH] http: add maximum chunk extension size
|
||||
|
||||
Cherry-picked from v18 patch:
|
||||
https://github.com/nodejs/node/commit/911cb33cdadab57a75f97186290ea8f3903a6171
|
||||
|
||||
PR-URL: https://github.com/nodejs-private/node-private/pull/520
|
||||
Refs: https://github.com/nodejs-private/node-private/pull/518
|
||||
CVE-ID: CVE-2024-22019
|
||||
---
|
||||
deps/llhttp/.gitignore | 1 +
|
||||
deps/llhttp/CMakeLists.txt | 2 +-
|
||||
deps/llhttp/include/llhttp.h | 7 +-
|
||||
deps/llhttp/src/api.c | 7 +
|
||||
deps/llhttp/src/llhttp.c | 122 ++++++++++++++--
|
||||
doc/api/errors.md | 12 ++
|
||||
lib/_http_server.js | 9 ++
|
||||
src/node_http_parser.cc | 20 ++-
|
||||
.../test-http-chunk-extensions-limit.js | 131 ++++++++++++++++++
|
||||
tools/update-llhttp.sh | 2 +-
|
||||
10 files changed, 294 insertions(+), 19 deletions(-)
|
||||
create mode 100644 deps/llhttp/.gitignore
|
||||
create mode 100644 test/parallel/test-http-chunk-extensions-limit.js
|
||||
|
||||
diff --git a/deps/llhttp/.gitignore b/deps/llhttp/.gitignore
|
||||
new file mode 100644
|
||||
index 0000000000..98438a2cd3
|
||||
--- /dev/null
|
||||
+++ b/deps/llhttp/.gitignore
|
||||
@@ -0,0 +1 @@
|
||||
+libllhttp.pc
|
||||
diff --git a/deps/llhttp/CMakeLists.txt b/deps/llhttp/CMakeLists.txt
|
||||
index d0382038b9..747564a76f 100644
|
||||
--- a/deps/llhttp/CMakeLists.txt
|
||||
+++ b/deps/llhttp/CMakeLists.txt
|
||||
@@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.5.1)
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
|
||||
-project(llhttp VERSION 6.0.11)
|
||||
+project(llhttp VERSION 6.1.0)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
diff --git a/deps/llhttp/include/llhttp.h b/deps/llhttp/include/llhttp.h
|
||||
index 2da66f15e6..78f27abc03 100644
|
||||
--- a/deps/llhttp/include/llhttp.h
|
||||
+++ b/deps/llhttp/include/llhttp.h
|
||||
@@ -2,8 +2,8 @@
|
||||
#define INCLUDE_LLHTTP_H_
|
||||
|
||||
#define LLHTTP_VERSION_MAJOR 6
|
||||
-#define LLHTTP_VERSION_MINOR 0
|
||||
-#define LLHTTP_VERSION_PATCH 11
|
||||
+#define LLHTTP_VERSION_MINOR 1
|
||||
+#define LLHTTP_VERSION_PATCH 0
|
||||
|
||||
#ifndef LLHTTP_STRICT_MODE
|
||||
# define LLHTTP_STRICT_MODE 0
|
||||
@@ -348,6 +348,9 @@ struct llhttp_settings_s {
|
||||
*/
|
||||
llhttp_cb on_headers_complete;
|
||||
|
||||
+ /* Possible return values 0, -1, HPE_USER */
|
||||
+ llhttp_data_cb on_chunk_parameters;
|
||||
+
|
||||
/* Possible return values 0, -1, HPE_USER */
|
||||
llhttp_data_cb on_body;
|
||||
|
||||
diff --git a/deps/llhttp/src/api.c b/deps/llhttp/src/api.c
|
||||
index c4ce197c58..d3065b3664 100644
|
||||
--- a/deps/llhttp/src/api.c
|
||||
+++ b/deps/llhttp/src/api.c
|
||||
@@ -355,6 +355,13 @@ int llhttp__on_chunk_header(llhttp_t* s, const char* p, const char* endp) {
|
||||
}
|
||||
|
||||
|
||||
+int llhttp__on_chunk_parameters(llhttp_t* s, const char* p, const char* endp) {
|
||||
+ int err;
|
||||
+ SPAN_CALLBACK_MAYBE(s, on_chunk_parameters, p, endp - p);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+
|
||||
int llhttp__on_chunk_complete(llhttp_t* s, const char* p, const char* endp) {
|
||||
int err;
|
||||
CALLBACK_MAYBE(s, on_chunk_complete);
|
||||
diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c
|
||||
index 5e7c5d1093..e6db6e3188 100644
|
||||
--- a/deps/llhttp/src/llhttp.c
|
||||
+++ b/deps/llhttp/src/llhttp.c
|
||||
@@ -340,6 +340,8 @@ enum llparse_state_e {
|
||||
s_n_llhttp__internal__n_invoke_is_equal_content_length,
|
||||
s_n_llhttp__internal__n_chunk_size_almost_done,
|
||||
s_n_llhttp__internal__n_chunk_parameters,
|
||||
+ s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters,
|
||||
+ s_n_llhttp__internal__n_chunk_parameters_ows,
|
||||
s_n_llhttp__internal__n_chunk_size_otherwise,
|
||||
s_n_llhttp__internal__n_chunk_size,
|
||||
s_n_llhttp__internal__n_chunk_size_digit,
|
||||
@@ -539,6 +541,10 @@ int llhttp__on_body(
|
||||
llhttp__internal_t* s, const unsigned char* p,
|
||||
const unsigned char* endp);
|
||||
|
||||
+int llhttp__on_chunk_parameters(
|
||||
+ llhttp__internal_t* s, const unsigned char* p,
|
||||
+ const unsigned char* endp);
|
||||
+
|
||||
int llhttp__on_status(
|
||||
llhttp__internal_t* s, const unsigned char* p,
|
||||
const unsigned char* endp);
|
||||
@@ -1226,8 +1232,7 @@ static llparse_state_t llhttp__internal__run(
|
||||
goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
}
|
||||
case 2: {
|
||||
- p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_parameters;
|
||||
}
|
||||
default: {
|
||||
goto s_n_llhttp__internal__n_error_10;
|
||||
@@ -1236,6 +1241,34 @@ static llparse_state_t llhttp__internal__run(
|
||||
/* UNREACHABLE */;
|
||||
abort();
|
||||
}
|
||||
+ case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters:
|
||||
+ s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters: {
|
||||
+ if (p == endp) {
|
||||
+ return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters;
|
||||
+ }
|
||||
+ state->_span_pos0 = (void*) p;
|
||||
+ state->_span_cb0 = llhttp__on_chunk_parameters;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
+ case s_n_llhttp__internal__n_chunk_parameters_ows:
|
||||
+ s_n_llhttp__internal__n_chunk_parameters_ows: {
|
||||
+ if (p == endp) {
|
||||
+ return s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
+ }
|
||||
+ switch (*p) {
|
||||
+ case ' ': {
|
||||
+ p++;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
+ }
|
||||
+ default: {
|
||||
+ goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters;
|
||||
+ }
|
||||
+ }
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
case s_n_llhttp__internal__n_chunk_size_otherwise:
|
||||
s_n_llhttp__internal__n_chunk_size_otherwise: {
|
||||
if (p == endp) {
|
||||
@@ -1246,13 +1279,9 @@ static llparse_state_t llhttp__internal__run(
|
||||
p++;
|
||||
goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
}
|
||||
- case ' ': {
|
||||
- p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
- }
|
||||
case ';': {
|
||||
p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
}
|
||||
default: {
|
||||
goto s_n_llhttp__internal__n_error_11;
|
||||
@@ -6074,6 +6103,24 @@ static llparse_state_t llhttp__internal__run(
|
||||
/* UNREACHABLE */;
|
||||
abort();
|
||||
}
|
||||
+ s_n_llhttp__internal__n_span_end_llhttp__on_chunk_parameters: {
|
||||
+ const unsigned char* start;
|
||||
+ int err;
|
||||
+
|
||||
+ start = state->_span_pos0;
|
||||
+ state->_span_pos0 = NULL;
|
||||
+ err = llhttp__on_chunk_parameters(state, start, p);
|
||||
+ if (err != 0) {
|
||||
+ state->error = err;
|
||||
+ state->error_pos = (const char*) (p + 1);
|
||||
+ state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ return s_error;
|
||||
+ }
|
||||
+ p++;
|
||||
+ goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
s_n_llhttp__internal__n_error_10: {
|
||||
state->error = 0x2;
|
||||
state->reason = "Invalid character in chunk parameters";
|
||||
@@ -8441,6 +8488,8 @@ enum llparse_state_e {
|
||||
s_n_llhttp__internal__n_invoke_is_equal_content_length,
|
||||
s_n_llhttp__internal__n_chunk_size_almost_done,
|
||||
s_n_llhttp__internal__n_chunk_parameters,
|
||||
+ s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters,
|
||||
+ s_n_llhttp__internal__n_chunk_parameters_ows,
|
||||
s_n_llhttp__internal__n_chunk_size_otherwise,
|
||||
s_n_llhttp__internal__n_chunk_size,
|
||||
s_n_llhttp__internal__n_chunk_size_digit,
|
||||
@@ -8635,6 +8684,10 @@ int llhttp__on_body(
|
||||
llhttp__internal_t* s, const unsigned char* p,
|
||||
const unsigned char* endp);
|
||||
|
||||
+int llhttp__on_chunk_parameters(
|
||||
+ llhttp__internal_t* s, const unsigned char* p,
|
||||
+ const unsigned char* endp);
|
||||
+
|
||||
int llhttp__on_status(
|
||||
llhttp__internal_t* s, const unsigned char* p,
|
||||
const unsigned char* endp);
|
||||
@@ -9299,8 +9352,7 @@ static llparse_state_t llhttp__internal__run(
|
||||
goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
}
|
||||
case 2: {
|
||||
- p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_parameters;
|
||||
}
|
||||
default: {
|
||||
goto s_n_llhttp__internal__n_error_6;
|
||||
@@ -9309,6 +9361,34 @@ static llparse_state_t llhttp__internal__run(
|
||||
/* UNREACHABLE */;
|
||||
abort();
|
||||
}
|
||||
+ case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters:
|
||||
+ s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters: {
|
||||
+ if (p == endp) {
|
||||
+ return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters;
|
||||
+ }
|
||||
+ state->_span_pos0 = (void*) p;
|
||||
+ state->_span_cb0 = llhttp__on_chunk_parameters;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
+ case s_n_llhttp__internal__n_chunk_parameters_ows:
|
||||
+ s_n_llhttp__internal__n_chunk_parameters_ows: {
|
||||
+ if (p == endp) {
|
||||
+ return s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
+ }
|
||||
+ switch (*p) {
|
||||
+ case ' ': {
|
||||
+ p++;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
+ }
|
||||
+ default: {
|
||||
+ goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_parameters;
|
||||
+ }
|
||||
+ }
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
case s_n_llhttp__internal__n_chunk_size_otherwise:
|
||||
s_n_llhttp__internal__n_chunk_size_otherwise: {
|
||||
if (p == endp) {
|
||||
@@ -9319,13 +9399,9 @@ static llparse_state_t llhttp__internal__run(
|
||||
p++;
|
||||
goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
}
|
||||
- case ' ': {
|
||||
- p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
- }
|
||||
case ';': {
|
||||
p++;
|
||||
- goto s_n_llhttp__internal__n_chunk_parameters;
|
||||
+ goto s_n_llhttp__internal__n_chunk_parameters_ows;
|
||||
}
|
||||
default: {
|
||||
goto s_n_llhttp__internal__n_error_7;
|
||||
@@ -13951,6 +14027,24 @@ static llparse_state_t llhttp__internal__run(
|
||||
/* UNREACHABLE */;
|
||||
abort();
|
||||
}
|
||||
+ s_n_llhttp__internal__n_span_end_llhttp__on_chunk_parameters: {
|
||||
+ const unsigned char* start;
|
||||
+ int err;
|
||||
+
|
||||
+ start = state->_span_pos0;
|
||||
+ state->_span_pos0 = NULL;
|
||||
+ err = llhttp__on_chunk_parameters(state, start, p);
|
||||
+ if (err != 0) {
|
||||
+ state->error = err;
|
||||
+ state->error_pos = (const char*) (p + 1);
|
||||
+ state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ return s_error;
|
||||
+ }
|
||||
+ p++;
|
||||
+ goto s_n_llhttp__internal__n_chunk_size_almost_done;
|
||||
+ /* UNREACHABLE */;
|
||||
+ abort();
|
||||
+ }
|
||||
s_n_llhttp__internal__n_error_6: {
|
||||
state->error = 0x2;
|
||||
state->reason = "Invalid character in chunk parameters";
|
||||
diff --git a/doc/api/errors.md b/doc/api/errors.md
|
||||
index dcf8744d8b..a76bfe528d 100644
|
||||
--- a/doc/api/errors.md
|
||||
+++ b/doc/api/errors.md
|
||||
@@ -3043,6 +3043,18 @@ malconfigured clients, if more than 8 KiB of HTTP header data is received then
|
||||
HTTP parsing will abort without a request or response object being created, and
|
||||
an `Error` with this code will be emitted.
|
||||
|
||||
+<a id="HPE_CHUNK_EXTENSIONS_OVERFLOW"></a>
|
||||
+
|
||||
+### `HPE_CHUNK_EXTENSIONS_OVERFLOW`
|
||||
+
|
||||
+<!-- YAML
|
||||
+added: REPLACEME
|
||||
+-->
|
||||
+
|
||||
+Too much data was received for a chunk extensions. In order to protect against
|
||||
+malicious or malconfigured clients, if more than 16 KiB of data is received
|
||||
+then an `Error` with this code will be emitted.
|
||||
+
|
||||
<a id="HPE_UNEXPECTED_CONTENT_LENGTH"></a>
|
||||
|
||||
### `HPE_UNEXPECTED_CONTENT_LENGTH`
|
||||
diff --git a/lib/_http_server.js b/lib/_http_server.js
|
||||
index 4e23266f63..325bce6f54 100644
|
||||
--- a/lib/_http_server.js
|
||||
+++ b/lib/_http_server.js
|
||||
@@ -706,6 +706,12 @@ const requestHeaderFieldsTooLargeResponse = Buffer.from(
|
||||
`HTTP/1.1 431 ${STATUS_CODES[431]}\r\n` +
|
||||
'Connection: close\r\n\r\n', 'ascii'
|
||||
);
|
||||
+
|
||||
+const requestChunkExtensionsTooLargeResponse = Buffer.from(
|
||||
+ `HTTP/1.1 413 ${STATUS_CODES[413]}\r\n` +
|
||||
+ 'Connection: close\r\n\r\n', 'ascii',
|
||||
+);
|
||||
+
|
||||
function socketOnError(e) {
|
||||
// Ignore further errors
|
||||
this.removeListener('error', socketOnError);
|
||||
@@ -719,6 +725,9 @@ function socketOnError(e) {
|
||||
case 'HPE_HEADER_OVERFLOW':
|
||||
response = requestHeaderFieldsTooLargeResponse;
|
||||
break;
|
||||
+ case 'HPE_CHUNK_EXTENSIONS_OVERFLOW':
|
||||
+ response = requestChunkExtensionsTooLargeResponse;
|
||||
+ break;
|
||||
case 'ERR_HTTP_REQUEST_TIMEOUT':
|
||||
response = requestTimeoutResponse;
|
||||
break;
|
||||
diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc
|
||||
index 74f32480b9..b92e8486ae 100644
|
||||
--- a/src/node_http_parser.cc
|
||||
+++ b/src/node_http_parser.cc
|
||||
@@ -79,6 +79,8 @@ const uint32_t kOnExecute = 5;
|
||||
const uint32_t kOnTimeout = 6;
|
||||
// Any more fields than this will be flushed into JS
|
||||
const size_t kMaxHeaderFieldsCount = 32;
|
||||
+// Maximum size of chunk extensions
|
||||
+const size_t kMaxChunkExtensionsSize = 16384;
|
||||
|
||||
const uint32_t kLenientNone = 0;
|
||||
const uint32_t kLenientHeaders = 1 << 0;
|
||||
@@ -206,6 +208,7 @@ class Parser : public AsyncWrap, public StreamListener {
|
||||
|
||||
int on_message_begin() {
|
||||
num_fields_ = num_values_ = 0;
|
||||
+ chunk_extensions_nread_ = 0;
|
||||
url_.Reset();
|
||||
status_message_.Reset();
|
||||
header_parsing_start_time_ = uv_hrtime();
|
||||
@@ -443,9 +446,22 @@ class Parser : public AsyncWrap, public StreamListener {
|
||||
return 0;
|
||||
}
|
||||
|
||||
- // Reset nread for the next chunk
|
||||
+ int on_chunk_extension(const char* at, size_t length) {
|
||||
+ chunk_extensions_nread_ += length;
|
||||
+
|
||||
+ if (chunk_extensions_nread_ > kMaxChunkExtensionsSize) {
|
||||
+ llhttp_set_error_reason(&parser_,
|
||||
+ "HPE_CHUNK_EXTENSIONS_OVERFLOW:Chunk extensions overflow");
|
||||
+ return HPE_USER;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ // Reset nread for the next chunk and also reset the extensions counter
|
||||
int on_chunk_header() {
|
||||
header_nread_ = 0;
|
||||
+ chunk_extensions_nread_ = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -887,6 +903,7 @@ class Parser : public AsyncWrap, public StreamListener {
|
||||
const char* current_buffer_data_;
|
||||
bool pending_pause_ = false;
|
||||
uint64_t header_nread_ = 0;
|
||||
+ uint64_t chunk_extensions_nread_ = 0;
|
||||
uint64_t max_http_header_size_;
|
||||
uint64_t headers_timeout_;
|
||||
uint64_t header_parsing_start_time_ = 0;
|
||||
@@ -921,6 +938,7 @@ const llhttp_settings_t Parser::settings = {
|
||||
Proxy<DataCall, &Parser::on_header_field>::Raw,
|
||||
Proxy<DataCall, &Parser::on_header_value>::Raw,
|
||||
Proxy<Call, &Parser::on_headers_complete>::Raw,
|
||||
+ Proxy<DataCall, &Parser::on_chunk_extension>::Raw,
|
||||
Proxy<DataCall, &Parser::on_body>::Raw,
|
||||
Proxy<Call, &Parser::on_message_complete>::Raw,
|
||||
Proxy<Call, &Parser::on_chunk_header>::Raw,
|
||||
diff --git a/test/parallel/test-http-chunk-extensions-limit.js b/test/parallel/test-http-chunk-extensions-limit.js
|
||||
new file mode 100644
|
||||
index 0000000000..6868b3da6c
|
||||
--- /dev/null
|
||||
+++ b/test/parallel/test-http-chunk-extensions-limit.js
|
||||
@@ -0,0 +1,131 @@
|
||||
+'use strict';
|
||||
+
|
||||
+const common = require('../common');
|
||||
+const http = require('http');
|
||||
+const net = require('net');
|
||||
+const assert = require('assert');
|
||||
+
|
||||
+// Verify that chunk extensions are limited in size when sent all together.
|
||||
+{
|
||||
+ const server = http.createServer((req, res) => {
|
||||
+ req.on('end', () => {
|
||||
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||
+ res.end('bye');
|
||||
+ });
|
||||
+
|
||||
+ req.resume();
|
||||
+ });
|
||||
+
|
||||
+ server.listen(0, () => {
|
||||
+ const sock = net.connect(server.address().port);
|
||||
+ let data = '';
|
||||
+
|
||||
+ sock.on('data', (chunk) => data += chunk.toString('utf-8'));
|
||||
+
|
||||
+ sock.on('end', common.mustCall(function() {
|
||||
+ assert.strictEqual(data, 'HTTP/1.1 413 Payload Too Large\r\nConnection: close\r\n\r\n');
|
||||
+ server.close();
|
||||
+ }));
|
||||
+
|
||||
+ sock.end('' +
|
||||
+ 'GET / HTTP/1.1\r\n' +
|
||||
+ 'Host: localhost:8080\r\n' +
|
||||
+ 'Transfer-Encoding: chunked\r\n\r\n' +
|
||||
+ '2;' + 'A'.repeat(20000) + '=bar\r\nAA\r\n' +
|
||||
+ '0\r\n\r\n'
|
||||
+ );
|
||||
+ });
|
||||
+}
|
||||
+
|
||||
+// Verify that chunk extensions are limited in size when sent in intervals.
|
||||
+{
|
||||
+ const server = http.createServer((req, res) => {
|
||||
+ req.on('end', () => {
|
||||
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||
+ res.end('bye');
|
||||
+ });
|
||||
+
|
||||
+ req.resume();
|
||||
+ });
|
||||
+
|
||||
+ server.listen(0, () => {
|
||||
+ const sock = net.connect(server.address().port);
|
||||
+ let remaining = 20000;
|
||||
+ let data = '';
|
||||
+
|
||||
+ const interval = setInterval(
|
||||
+ () => {
|
||||
+ if (remaining > 0) {
|
||||
+ sock.write('A'.repeat(1000));
|
||||
+ } else {
|
||||
+ sock.write('=bar\r\nAA\r\n0\r\n\r\n');
|
||||
+ clearInterval(interval);
|
||||
+ }
|
||||
+
|
||||
+ remaining -= 1000;
|
||||
+ },
|
||||
+ common.platformTimeout(20),
|
||||
+ ).unref();
|
||||
+
|
||||
+ sock.on('data', (chunk) => data += chunk.toString('utf-8'));
|
||||
+
|
||||
+ sock.on('end', common.mustCall(function() {
|
||||
+ assert.strictEqual(data, 'HTTP/1.1 413 Payload Too Large\r\nConnection: close\r\n\r\n');
|
||||
+ server.close();
|
||||
+ }));
|
||||
+
|
||||
+ sock.write('' +
|
||||
+ 'GET / HTTP/1.1\r\n' +
|
||||
+ 'Host: localhost:8080\r\n' +
|
||||
+ 'Transfer-Encoding: chunked\r\n\r\n' +
|
||||
+ '2;'
|
||||
+ );
|
||||
+ });
|
||||
+}
|
||||
+
|
||||
+// Verify the chunk extensions is correctly reset after a chunk
|
||||
+{
|
||||
+ const server = http.createServer((req, res) => {
|
||||
+ req.on('end', () => {
|
||||
+ res.writeHead(200, { 'content-type': 'text/plain', 'connection': 'close', 'date': 'now' });
|
||||
+ res.end('bye');
|
||||
+ });
|
||||
+
|
||||
+ req.resume();
|
||||
+ });
|
||||
+
|
||||
+ server.listen(0, () => {
|
||||
+ const sock = net.connect(server.address().port);
|
||||
+ let data = '';
|
||||
+
|
||||
+ sock.on('data', (chunk) => data += chunk.toString('utf-8'));
|
||||
+
|
||||
+ sock.on('end', common.mustCall(function() {
|
||||
+ assert.strictEqual(
|
||||
+ data,
|
||||
+ 'HTTP/1.1 200 OK\r\n' +
|
||||
+ 'content-type: text/plain\r\n' +
|
||||
+ 'connection: close\r\n' +
|
||||
+ 'date: now\r\n' +
|
||||
+ 'Transfer-Encoding: chunked\r\n' +
|
||||
+ '\r\n' +
|
||||
+ '3\r\n' +
|
||||
+ 'bye\r\n' +
|
||||
+ '0\r\n' +
|
||||
+ '\r\n',
|
||||
+ );
|
||||
+
|
||||
+ server.close();
|
||||
+ }));
|
||||
+
|
||||
+ sock.end('' +
|
||||
+ 'GET / HTTP/1.1\r\n' +
|
||||
+ 'Host: localhost:8080\r\n' +
|
||||
+ 'Transfer-Encoding: chunked\r\n\r\n' +
|
||||
+ '2;' + 'A'.repeat(10000) + '=bar\r\nAA\r\n' +
|
||||
+ '2;' + 'A'.repeat(10000) + '=bar\r\nAA\r\n' +
|
||||
+ '2;' + 'A'.repeat(10000) + '=bar\r\nAA\r\n' +
|
||||
+ '0\r\n\r\n'
|
||||
+ );
|
||||
+ });
|
||||
+}
|
||||
diff --git a/tools/update-llhttp.sh b/tools/update-llhttp.sh
|
||||
index 12e2f465d7..a95eef1237 100755
|
||||
--- a/tools/update-llhttp.sh
|
||||
+++ b/tools/update-llhttp.sh
|
||||
@@ -59,5 +59,5 @@ echo ""
|
||||
echo "Please git add llhttp, commit the new version:"
|
||||
echo ""
|
||||
echo "$ git add -A deps/llhttp"
|
||||
-echo "$ git commit -m \"deps: update nghttp2 to $LLHTTP_VERSION\""
|
||||
+echo "$ git commit -m \"deps: update llhttp to $LLHTTP_VERSION\""
|
||||
echo ""
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -128,7 +128,7 @@ echo "$ICUMD5 $ICUTARBALL" > icu.md5
|
|||
md5sum -c icu.md5
|
||||
rm -f icu.md5 SHASUMS256.txt
|
||||
|
||||
rhpkg new-sources node-v${version}-stripped.tar.gz icu4c*-src.tgz
|
||||
#fedpkg new-sources node-v${version}-stripped.tar.gz icu4c*-src.tgz
|
||||
|
||||
rm -f node-v${version}.tar.gz
|
||||
|
||||
|
@ -155,11 +155,11 @@ grep "define ARES_VERSION_MAJOR" node-v${version}/deps/cares/include/ares_versio
|
|||
grep "define ARES_VERSION_MINOR" node-v${version}/deps/cares/include/ares_version.h
|
||||
grep "define ARES_VERSION_PATCH" node-v${version}/deps/cares/include/ares_version.h
|
||||
echo
|
||||
echo "http-parser"
|
||||
echo "llhttp"
|
||||
echo "========================="
|
||||
grep "define HTTP_PARSER_VERSION_MAJOR" node-v${version}/deps/http_parser/http_parser.h
|
||||
grep "define HTTP_PARSER_VERSION_MINOR" node-v${version}/deps/http_parser/http_parser.h
|
||||
grep "define HTTP_PARSER_VERSION_PATCH" node-v${version}/deps/http_parser/http_parser.h
|
||||
grep "define LLHTTP_VERSION_MAJOR" node-v${version}/deps/llhttp/include/llhttp.h
|
||||
grep "define LLHTTP_VERSION_MINOR" node-v${version}/deps/llhttp/include/llhttp.h
|
||||
grep "define LLHTTP_VERSION_PATCH" node-v${version}/deps/llhttp/include/llhttp.h
|
||||
echo
|
||||
echo "libuv"
|
||||
echo "========================="
|
||||
|
@ -171,6 +171,14 @@ echo "nghttp2"
|
|||
echo "========================="
|
||||
grep "define NGHTTP2_VERSION " node-v${version}/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h
|
||||
echo
|
||||
echo "nghttp3"
|
||||
echo "========================="
|
||||
grep "define NGHTTP3_VERSION " node-v${version}/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h
|
||||
echo
|
||||
echo "ngtcp2"
|
||||
echo "========================="
|
||||
grep "define NGTCP2_VERSION " node-v${version}/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h
|
||||
echo
|
||||
echo "ICU"
|
||||
echo "========================="
|
||||
grep "url" node-v${version}/tools/icu/current_ver.dep
|
||||
|
@ -179,6 +187,12 @@ echo "punycode"
|
|||
echo "========================="
|
||||
grep "'version'" node-v${version}/lib/punycode.js
|
||||
echo
|
||||
echo "uvwasi"
|
||||
echo "========================="
|
||||
grep "define UVWASI_VERSION_MAJOR" node-v${version}/deps/uvwasi/include/uvwasi.h
|
||||
grep "define UVWASI_VERSION_MINOR" node-v${version}/deps/uvwasi/include/uvwasi.h
|
||||
grep "define UVWASI_VERSION_PATCH" node-v${version}/deps/uvwasi/include/uvwasi.h
|
||||
echo
|
||||
echo "npm"
|
||||
echo "========================="
|
||||
grep "\"version\":" node-v${version}/deps/npm/package.json
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
prefix=/usr/local
|
||||
python=/usr/bin/python3
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# This is the distibution-level configuration file for npm.
|
||||
# To configure NPM on a system level, use the globalconfig below (defaults to @SYSCONFDIR@/npmrc).
|
||||
# vim:set filetype=dosini:
|
||||
|
||||
globalconfig=@SYSCONFDIR@/npmrc
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue