Ongeldige geometry-frontmatter kan de documentlayout laten vastlopen of crashen #1681

Closed
opened 2026-08-21 12:02:15 +00:00 by brenno · 1 comment
Owner

Probleem

geometry en opgeslagen PageMargins accepteren negatieve, niet-eindige en buitensporige getallen zonder semantische validatie. Marges die samen breder/hoger zijn dan het papier leveren een negatieve contentbreedte/-hoogte op; die waarden bereiken Flutter-layoutconstraints en pagineringsberekeningen.

Reproductie

  1. Open een document met geometry waarin left en right samen groter zijn dan de papierbreedte, of met NaN/negatieve waarden.
  2. Open de pagina-/visuele weergave.
  3. Observeer layoutasserties, clipping of onbruikbare paginering.

Verwacht

Alle geometriewaarden zijn eindig en niet-negatief; de overblijvende tekstmaat heeft een veilige minimumwaarde. Ongeldige frontmatter valt terug op defaults met een begrijpelijke melding.

Technische aanwijzing

lib/services/document_page_setup.dart:_parseGeometry en PageMargins.fromId gebruiken double.tryParse zonder bereikcontrole. paged_document_view.dart berekent de resulterende dimensies rechtstreeks.

Gevonden bij audit van commit d439638c6b.

## Probleem geometry en opgeslagen PageMargins accepteren negatieve, niet-eindige en buitensporige getallen zonder semantische validatie. Marges die samen breder/hoger zijn dan het papier leveren een negatieve contentbreedte/-hoogte op; die waarden bereiken Flutter-layoutconstraints en pagineringsberekeningen. ## Reproductie 1. Open een document met geometry waarin left en right samen groter zijn dan de papierbreedte, of met NaN/negatieve waarden. 2. Open de pagina-/visuele weergave. 3. Observeer layoutasserties, clipping of onbruikbare paginering. ## Verwacht Alle geometriewaarden zijn eindig en niet-negatief; de overblijvende tekstmaat heeft een veilige minimumwaarde. Ongeldige frontmatter valt terug op defaults met een begrijpelijke melding. ## Technische aanwijzing lib/services/document_page_setup.dart:_parseGeometry en PageMargins.fromId gebruiken double.tryParse zonder bereikcontrole. paged_document_view.dart berekent de resulterende dimensies rechtstreeks. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted — en het label security erbij

Bevestigd tegen main (e93ef205c).

  • _parseGeometry (lib/services/document_page_setup.dart) gebruikt double.tryParse zonder bereikcontrole. Dart parseert óók NaN, Infinity en -Infinity, en negatieve getallen komen er gewoon doorheen.
  • PageMargins.fromId (lib/models/page_size.dart) doet hetzelfde voor de opgeslagen waarde.
  • PagedDocumentView rekent er rechtstreeks mee: _contentWidthPx en _contentHeightPx worden negatief of NaN en gaan zo naar Positioned(width:) en SizedBox.

documentPageOffsets vangt alleen pageHeight <= 0 af; NaN <= 0 is onwaar, dus die poort laat NaN door.

Waarom security. Deze frontmatter komt uit een bestand dat van iemand anders kan komen, en het gevolg is een vastlopende of crashende app bij het openen. Dat is dezelfde klasse als de invoerharding van #1643/#1696, en hoort dus vóór de gewone bugs in de volgorde. Geen datalek, wel beschikbaarheid op onvertrouwde invoer.

Oplossingsrichting

Valideren aan de grens, niet bij het tekenen:

  1. In _parseGeometry en PageMargins.fromId: weiger niet-eindige waarden (isFinite) en negatieve waarden, en weiger een margeset die minder dan een minimum tekstvlak overlaat (voorstel: 20 mm breed én hoog). Val terug op de standaardwaarden.
  2. Zeg het tegen de gebruiker. Het document beweert iets onmogelijks; stil iets anders tekenen laat hem zoeken naar waarom de druk niet klopt. Eén melding bij het openen volstaat — geen dialoog.
  3. Als tweede lijn een klem in _contentWidthPx/_contentHeightPx. Die waarden komen namelijk óók uit de instellingen en uit de pagina-opmaakdialoog, en die wegen lopen niet langs de parser.

Regressietest (verplicht)

  • test/document_page_setup_test.dart: geometry met NaN, Infinity, negatief, en left+right > paperwidth → standaardmarges, en de melding komt.
  • Widgettest in de trant van de overflow-stresspoort: paginaweergave met zulke frontmatter rendert zonder uitzondering (takeException() null) en levert minstens één leesbaar vel.

Kosten

Twee bestanden plus een klem, één nieuwe l10n.d('…') ⇒ 31 vertalingen. Halve dag.

Prioriteit

Hoog: sorteert op security bovenaan deze reeks.

## Triage: accepted — en het label `security` erbij **Bevestigd tegen `main` (e93ef205c).** - `_parseGeometry` (`lib/services/document_page_setup.dart`) gebruikt `double.tryParse` zonder bereikcontrole. Dart parseert óók `NaN`, `Infinity` en `-Infinity`, en negatieve getallen komen er gewoon doorheen. - `PageMargins.fromId` (`lib/models/page_size.dart`) doet hetzelfde voor de opgeslagen waarde. - `PagedDocumentView` rekent er rechtstreeks mee: `_contentWidthPx` en `_contentHeightPx` worden negatief of `NaN` en gaan zo naar `Positioned(width:)` en `SizedBox`. `documentPageOffsets` vangt alleen `pageHeight <= 0` af; `NaN <= 0` is onwaar, dus die poort laat `NaN` door. **Waarom `security`.** Deze frontmatter komt uit een bestand dat van iemand anders kan komen, en het gevolg is een vastlopende of crashende app bij het openen. Dat is dezelfde klasse als de invoerharding van #1643/#1696, en hoort dus vóór de gewone bugs in de volgorde. Geen datalek, wel beschikbaarheid op onvertrouwde invoer. ## Oplossingsrichting Valideren aan de grens, niet bij het tekenen: 1. In `_parseGeometry` en `PageMargins.fromId`: weiger niet-eindige waarden (`isFinite`) en negatieve waarden, en weiger een margeset die minder dan een minimum tekstvlak overlaat (voorstel: 20 mm breed én hoog). Val terug op de standaardwaarden. 2. Zeg het tegen de gebruiker. Het document beweert iets onmogelijks; stil iets anders tekenen laat hem zoeken naar waarom de druk niet klopt. Eén melding bij het openen volstaat — geen dialoog. 3. Als tweede lijn een klem in `_contentWidthPx`/`_contentHeightPx`. Die waarden komen namelijk óók uit de instellingen en uit de pagina-opmaakdialoog, en die wegen lopen niet langs de parser. ## Regressietest (verplicht) - `test/document_page_setup_test.dart`: `geometry` met `NaN`, `Infinity`, negatief, en `left+right > paperwidth` → standaardmarges, en de melding komt. - Widgettest in de trant van de overflow-stresspoort: paginaweergave met zulke frontmatter rendert zonder uitzondering (`takeException()` null) en levert minstens één leesbaar vel. ## Kosten Twee bestanden plus een klem, één nieuwe `l10n.d('…')` ⇒ 31 vertalingen. Halve dag. ## Prioriteit Hoog: sorteert op `security` bovenaan deze reeks.
brenno 2026-08-21 23:48:45 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1681
No description provided.