Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

localStorage: a malformed backing file aborts the process via CHECK

Fechada
#65,878 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
68/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
javascript, node.js, sqlite
Domínio
backend, databases

Direção de pesquisa

Leia src/node_webstorage.cc próximo às linhas 187 e 354 e, em seguida, execute craft.cjs seguido do comando node --localstorage-file para reproduzir o abort. Está concluído quando dados malformados do arquivo de backing produzem um erro lançado em vez de SIGABRT, e a falha de prepare descrita próximo à linha 187 é relatada em vez de ser substituída por um erro posterior.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

sqlite
Version

v27.0.0-pre (9f7ae86d8b5)

Platform
Darwin 25.6.0 arm64
Subsystem

webstorage, sqlite

What steps will reproduce the bug?

src/node_webstorage.cc asserts the SQLite type of every column it reads, but the backing file is a user-specified path. Node's own tables are STRICT, but the DDL is CREATE TABLE IF NOT EXISTS, so a file that already contains tables of those names is adopted as-is, STRICT or not.

// craft.cjs
const { DatabaseSync } = require('node:sqlite');
const out = '/tmp/ws.db';
for (const s of ['', '-wal', '-shm']) require('node:fs').rmSync(out + s, { force: true });

// Node's schema, minus STRICT. BLOB has no affinity, so a TEXT value stays TEXT.
const db = new DatabaseSync(out);
db.exec(`
  CREATE TABLE nodejs_webstorage(
    key BLOB NOT NULL, value BLOB NOT NULL, PRIMARY KEY(key));
  CREATE TABLE nodejs_webstorage_state(
    max_size INTEGER NOT NULL DEFAULT 10485760, total_size INTEGER NOT NULL,
    schema_version INTEGER NOT NULL DEFAULT 1,
    single_row_ INTEGER NOT NULL DEFAULT 1 CHECK(single_row_ = 1),
    PRIMARY KEY(single_row_));
`);
// A real UTF-16LE key, so that lookups still match; only the value is TEXT.
db.prepare('INSERT INTO nodejs_webstorage (key, value) VALUES (?, ?)')
  .run(Buffer.from('greeting', 'utf16le'), 'hello');
db.prepare('INSERT INTO nodejs_webstorage_state (total_size, schema_version)' +
  ' VALUES (0, 1)').run();
db.close();
$ node craft.cjs
$ node --localstorage-file=/tmp/ws.db -e "localStorage.getItem('greeting')"
How often does it reproduce? Is there a required condition?

The only condition is that the file exists with the wrong stored type.

What is the expected behavior? Why is that the expected behavior?

A thrown error.

What do you see instead?

SIGABRT, exit 134:

#  node[96447]: MaybeLocal<Value> node::webstorage::Storage::Load(Local<Name>)
#     at ../src/node_webstorage.cc:354
#  Assertion failed: sqlite3_column_type(stmt.get(), 0) == 4
Additional information

Separately, line 187 re-runs init_sql_v0 and overwrites the result of the sqlite3_prepare_v2() five lines above it, so prepare failures go unreported. Given a nodejs_webstorage_state table with no schema_version column, the real error is replaced by Error: bad parameter or other API misuse.

Linguagem predominante
JavaScript
Estrelas
122k
Forks
38.4k
Merge médio
4d 10h
PRs com merge (30d)
276

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de nodejs/node

Todas as issues de nodejs/node

Issues semelhantes

Mais issues de JavaScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.