8000 Return an error rather than panic on the broken compressed data of a VBA project by dominion525 · Pull Request #146 · dominion525/jetdb · GitHub
[go: up one dir, main page]

Skip to content

Return an error rather than panic on the broken compressed data of a VBA project - #146

Merged
dominion525 merged 1 commit into
mainfrom
fix/vba-panic
Oct 26, 2026
Merged

dominion525 merged 1 commit into
mainfrom
fix/vba-panic

Conversation

@dominion525
Copy link
Copy Markdown
Owner

Summary

  • Reading the VBA project of a broken file panicked inside ovba 0.7.1 (the latest version) instead of returning an error: on a CopyToken that points before the start of its chunk, on a chunk past the end of its data, and on a module whose text offset is past the end of its stream. In jetdb-wasm a panic aborts, so the Database could not be used after it.
  • jetdb now decompresses the compressed containers of MS-OVBA itself, checking every length and offset. The dir stream is decompressed before ovba reads it, and the source of each module is read by jetdb rather than by ovba, then decoded with decode_code_page. Broken data gives FileError::InvalidVbaProject.
  • Of 300 copies of testdata/jetdb-sample.accdb with 200 bytes rewritten from a fixed seed, 23 panicked in jetdb vba before and none after; they now end with errors such as invalid VBA project: compressed data copies from before the start of its chunk.
  • The DDL in the four dialects and the 196 VBA modules of the 120 databases of the test data are the same before and after, character for character.
  • Tests: decompression of the examples of the specification, of an overlapping copy, of an uncompressed chunk, eight kinds of broken data and a chunk longer than 4096 bytes; the source of a module from its text offset and past the end of its stream; a broken dir stream.

🤖 Generated with Claude Code

…VBA project

- Decompress the compressed containers of MS-OVBA in jetdb, checking every length and offset, since ovba 0.7.1 panics on a CopyToken that points before the start of its chunk and on a chunk past the end of its data
- Decompress the dir stream before ovba reads it, and return an error when it is broken
- Read the source of each module in jetdb rather than with ovba, returning an error when its text offset is past the end of its stream, and decode it with decode_code_page

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

Coverage

For 0a0beb8.

Filename                       Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
jetdb-cli/src/export.rs            113                11    90.27%           6                 0   100.00%          65                 6    90.77%           0                 0         -
jetdb-cli/src/form.rs              239                19    92.05%          24                 5    79.17%         151                 6    96.03%           0                 0         -
jetdb-cli/src/macro_cmd.rs         117                10    91.45%           7                 2    71.43%          62                 4    93.55%           0                 0         -
jetdb-cli/src/main.rs              910                39    95.71%          82                 4    95.12%         578                28    95.16%           0                 0         -
jetdb-cli/src/prop.rs              322                18    94.41%          37                 2    94.59%         185                 7    96.22%           0                 0         -
jetdb-cli/src/query.rs              65                 3    95.38%           5                 0   100.00%          32                 0   100.00%           0                 0         -
jetdb-cli/src/vba.rs                59                 3    94.92%           5                 0   100.00%          28                 0   100.00%           0                 0         -
jetdb-wasm/src/lib.rs             3901                96    97.54%         257                 4    98.44%        2058                22    98.93%           0                 0         -
jetdb/src/catalog.rs               509                14    97.25%          46                 0   100.00%         299                 3    99.00%           0                 0         -
jetdb/src/complex.rs               924                32    96.54%          73                 0   100.00%         605                15    97.52%           0                 0         -
jetdb/src/crypto.rs               2300               112    95.13%         127                10    92.13%        1315                60    95.44%           0                 0         -
jetdb/src/csv.rs                   857                24    97.20%          72                 0   100.00%         486                 6    98.77%           0                 0         -
jetdb/src/data.rs                 4662                91    98.05%         293                 3    98.98%        2647                51    98.07%           0                 0         -
jetdb/src/ddl/access.rs             70                 0   100.00%           7                 0   100.00%          46                 0   100.00%           0                 0         -
jetdb/src/ddl/mod.rs              2771                 8    99.71%         208                 2    99.04%        1501                 6    99.60%           0                 0         -
jetdb/src/ddl/mysql.rs              70                 0   100.00%           7                 0   100.00%          46                 0   100.00%           0                 0         -
jetdb/src/ddl/postgres.rs           71                 0   100.00%           7                 0   100.00%          46                 0   100.00%           0                 0         -
jetdb/src/ddl/sqlite.rs             69                 0   100.00%           7                 0   100.00%          48                 0   100.00%           0                 0         -
jetdb/src/encoding.rs              284                 0   100.00%          30                 0   100.00%         153                 0   100.00%           0                 0         -
jetdb/src/file.rs                 1915                65    96.61%         117                 0   100.00%         983                18    98.17%           0                 0         -
jetdb/src/form.rs                 3123               128    95.90%         230                10    95.65%        1684                48    97.15%           0                 0         -
jetdb/src/form2000.rs              762                21    97.24%          56                 1    98.21%         402                 4    99.00%           0                 0         -
jetdb/src/format.rs                616                 2    99.68%          45                 0   100.00%         388                 2    99.48%           0                 0         -
jetdb/src/lib.rs                     3                 0   100.00%           1                 0   100.00%           3                 0   100.00%           0                 0         -
jetdb/src/macro_action.rs          299                19    93.65%          27                 3    88.89%         165                24    85.45%           0                 0         -
jetdb/src/macro_def.rs            2440                88    96.39%         196                 9    95.41%        1596                36    97.74%           0                 0         -
jetdb/src/macro_text.rs            804                24    97.01%          54                 2    96.30%         451                20    95.57%           0                 0         -
jetdb/src/map.rs                   416                13    96.88%          27                 0   100.00%         221                 5    97.74%           0                 0         -
jetdb/src/money.rs                 281                 0   100.00%          26                 0   100.00%         186                 0   100.00%           0                 0         -
jetdb/src/prop.rs                 1375                18    98.69%          90                 0   100.00%         695                10    98.56%           0                 0         -
jetdb/src/query.rs                2514                62    97.53%         200                 1    99.50%        1550                18    98.84%           0                 0         -
jetdb/src/relationship.rs          249                26    89.56%          22                 0   100.00%         177                10    94.35%           0                 0         -
jetdb/src/save_as_text.rs          574                27    95.30%          52                 3    94.23%         341                27    92.08%           0                 0         -
jetdb/src/storage.rs               764                32    95.81%          57                 0   100.00%         434                 6    98.62%           0                 0         -
jetdb/src/table.rs                1679                67    96.01%         109                 2    98.17%        1017                18    98.23%           0                 0         -
jetdb/src/timestamp.rs             405                 0   100.00%          44                 0   100.00%         235                 0   100.00%           0                 0         -
jetdb/src/vba.rs                   949                57    93.99%          82                11    86.59%         540                21    96.11%           0                 0         -
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                            37481              1129    96.99%        2735                74    97.29%       21419               481    97.75%           0                 0         -

@dominion525
dominion525 merged commit 479e299 into main Oct 26, 2026
11 checks passed
@dominion525
dominion525 deleted the fix/vba-panic branch October 26, 2026 13:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0