Bug #4085
failure parsing RUN statement filenames with embedded unmatched quotes
0%
History
#1 Updated by Greg Shah about 5 years ago
Internal and external procedures can have unmatched quotes in their names and the RUN statement will honor that without any escapes.
testcases/uast/quotes_embedded_in_proc_names.p
:
procedure 'test.p"': message "test". end. run test.p". run badfilename.p". run test.p". pause 0.
testcases/uast/badfilename.p"
:
message "external test".
In the 4GL, this will print:
test external test test
In FWD an unmatched quote can seem to parse depending on the code that follows, but the preprocessor will open a string and consume to the next matching quote and for any normal 4GL code this will usually cause the rest of the program to mis-parse. In the worst case scenario, the preprocessor itself fails because an unmatched quote consumes to the end of the file without finding the closing quote:
./quotes_embedded_in_proc_names.p Exception: quotes_embedded_in_proc_names.p:8:9: unexpected char: 0xFFFF ClearStream state: clearCount = 0; inComment = no; inString = yes; keepTildes = no Scanning: ". pause 0. Scanning: LA(1)='' LA(2)='' quotes_embedded_in_proc_names.p:8:9: unexpected char: 0xFFFF at com.goldencode.p2j.preproc.TextLexer.nextToken(TextLexer.java:240) at antlr.TokenBuffer.fill(TokenBuffer.java:69) at antlr.TokenBuffer.LA(TokenBuffer.java:80) at antlr.LLkParser.LA(LLkParser.java:52) at com.goldencode.p2j.preproc.TextParser.textBlock(TextParser.java:199) at com.goldencode.p2j.preproc.TextParser.text(TextParser.java:161) at com.goldencode.p2j.preproc.Preprocessor.<init>(Preprocessor.java:783) at com.goldencode.p2j.uast.AstGenerator.preprocess(AstGenerator.java:1258) at com.goldencode.p2j.uast.AstGenerator.prepareDataStream(AstGenerator.java:1034) at com.goldencode.p2j.uast.AstGenerator.prepareLexer(AstGenerator.java:1569) at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1494) at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:966) at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248) at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:349) at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:220) at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:845) at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:983) scope 1 --- #0:0./quotes_embedded_in_proc_names.p{}{} WINDOW-SYSTEM=(4,"null") PROCESS-ARCHITECTURE=(4,"null") OPSYS=(4,"null") LINE-NUMBER=(4,"null") SEQUENCE=(4,"null") BATCH-MODE=(4,"null") FILE-NAME=(4,"null") FWD-VERSION=(1,"FWD v3.3.0_p2j_4069a_11310") ================================= ./quotes_embedded_in_proc_names.p:6:1: unexpected token: run at com.goldencode.p2j.uast.ProgressParser.stmt_list(ProgressParser.java:25813) at com.goldencode.p2j.uast.ProgressParser.statement(ProgressParser.java:8197) at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:6847) at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:6540) at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6467) at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1500) at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:966) at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248) at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:349) at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:220) at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:845) at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:983) ./quotes_embedded_in_proc_names.p:6:5: unexpected token: . at com.goldencode.p2j.uast.ProgressParser.lvalue(ProgressParser.java:15789) at com.goldencode.p2j.uast.ProgressParser.primary_expr(ProgressParser.java:56717) at com.goldencode.p2j.uast.ProgressParser.chained_object_members(ProgressParser.java:21050) at com.goldencode.p2j.uast.ProgressParser.un_type(ProgressParser.java:56347) at com.goldencode.p2j.uast.ProgressParser.prod_expr(ProgressParser.java:56214) at com.goldencode.p2j.uast.ProgressParser.sum_expr(ProgressParser.java:40299) at com.goldencode.p2j.uast.ProgressParser.compare_expr(ProgressParser.java:55800) at com.goldencode.p2j.uast.ProgressParser.log_not_expr(ProgressParser.java:55659) at com.goldencode.p2j.uast.ProgressParser.log_and_expr(ProgressParser.java:55596) at com.goldencode.p2j.uast.ProgressParser.expr(ProgressParser.java:10602) at com.goldencode.p2j.uast.ProgressParser.assignment(ProgressParser.java:8116) at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:6851) at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:6540) at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6467) at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1500) at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:966) at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248) at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:349) at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:220) at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:845) at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:983) ./quotes_embedded_in_proc_names.p:6:6: unexpected token: null at com.goldencode.p2j.uast.ProgressParser.assignment(ProgressParser.java:8141) at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:6851) at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:6540) at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6467) at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1500) at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:966) at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248) at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:349) at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:220) at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:845) at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:983) Failure in file './quotes_embedded_in_proc_names.p': com.goldencode.ast.AstException: Error processing ./quotes_embedded_in_proc_names.p at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:971) at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410) at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248) at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:349) at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:220) at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:845) at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:983) Caused by: java.lang.RuntimeException: Parser encountered 3 errors at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1548) at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:966) ... 7 more
The thing that makes it tricky is that this behavior is only in effect for RUN statements (or maybe for all unquoted filenames, we need to check). The preprocessor has no knowledge of RUN statements.