Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f95bedd
Working on v24.16.1
aduh95 May 21, 2026
cf44df3
deps: update undici to 7.28.0
nodejs-github-bot Jun 15, 2026
3a631e7
deps: fix aix implicit declaration in OpenSSL
abmusse Mar 30, 2026
684bae5
deps: upgrade openssl sources to openssl-3.5.7
nodejs-github-bot Jun 9, 2026
dd627ce
deps: update archs files for openssl-3.5.7
nodejs-github-bot Jun 9, 2026
66e6203
deps: update nghttp2 to 1.69.0
nodejs-github-bot Apr 26, 2026
a8a0d12
deps: fix integration issues with the latest nghttp2
pimterry Apr 22, 2026
cb2aed9
deps: update llhttp to 9.4.2
aduh95 Jun 9, 2026
9224427
lib,test: redact proxy credentials in tunnel errors
mcollina May 10, 2026
a1bbc24
permission: handle process.chdir on writereport
RafaelGSS May 11, 2026
8e75c73
tls: normalize hostname for server identity checks
mcollina May 11, 2026
cc7c11b
http2: cap originSet size to prevent unbounded memory growth
mcollina Apr 19, 2026
31beb4f
tls: fix case-sensitive SNI context matching
mcollina Apr 20, 2026
138c702
dns,net: reject hostnames with embedded NUL bytes
mcollina May 11, 2026
cf85d54
permission: disable FileHandle utimes with permission model
RafaelGSS May 11, 2026
be7e719
http: fix response queue poisoning in http.Agent
mcollina Mar 29, 2026
9e4dfc7
crypto: guard WebCrypto cipher output length
panva May 25, 2026
a77af48
tls: bind reusable sessions to authenticated host
mcollina Apr 13, 2026
e3723ff
test: add session reuse host verification regressions
mcollina Apr 12, 2026
413e874
2026-06-18, Version 24.17.0 'Krypton' (LTS)
aduh95 Jun 17, 2026
3398eac
Merge tag 'v24.17.0' into node-v24.17.0-nsolid-v6.3.1-release
santigimeno Jun 18, 2026
59f5719
2026-06-18, Version 24.17.0-nsolid-v6.3.1 'Krypton'
santigimeno Jun 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ release.
</tr>
<tr>
<td valign="top">
<b><a href="doc/changelogs/CHANGELOG_V24.md#24.16.0">24.16.0</a></b><br/>
<b><a href="doc/changelogs/CHANGELOG_V24.md#24.17.0">24.17.0</a></b><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.16.0">24.16.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.15.0">24.15.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.14.1">24.14.1</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.14.0">24.14.0</a><br/>
Expand Down
2 changes: 1 addition & 1 deletion deps/llhttp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.25.0)
cmake_policy(SET CMP0069 NEW)

project(llhttp VERSION 9.4.1)
project(llhttp VERSION 9.4.2)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

Expand Down
2 changes: 1 addition & 1 deletion deps/llhttp/include/llhttp.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#define LLHTTP_VERSION_MAJOR 9
#define LLHTTP_VERSION_MINOR 4
#define LLHTTP_VERSION_PATCH 1
#define LLHTTP_VERSION_PATCH 2

