From 5550b907041cb7a16e449b5bfeb371668be34d00 Mon Sep 17 00:00:00 2001 From: deepak-negi-web Date: Wed, 21 Aug 2024 05:34:31 +0000 Subject: [PATCH] fix: infinite loop due to hidden row in XLSX.stream.to_json (#3178) **Title:** Fix for Incorrect Row Indexing and Infinite Loop in stream.to_json Function **Description:** This pull request addresses two key issues in the `stream.to_json` function of the SheetJS library: 1. **Infinite Loop**: Previously, when a row was hidden, the function skipped processing the current row without incrementing the row counter `R`, resulting in an infinite loop during execution. 2. **Incorrect Row Indexing**: The row index was incorrectly accessed using a one-based index, whereas the actual row index was zero-based. This led to unintended hidden rows being included in the stream and skipping of subsequent non-hidden rows. **Changes:** - Modified the hidden row check to use the correct zero-based indexing - Incremented `R` after identifying a hidden row to ensure the loop progresses to the next row. - Ensured that the stream correctly processes all rows, skipping hidden rows without affecting subsequent rows. **Testing:** - Validated that the `stream.to_json` function no longer enters an infinite loop when encountering hidden rows. - Confirmed that the correct rows are processed and pushed to the stream, with hidden rows being appropriately skipped. **Impact:** This fix enhances the reliability of the SheetJS library, ensuring accurate data streaming from spreadsheets without infinite loops or incorrect row handling. **Checklist:** - [x] Code changes have been tested locally. - [x] The changes adhere to the project's coding standards and guidelines. **Additional Information:** These changes are crucial for maintaining the library's functionality in production environments, where precise data handling is essential. **References:** Closes #3176. --- Reviewed-on: https://git.sheetjs.com/sheetjs/sheetjs/pulls/3178 Co-authored-by: deepak-negi-web Co-committed-by: deepak-negi-web --- bits/97_node.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bits/97_node.js b/bits/97_node.js index d6ae3c9..303e54a 100644 --- a/bits/97_node.js +++ b/bits/97_node.js @@ -103,7 +103,10 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { R = r.s.r + offset; stream._read = function() { while(R <= r.e.r) { - if ((rowinfo[R-1]||{}).hidden) continue; + if ((rowinfo[R]||{}).hidden) { + ++R; + continue; + }; var row = make_json_row(sheet, r, R, cols, header, hdr, o); ++R; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {