buffer: UTF-16LE indexOf can hang on unaligned Buffer views
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 68/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- cpp, javascript, node.js
- Área
- backend
Línea de trabajo
Ejecuta primero la reproducción proporcionada y, después, inspecciona Buffer#indexOf en src/node_buffer.cc alrededor de las líneas 1119-1124 y la alineación de búsqueda de 16 bits en deps/nbytes/include/nbytes.h alrededor de las líneas 459-465. Rastrea cómo se pasa a la búsqueda una vista con un desplazamiento impar y añade cobertura de regresión para vistas alineadas y no alineadas. Se considera terminado cuando ambas búsquedas UTF-16LE finalizan y devuelven 0.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Version
v27.0.0-pre (b805fb5158a)
Platform
Darwin 24.6.0 arm64
Subsystem
buffer
What steps will reproduce the bug?
Buffer#indexOf() can hang when its receiver is an unaligned view. The child process timeout prevents the reproduction from hanging indefinitely.
'use strict';
const { spawnSync } = require('node:child_process');
for (const prefixLength of [0, 1]) {
const source = `
const data = Buffer.from('abc', 'utf16le');
const backing = Buffer.alloc(data.length + ${prefixLength});
data.copy(backing, ${prefixLength});
const view = backing.subarray(${prefixLength});
console.log(view.indexOf('a', 0, 'utf16le'));
`;
const result = spawnSync(process.execPath, ['-e', source], {
encoding: 'utf8',
timeout: 2000,
});
console.log({
prefixLength,
status: result.status,
error: result.error?.code,
stdout: result.stdout.trim(),
});
}
How often does it reproduce? Is there a required condition?
It's consistent when the receiver view starts at an odd byte offset. The aligned control returns normally.
What is the expected behavior? Why is that the expected behavior?
Both searches should terminate and return 0.
The views contain the same bytes, and the UTF-16LE value begins at index 0 of each view. The result should not depend on the underlying memory address.
What do you see instead?
The aligned view returns 0. The view starting at byte offset 1 does not complete before the timeout:
{ prefixLength: 0, status: 0, error: undefined, stdout: '0' }
{ prefixLength: 1, status: null, error: 'ETIMEDOUT', stdout: '' }
Additional information
Buffer#indexOf() passes the receiver data to the 16-bit search, while nbytes aligns matched addresses down. For an odd-offset view, this can move before the start of the view and appears to cause the hang.
This is distinct from #26448, which concerns search-offset rounding, and remains reproducible after #65905, which affects UTF-16LE decoding rather than Buffer#indexOf().
Copying the view or using a Buffer needle avoids the hang. Both workarounds return 0 locally:
Buffer.from(view).indexOf('a', 0, 'utf16le');
view.indexOf(Buffer.from('a', 'utf16le'));
- Lenguaje dominante
- JavaScript
- Estrellas
- 122k
- Forks
- 37.4k
- Merge medio
- 4 d 4 h
- PR fusionados (30 d)
- 276
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
-
ai-observability bug team/ai-observability
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
AllTheMods/ATM-10-L#19 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
SignalK/n2k-signalk#345 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
JuliaPluto/PlutoPlotly.jl#72 ·