Project

General

Profile

Bug #4085

failure parsing RUN statement filenames with embedded unmatched quotes

Added by Greg Shah about 5 years ago. Updated about 5 years ago.

Status:
New
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
Due date:
% Done:

0%

billable:
No
vendor_id:
GCD
case_num:
version_reported:
version_resolved:

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.

Also available in: Atom PDF