zlib: Brotli reset() drops quality and dictionary
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 76/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- cpp, javascript, node.js
Línea de trabajo
Start in src/node_zlib.cc at BrotliEncoderContext::ResetStream, BrotliDecoderContext::ResetStream, and Init(), then run the JavaScript reproduction from the issue. Verify that reset preserves Brotli quality parameters and dictionaries for compression and decompression, and add regression coverage showing the configured behavior remains after reset.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Version
v27.0.0-pre (built from main at a2a051cd42; src/node_zlib.cc is unchanged on current main)
Platform
Linux x86_64 (Ubuntu 22.04, built with clang 20)
Subsystem
zlib
What steps will reproduce the bug?
Create a Brotli compressor with a custom quality or a dictionary, call .reset() before writing anything, then compress as usual.
The quality/dictionary you passed in is gone. Nothing throws.
import * as zlib from 'node:zlib';
const input = Buffer.from('the quick brown fox jumps over the lazy dog '.repeat(100));
const dict = Buffer.from('the quick brown fox jumps over the lazy dog '.repeat(40));
function compress(options, reset) {
return new Promise((resolve, reject) => {
const s = zlib.createBrotliCompress(options);
const chunks = [];
s.on('data', (d) => chunks.push(d));
s.on('error', reject);
if (reset) s.reset();
s.end(input);
s.on('end', () => resolve(Buffer.concat(chunks).length));
});
}
const q0 = { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 0 } };
console.log('quality 0, no reset:', await compress(q0, false)); // 109
console.log('quality 0, then reset:', await compress(q0, true)); // 55 (same as default quality 11)
console.log('with dictionary, no reset:', await compress({ dictionary: dict }, false)); // 18
console.log('with dictionary, then reset:', await compress({ dictionary: dict }, true)); // 55 (same as no dictionary)
const compressed = zlib.brotliCompressSync(input, { dictionary: dict });
const dec = zlib.createBrotliDecompress({ dictionary: dict });
dec.reset();
dec.end(compressed);
dec.on('error', (err) => console.log('decompress after reset:', err.code));
// ERR__ERROR_FORMAT_DICTIONARY
How often does it reproduce? Is there a required condition?
Always. You do not need to write any data first. Just construct the stream with options and call reset().
What is the expected behavior? Why is that the expected behavior?
reset() should start a new Brotli session on the same stream, keeping the quality/params and dictionary you already set.
That is what the same API already documents for Zstd (zlib.reset(): "start a new session while preserving the configured parameters and dictionary"), and it is what test/parallel/test-zlib-zstd-reset.js asserts. Brotli goes through the same JS reset() method.
If the dictionary is dropped, a decoder cannot read a dictionary-compressed frame at all.
What do you see instead?
- Quality 0 after
reset()compresses as if you had used the default quality 11 (109 bytes become 55). - A dictionary after
reset()compresses as if you had used no dictionary (18 bytes become 55). createBrotliDecompress({ dictionary })thenreset()fails withERR__ERROR_FORMAT_DICTIONARYon a frame that was compressed with that dictionary.
The compressor never reports an error. The settings just disappear.
Additional information
C++: BrotliEncoderContext::ResetStream / BrotliDecoderContext::ResetStream both do return Init(); with no arguments. Init() immediately does dictionary_.clear() and creates a brand-new Brotli instance. It never replays SetParams.
This is not #66087 / #66088. Those are about flush() then reset() leaving a broken frame. Here there is no write at all — only the configuration is thrown away.
LLDB on src/node_zlib.cc at a2a051cd42 (same ResetStream/Init as current main):
- Stopped in
BrotliEncoderContext::ResetStreamat line 1514. Watch:this->dictionary_still has size 1760. Next statement isreturn Init();with no dictionary argument.
- That call lands in
Initat line 1474, ondictionary_.clear();. Watch: the memberthis->dictionary_is still 1760 (clear has not run yet), but thedictionaryparameter is already size 0, becauseResetStreamdid not pass it in.
- Continue to line 1483,
if (!dictionary.empty()). Watch: boththis->dictionary_and thedictionaryparameter are now size 0, so the attach-dictionary branch is skipped.
- Lenguaje dominante
- JavaScript
- Estrellas
- 122k
- Forks
- 37.4k
- Merge medio
- 4 d 3 h
- PR fusionados (30 d)
- 279
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de nodejs/node
-
doc
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
build
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
feature request
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Todos los issues de nodejs/node
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Theme loads third-party resources on every page (jsdelivr web font, cdnjs Font Awesome) – GDPR Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
docToolchain/docToolchain#1705 ·
-
Timezone select lists one option per character; duplicate "Failed" reason; shared tracker popover id Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
nightscout/nocturne#1414 ·
-
bug v2
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
modelcontextprotocol/inspector#2458 · 1 comentario ·
-
Mend: dependency security vulnerability status: needs triage 🕵️♀️
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
carbon-design-system/ibm-products#9907 ·