From 850097d6dca6eec41e74f8823949f626735d00fe Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Wed, 8 Jun 2022 14:52:01 -0700 Subject: [PATCH] [flang][runtime] Don't loop in runtime if blank appears in BOZ input The code for scanning BOZ input allows for blanks and tabs to appear, but can hang if they do and the BOZ input value is not followed by extra valid digits; the repositioning for the second sweep simply needed to be done in units of character, not valid digits. Differential Revision: https://reviews.llvm.org/D127431 --- flang/runtime/edit-input.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp index cfcb98b68144..57a935fd5765 100644 --- a/flang/runtime/edit-input.cpp +++ b/flang/runtime/edit-input.cpp @@ -21,14 +21,16 @@ static bool EditBOZInput( IoStatementState &io, const DataEdit &edit, void *n, std::size_t bytes) { std::optional remaining; std::optional next{io.PrepareInput(edit, remaining)}; - if (*next == '0') { + if (next.value_or('?') == '0') { do { next = io.NextInField(remaining, edit); } while (next && *next == '0'); } // Count significant digits after any leading white space & zeroes int digits{0}; + int chars{0}; for (; next; next = io.NextInField(remaining, edit)) { + ++chars; char32_t ch{*next}; if (ch == ' ' || ch == '\t') { continue; @@ -52,7 +54,7 @@ static bool EditBOZInput( return false; } // Reset to start of significant digits - io.HandleRelativePosition(-digits); + io.HandleRelativePosition(-chars); remaining.reset(); // Make a second pass now that the digit count is known std::memset(n, 0, bytes); -- 2.34.1