#ifndef INCLUDE_LLHTTP_ITSELF_H_
#define INCLUDE_LLHTTP_ITSELF_H_
Expand Down
8 changes: 4 additions & 4 deletions deps/llhttp/src/llhttp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2471,6 +2471,10 @@ static llparse_state_t llhttp__internal__run(
return s_n_llhttp__internal__n_header_value_connection_ws;
}
switch (*p) {
case 9: {
p++;
goto s_n_llhttp__internal__n_header_value_connection_ws;
}
case 10: {
goto s_n_llhttp__internal__n_header_value_otherwise;
}
Expand Down Expand Up @@ -6294,10 +6298,6 @@ static llparse_state_t llhttp__internal__run(
p++;
goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete;
}
case 13: {
p++;
goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete;
}
default: {
goto s_n_llhttp__internal__n_invoke_test_lenient_flags_30;
}
Expand Down
2 changes: 1 addition & 1 deletion deps/nghttp2/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ set(NGHTTP2_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(NGHTTP2_VERSION_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
set(NGHTTP2_PROJECT_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}Config.cmake")
set(NGHTTP2_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
set(NGHTTP2_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}")
set(NGHTTP2_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
set(NGHTTP2_NAMESPACE "${PROJECT_NAME}::")
set(NGHTTP2_VERSION ${PROJECT_VERSION})

Expand Down
2 changes: 1 addition & 1 deletion deps/nghttp2/lib/includes/nghttp2/nghttp2.h
Original file line number Diff line number Diff line change
Expand Up @@ -3252,7 +3252,7 @@ NGHTTP2_EXTERN void nghttp2_option_set_max_continuations(nghttp2_option *option,
* regenerated per second. When a suspicious activity is detected,
* some amount of tokens are consumed. If there is no token
* available, GOAWAY is sent to tear down the connection. |burst| and
* |rate| default to 1000 and 33 respectively.
* |rate| default to 10000 and 330 respectively.
*/
NGHTTP2_EXTERN void nghttp2_option_set_glitch_rate_limit(nghttp2_option *option,
uint64_t burst,
Expand Down
4 changes: 2 additions & 2 deletions deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@
* @macro
* Version number of the nghttp2 library release
*/
#define NGHTTP2_VERSION "1.68.0"
#define NGHTTP2_VERSION "1.69.0"

/**
* @macro
* Numerical representation of the version number of the nghttp2 library
* release. This is a 24 bit number with 8 bits for major number, 8 bits
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
*/
#define NGHTTP2_VERSION_NUM 0x014400
#define NGHTTP2_VERSION_NUM 0x014500

#endif /* NGHTTP2VER_H */
4 changes: 3 additions & 1 deletion deps/nghttp2/lib/nghttp2_alpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

#include <string.h>

#include "nghttp2_helper.h"

static int select_alpn(const unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen,
const char *key, unsigned int keylen) {
Expand All @@ -41,7 +43,7 @@ static int select_alpn(const unsigned char **out, unsigned char *outlen,
}

#define NGHTTP2_HTTP_1_1_ALPN "\x8http/1.1"
#define NGHTTP2_HTTP_1_1_ALPN_LEN (sizeof(NGHTTP2_HTTP_1_1_ALPN) - 1)
#define NGHTTP2_HTTP_1_1_ALPN_LEN nghttp2_strlen_lit(NGHTTP2_HTTP_1_1_ALPN)

int nghttp2_select_next_protocol(unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen) {
Expand Down
10 changes: 10 additions & 0 deletions deps/nghttp2/lib/nghttp2_frame.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,16 @@ void nghttp2_frame_unpack_altsvc_payload(nghttp2_extension *frame,
uint8_t *p;

altsvc = frame->payload;

if (payloadlen == 0) {
altsvc->origin = NULL;
altsvc->origin_len = 0;
altsvc->field_value = NULL;
altsvc->field_value_len = 0;

return;
}
Comment on lines +754 to +761

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect ALTSVC unpack implementations and nearby checks.
rg -n -C4 '\bnghttp2_frame_unpack_altsvc_payload2?\b' deps/nghttp2/lib/nghttp2_frame.c

# Look for explicit origin-length vs payload-length validation.
rg -n -C3 'origin_len.*payloadlen|payloadlen.*origin_len|FRAME_SIZE_ERROR' \
  deps/nghttp2/lib/nghttp2_frame.c \
  deps/nghttp2/lib/nghttp2_session.c \
  deps/nghttp2/lib/nghttp2_http.c

# Trace ALTSVC consumption/validation points.
rg -n -C4 'ALTSVC|altsvc' \
  deps/nghttp2/lib/nghttp2_frame.c \
  deps/nghttp2/lib/nghttp2_session.c \
  deps/nghttp2/lib/nghttp2_http.c

Repository: nodesource/nsolid

Length of output: 31777


🏁 Script executed:

# Search for all callers of both unpack functions
rg -n 'nghttp2_frame_unpack_altsvc_payload' deps/nghttp2/lib/ --type c

# Check if the payload2 variant is exported in headers
rg -n 'nghttp2_frame_unpack_altsvc_payload2' deps/nghttp2/

# Look for the function declaration in headers
fd -e h | xargs rg -l 'nghttp2_frame_unpack_altsvc'

Repository: nodesource/nsolid

Length of output: 1111


🏁 Script executed:

# Check the header declarations and documentation
sed -n '350,375p' deps/nghttp2/lib/nghttp2_frame.h

# Look at the call in session.c context around line 4935
sed -n '4930,4945p' deps/nghttp2/lib/nghttp2_session.c

# Check validation logic around line 6340-6351 more carefully
sed -n '6340,6360p' deps/nghttp2/lib/nghttp2_session.c

Repository: nodesource/nsolid

Length of output: 2162


🏁 Script executed:

# Check the full context of line 6340-6370 to see the complete state handling
sed -n '6340,6370p' deps/nghttp2/lib/nghttp2_session.c

# Verify the flow: after validation passes, what payloadleft value is used?
sed -n '6340,6365p' deps/nghttp2/lib/nghttp2_session.c | cat -n

# Check what happens when payloadleft becomes the actual payload buffer length
sed -n '7015,7040p' deps/nghttp2/lib/nghttp2_session.c

Repository: nodesource/nsolid

Length of output: 2468


🏁 Script executed:

# Need to understand the state machine better - check what payloadleft represents at line 6347
# Search for where payloadleft is set/updated for ALTSVC frames
rg -n 'payloadleft.*=' deps/nghttp2/lib/nghttp2_session.c | grep -A5 -B5 6340

# Check the exact state at line 6343 - has the 2-byte header been consumed from payloadleft yet?
sed -n '6330,6352p' deps/nghttp2/lib/nghttp2_session.c

# Also verify nghttp2_frame_unpack_altsvc_payload2 more carefully (test-only function)
sed -n '775,798p' deps/nghttp2/lib/nghttp2_frame.c

Repository: nodesource/nsolid

Length of output: 1186


🏁 Script executed:

# Let me trace the exact issue: at line 6347, what is payloadleft?
# Is it the total frame payload length, or remaining after header?

# Search for where sbuf is consumed in the ALTSVC frame handling
sed -n '6330,6370p' deps/nghttp2/lib/nghttp2_session.c | head -45

# Check what happens before the validation - is sbuf consumed first?
rg -n 'NGHTTP2_IB_READ_' deps/nghttp2/lib/nghttp2_session.c | grep -i altsvc

# Look at the state transitions - when does payloadleft get decremented for the 2-byte header?
sed -n '5955,5970p' deps/nghttp2/lib/nghttp2_session.c

Repository: nodesource/nsolid

Length of output: 1608


🏁 Script executed:

# Let me verify the exact issue: check if the 2-byte header is included in payloadleft at line 6347
# by looking at how origin_len is validated versus how the payload is actually split

# Key question: when the check at line 6347 happens, does payloadleft include the 2-byte header?
# Look at what happens right after the validation
sed -n '6340,6370p' deps/nghttp2/lib/nghttp2_session.c

# Now check: when session_process_altsvc_frame is called, what is the actual data passed?
sed -n '4931,4945p' deps/nghttp2/lib/nghttp2_session.c

# The critical piece: iframe->lbuf at this point contains what exactly?
# Let's check how lbuf and sbuf are split for ALTSVC
rg -n -B5 -A5 'NGHTTP2_IB_READ_ALTSVC_PAYLOAD' deps/nghttp2/lib/nghttp2_session.c | head -40

Repository: nodesource/nsolid

Length of output: 2148


🏁 Script executed:

# Verify the critical detail: at line 6347, is payloadleft the TOTAL frame length or remaining?
# Check by looking at the frame header parsing to understand payloadleft initialization

rg -n 'payloadleft.*hd\.length' deps/nghttp2/lib/nghttp2_session.c | head -20

# Also check: when the check at 6347 happens, has the 2-byte sbuf been consumed from payloadleft?
sed -n '6300,6350p' deps/nghttp2/lib/nghttp2_session.c | grep -A20 'case NGHTTP2_ALTSVC'

Repository: nodesource/nsolid

Length of output: 480


🏁 Script executed:

# Critical insight: at line 6347, payloadleft == frame.hd.length
# So checking origin_len > payloadleft is checking against TOTAL frame length
# But origin_len should be checked against (frame.hd.length - 2) since 2 bytes are the header

# Confirm: the actual payload passed to unpack has size = frame.hd.length - 2
# Let's trace through the exact bytes passed

# In session_process_altsvc_frame (line 4935-4937):
# - passes iframe->lbuf.pos (allocated at line 6357 with size frame.hd.length - 2)
# - passes nghttp2_buf_len(&iframe->lbuf) (which would be frame.hd.length - 2)

# So the question is: does the validation at line 6347 properly check?
# If origin_len > frame.hd.length, it fails ✓
# But if origin_len > (frame.hd.length - 2), should it fail?
# Currently: checks origin_len > payloadleft (= frame.hd.length) ✗

# Concrete example: frame.hd.length = 5, origin_len = 4
# Payload after header = 3 bytes
# Check: 4 > 5? NO, so passes ✗
# But origin_len=4 > 3 bytes available, so pointer math at line 767 would overflow!

# Verify: does line 6347 need to be: origin_len > (iframe->payloadleft - 2)?
sed -n '6343,6352p' deps/nghttp2/lib/nghttp2_session.c

Repository: nodesource/nsolid

Length of output: 327


The validation at line 6347 compares origin_len against the total frame length rather than available payload bytes.

When a frame contains only the 2-byte origin_len header plus N bytes of payload, the check origin_len > iframe->payloadleft (where payloadleft == frame.hd.length) allows origin_len values up to the total frame size. However, only frame.hd.length - 2 bytes are available for the origin field, causing the pointer arithmetic at line 767 to overflow when origin_len > (frame.hd.length - 2).

Additionally, the zero-payload fast path (lines 754–760) bypasses validation of the origin_len field entirely and unconditionally initializes it to zero without checking whether a non-zero origin_len was encoded in the frame header.

The validation at line 6347 should check origin_len > (iframe->payloadleft - 2), and the zero-payload path should validate that origin_len == 0 before returning.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deps/nghttp2/lib/nghttp2_frame.c` around lines 754 - 761, In the zero-payload
fast path where payloadlen equals 0, the code unconditionally initializes
altsvc->origin_len to zero without validating that the origin_len field actually
contains zero in the frame header. Add a validation check within the
zero-payload early return block to ensure origin_len equals zero before
proceeding. Additionally, locate the validation logic that compares origin_len
(likely at or near line 6347 in the payloadlen non-zero path) and correct the
comparison to account for the 2-byte origin_len header by changing `origin_len >
iframe->payloadleft` to `origin_len > (iframe->payloadleft - 2)` to prevent
pointer arithmetic overflow.


p = payload;

altsvc->origin = p;
Expand Down
3 changes: 0 additions & 3 deletions deps/nghttp2/lib/nghttp2_frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,7 @@
#include "nghttp2_buf.h"

#define NGHTTP2_STREAM_ID_MASK ((1u << 31) - 1)
#define NGHTTP2_PRI_GROUP_ID_MASK ((1u << 31) - 1)
#define NGHTTP2_PRIORITY_MASK ((1u << 31) - 1)
#define NGHTTP2_WINDOW_SIZE_INCREMENT_MASK ((1u << 31) - 1)
#define NGHTTP2_SETTINGS_ID_MASK ((1 << 24) - 1)

/* The number of bytes of frame header. */
#define NGHTTP2_FRAME_HDLEN 9
Expand Down
17 changes: 10 additions & 7 deletions deps/nghttp2/lib/nghttp2_hd.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@
/* Make scalar initialization form of nghttp2_hd_entry */
#define MAKE_STATIC_ENT(N, V, T, H) \
{ \
{NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \
{NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \
{(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \
{NULL, NULL, (uint8_t *)(N), nghttp2_strlen_lit((N)), -1}, \
{NULL, NULL, (uint8_t *)(V), nghttp2_strlen_lit((V)), -1}, \
{(uint8_t *)(N), (uint8_t *)(V), nghttp2_strlen_lit((N)), \
nghttp2_strlen_lit((V)), 0}, \
T, \
H, \
}
Expand Down Expand Up @@ -2058,8 +2059,9 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater,

inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAMEHUFF;

rv =
nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left * 2 + 1, mem);
rv = nghttp2_rcbuf_new(
&inflater->namercbuf,
nghttp2_huff_estimate_decode_length(inflater->left) + 1, mem);
} else {
inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAME;
rv = nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left + 1, mem);
Expand Down Expand Up @@ -2143,8 +2145,9 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater,

inflater->state = NGHTTP2_HD_STATE_READ_VALUEHUFF;

rv =
nghttp2_rcbuf_new(&inflater->valuercbuf, inflater->left * 2 + 1, mem);
rv = nghttp2_rcbuf_new(
&inflater->valuercbuf,
nghttp2_huff_estimate_decode_length(inflater->left) + 1, mem);
} else {
inflater->state = NGHTTP2_HD_STATE_READ_VALUE;

Expand Down
23 changes: 12 additions & 11 deletions deps/nghttp2/lib/nghttp2_hd_huffman.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,15 @@ int nghttp2_hd_huff_encode(nghttp2_bufs *bufs, const uint8_t *src,
}

void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx) {
ctx->fstate = NGHTTP2_HUFF_ACCEPTED;
ctx->fstate = 0;
ctx->flags = NGHTTP2_HUFF_ACCEPTED;
}

nghttp2_ssize nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
nghttp2_buf *buf, const uint8_t *src,
size_t srclen, int final) {
const uint8_t *end = src + srclen;
nghttp2_huff_decode node = {ctx->fstate, 0};
const nghttp2_huff_decode *t = &node;
nghttp2_huff_decode t = {ctx->fstate, ctx->flags, 0};
uint8_t c;

/* We use the decoding algorithm described in
Expand All @@ -121,20 +121,21 @@ nghttp2_ssize nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
- https://github.com/nghttp2/nghttp2/files/15141264/Prefix.pdf */
for (; src != end;) {
c = *src++;
t = &huff_decode_table[t->fstate & 0x1ff][c >> 4];
if (t->fstate & NGHTTP2_HUFF_SYM) {
*buf->last++ = t->sym;
t = huff_decode_table[t.fstate][c >> 4];
if (t.flags & NGHTTP2_HUFF_SYM) {
*buf->last++ = t.sym;
}

t = &huff_decode_table[t->fstate & 0x1ff][c & 0xf];
if (t->fstate & NGHTTP2_HUFF_SYM) {
*buf->last++ = t->sym;
t = huff_decode_table[t.fstate][c & 0xf];
if (t.flags & NGHTTP2_HUFF_SYM) {
*buf->last++ = t.sym;
}
}

ctx->fstate = t->fstate;
ctx->fstate = t.fstate;
ctx->flags = t.flags;

if (final && !(ctx->fstate & NGHTTP2_HUFF_ACCEPTED)) {
if (final && !(ctx->flags & NGHTTP2_HUFF_ACCEPTED)) {
return NGHTTP2_ERR_HEADER_COMP;
}

Expand Down
14 changes: 12 additions & 2 deletions deps/nghttp2/lib/nghttp2_hd_huffman.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
typedef enum {
/* FSA accepts this state as the end of huffman encoding
sequence. */
NGHTTP2_HUFF_ACCEPTED = 1 << 14,
NGHTTP2_HUFF_ACCEPTED = 1,
/* This state emits symbol */
NGHTTP2_HUFF_SYM = 1 << 15,
NGHTTP2_HUFF_SYM = 1 << 1,
} nghttp2_huff_decode_flag;

typedef struct {
Expand All @@ -48,6 +48,7 @@ typedef struct {
a special node and it is a terminal state that means decoding
failed. */
uint16_t fstate;
uint8_t flags;
/* symbol if NGHTTP2_HUFF_SYM flag set */
uint8_t sym;
} nghttp2_huff_decode;
Expand All @@ -57,6 +58,7 @@ typedef nghttp2_huff_decode huff_decode_table_type[16];
typedef struct {
/* fstate is the current huffman decoding state. */
uint16_t fstate;
uint8_t flags;
} nghttp2_hd_huff_decode_context;

typedef struct {
Expand All @@ -69,4 +71,12 @@ typedef struct {
extern const nghttp2_huff_sym huff_sym_table[];
extern const nghttp2_huff_decode huff_decode_table[][16];

/*
* nghttp2_huff_estimate_decode_length returns the estimated decoded
* length of the huffman encoded string of length |len|.
*/
static inline size_t nghttp2_huff_estimate_decode_length(size_t len) {
return len * 8 / 5;
}

#endif /* !defined(NGHTTP2_HD_HUFFMAN_H) */
Loading
Loading