SQLCipherStatement.close() never closes its Cursor, leaking a CursorWindow per Room query
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 72/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Domínio
- databases, mobile-dev
Direção de pesquisa
O erro está em SQLCipherStatement, onde close() define closed = true sem fechar o campo cursor que step() cria, enquanto reset() já o fecha e anula o campo. Comece lendo lado a lado os métodos reset() e close() e confirme que o cursor nunca é liberado no caminho de close(). Está pronto quando close() fecha e anula o cursor quando ele está aberto, antes de definir closed, e um teste ou uma verificação do heap mostra que a memória nativa é liberada após muitas leituras pontuais sem GC manual.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
SQLCipherStatement.close() sets closed = true and never closes the Cursor that step() created. Only reset() closes it:
public void reset() {
if (cursor != null) {
cursor.close();
cursor = null;
}
stepped = false;
}
public void close() {
closed = true;
}
Room 3 (androidx.room3 3.0.3) prepares, steps and closes a statement per query, and it never calls reset() before close(). So every query leaves a CursorWindow for the finalizer to free.
Versions: sqlcipher-android 4.18.0 through 4.19.1 and the current default branch, with Room 3.0.3 and SQLCipherDriver.
Measured: we ran 20,000 point reads of one 20 KB row through Room with SQLCipherDriver, on Android emulators, with no manual GC.
| API 36 | API 29 | |
|---|---|---|
SQLCipherDriver as shipped |
+72 MB native heap | +244 MB native heap |
close() calling reset() first |
under 4 MB (0 KB after GC) | under 4 MB |
The framework's AndroidSQLiteDriver showed 24 KB over the same reads.
Workaround: we wrap the driver so that each statement's close() calls reset() first:
private class CursorClosingStatement(private val delegate: SQLiteStatement) : SQLiteStatement by delegate {
override fun close() {
delegate.reset()
delegate.close()
}
}
Suggested fix: in close(), close the cursor if it is open, as reset() does, before setting closed = true.
- Linguagem predominante
- Java
- Estrelas
- 277
- Forks
- 39
- Merge médio
- 1d 11h
- PRs com merge (30d)
- 1
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de sqlcipher/sqlcipher-android
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 32/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 32/100
sqlcipher/sqlcipher-android#95 · 4 comentários ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
sqlcipher/sqlcipher-android#23 · 2 comentários ·
Todas as issues de sqlcipher/sqlcipher-android
Issues semelhantes
-
bug IIIF interoperability
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Netcracker/qubership-integration-platform#1046 ·
Mantenedores costumam responder em até 2 dias
-
`check_java_version()` fails when Java path contains spaces (Windows / Git Bash, `C:\Program Files`)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
-
Fix Math.ceilDiv wrong result for exact positive divisionsTalvez já em andamento @pamod-madubashana assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
scala-native/scala-native#5094 ·
Mantenedores costumam responder em até 1 dia