Skip to content

Commit f4fb5ad

Browse files
committed
[red] bound corrupt local recovery metadata before hydration
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 3ba65a4 commit f4fb5ad

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

‎app/test/data/draft_repository_test.dart‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,55 @@ void main() {
403403
expect((await repository.load()).snapshot!.content, 'safe');
404404
});
405405

406+
test(
407+
'oversized otherwise-valid metadata is refused before hydration',
408+
() async {
409+
await repository.write(snapshot('safe'), expectedGeneration: 0);
410+
await repository.close();
411+
final sqlite.Database db = sqlite.sqlite3.open(file.path);
412+
final Map<String, dynamic> metadata =
413+
jsonDecode(
414+
db
415+
.select(
416+
"SELECT value FROM settings WHERE key = 'current_text_draft'",
417+
)
418+
.single['value']
419+
as String,
420+
)
421+
as Map<String, dynamic>;
422+
metadata['unexpected_padding'] = 'é' * 4096;
423+
db.execute(
424+
"UPDATE settings SET value = ? WHERE key = 'current_text_draft'",
425+
<Object>[jsonEncode(metadata)],
426+
);
427+
db.close();
428+
final List<int> before = await file.readAsBytes();
429+
await expectLater(
430+
DriftDraftRepository.open(file),
431+
failure(DraftStorageFailure.corrupt),
432+
);
433+
expect(await file.readAsBytes(), before);
434+
},
435+
);
436+
437+
test(
438+
'extra internal project rows are refused without losing storage',
439+
() async {
440+
await repository.close();
441+
final sqlite.Database db = sqlite.sqlite3.open(file.path);
442+
db.execute(
443+
"INSERT INTO projects (id, name, created_at, updated_at) VALUES ('extra', 'extra', 0, 0)",
444+
);
445+
db.close();
446+
final List<int> before = await file.readAsBytes();
447+
await expectLater(
448+
DriftDraftRepository.open(file),
449+
failure(DraftStorageFailure.corrupt),
450+
);
451+
expect(await file.readAsBytes(), before);
452+
},
453+
);
454+
406455
test(
407456
'process kill before, during and after commit yields only whole checkpoints',
408457
() async {

0 commit comments

Comments
 (0)