From 98a107d734ac87bb0bbdc63383273508d3d6d3ba Mon Sep 17 00:00:00 2001 From: Dave Schmenk <dschmenk@gmail.com> Date: Fri, 3 Nov 2017 17:08:54 -0700 Subject: [PATCH] Fix parseing to check for extraneous/buggy syntax --- src/inc/testlib.plh | 2 +- src/libsrc/dhcp.pla | 2 +- src/libsrc/etherip.pla | 2 +- src/libsrc/sdfat.pla | 2 +- src/toolsrc/lex.c | 12 +++++++++++- src/toolsrc/parse.c | 38 ++++++++++++++++++++++---------------- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/inc/testlib.plh b/src/inc/testlib.plh index 11f5abd..f8a06ef 100644 --- a/src/inc/testlib.plh +++ b/src/inc/testlib.plh @@ -1,6 +1,6 @@ import testlib predef puti(i)#0 - word print(s)#0 + word print const dec = 0 const hex = 2 const newln = 4 diff --git a/src/libsrc/dhcp.pla b/src/libsrc/dhcp.pla index 9b5f560..3ce3d89 100644 --- a/src/libsrc/dhcp.pla +++ b/src/libsrc/dhcp.pla @@ -186,7 +186,7 @@ def recvDHCP(remip, remport, pkt, len, param) //putip(remip);putc(':');puti(remport);putln //dumpdhcp(pkt) - if pkt=>dhcp_xid:0 == $0201 and pkt=>dhcp_xid:2 = $0403 + if pkt=>dhcp_xid:0 == $0201 and pkt=>dhcp_xid:2 == $0403 when pkt->dhcp_opts.[parseopts(@pkt->dhcp_opts, 53) + 2] is DHCP_OFFER // diff --git a/src/libsrc/etherip.pla b/src/libsrc/etherip.pla index 988b169..48f8698 100644 --- a/src/libsrc/etherip.pla +++ b/src/libsrc/etherip.pla @@ -526,7 +526,7 @@ def etherServiceIP if port lclport = swab(rxptr=>udp_dst) for i = 1 to MAX_UDP_NOTIFIES - if port=>notify_port == lclport) + if port=>notify_port == lclport port=>notify_func(@iphdr=>ip_src,swab(rxptr=>udp_src),rxptr+t_udphdr,swab(rxptr=>udp_len),port=>notify_parm) break fin diff --git a/src/libsrc/sdfat.pla b/src/libsrc/sdfat.pla index e365524..2f6fd7d 100644 --- a/src/libsrc/sdfat.pla +++ b/src/libsrc/sdfat.pla @@ -59,7 +59,7 @@ def openDir(cmd, filename) namelen = 0 spiSend(cmd) namelen = spiRecv - if namelen == 0xFF + if namelen == $FF namelen = 0 fin if namelen diff --git a/src/toolsrc/lex.c b/src/toolsrc/lex.c index 06d87e4..0c7fe3f 100755 --- a/src/toolsrc/lex.c +++ b/src/toolsrc/lex.c @@ -6,7 +6,7 @@ #include "plasm.h" char *statement, *tokenstr, *scanpos = "", *strpos = ""; -t_token scantoken, prevtoken; +t_token scantoken = EOL_TOKEN, prevtoken; int tokenlen; long constval; FILE* inputfile; @@ -440,6 +440,12 @@ int next_line(void) } else { + if (!(scantoken == EOL_TOKEN || scantoken == EOF_TOKEN)) + { + fprintf(stderr, "scantoken = %d (%c)\n", scantoken & 0x7F, scantoken & 0x7F); + parse_error("Extraneous characters"); + return EOF_TOKEN; + } statement = inputline; scanpos = inputline; /* @@ -492,6 +498,10 @@ int next_line(void) scantoken = EOF_TOKEN; return EOF_TOKEN; } + if (scan() != EOL_TOKEN) + { + parse_error("Extraneous characters"); + } outer_inputfile = inputfile; outer_filename = filename; outer_lineno = lineno; diff --git a/src/toolsrc/parse.c b/src/toolsrc/parse.c index b9ac3ca..94b1402 100755 --- a/src/toolsrc/parse.c +++ b/src/toolsrc/parse.c @@ -820,7 +820,7 @@ int parse_stmnt(void) tag_endif = tag_new(BRANCH_TYPE); seq = gen_brfls(seq, tag_else); emit_seq(seq); - scan(); + //scan(); do { while (parse_stmnt()) next_line(); @@ -1075,7 +1075,7 @@ int parse_stmnt(void) } break; case EOL_TOKEN: - case COMMENT_TOKEN: + //case COMMENT_TOKEN: return (1); case ELSE_TOKEN: case ELSEIF_TOKEN: @@ -1131,7 +1131,7 @@ int parse_stmnt(void) } } } - if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN) + if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/) { parse_error("Extraneous characters"); return (0); @@ -1224,6 +1224,7 @@ int parse_struc(void) struclen = tokenlen; for (idlen = 0; idlen < struclen; idlen++) strucid[idlen] = tokenstr[idlen]; + scan(); } while (next_line() == BYTE_TOKEN || scantoken == WORD_TOKEN || scantoken == EOL_TOKEN) { @@ -1266,12 +1267,16 @@ int parse_struc(void) idconst_add(idstr, idlen, offset); offset += size; } while (scantoken == COMMA_TOKEN); - if (scantoken != EOL_TOKEN && scantoken != COMMENT_TOKEN) + if (scantoken != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/) return (0); } if (struclen) idconst_add(strucid, struclen, offset); - return (scantoken == END_TOKEN); + //return (scantoken == END_TOKEN); + if (scantoken != END_TOKEN) + return (0); + scan(); + return (1); } int parse_vars(int type) { @@ -1444,7 +1449,7 @@ int parse_vars(int type) return (0); } case EOL_TOKEN: - case COMMENT_TOKEN: + //case COMMENT_TOKEN: return (1); default: return (0); @@ -1468,13 +1473,13 @@ int parse_mods(void) parse_error("Syntax error"); return (0); } - if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN) + if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/) { parse_error("Extraneous characters"); return (0); } } - if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN) + if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/) return (1); emit_moddep(0, 0); return (0); @@ -1651,7 +1656,7 @@ int parse_defs(void) parse_error("Syntax error"); return (0); } - if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN) + if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/) { parse_error("Extraneous characters"); return (0); @@ -1740,18 +1745,19 @@ int parse_defs(void) idstr[idlen] = c; do { - if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN) - next_line(); - else if (scantoken != END_TOKEN) + ///if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/) + //next_line(); + if (scantoken != END_TOKEN && scantoken != EOL_TOKEN) { + scantoken = EOL_TOKEN; emit_asm(inputline); - next_line(); } - } - while (scantoken != END_TOKEN); + next_line(); + } while (scantoken != END_TOKEN); + scan(); return (1); } - if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN) + if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/) return (1); return (0); }