discover/grub2: Improve error handling
authorJeremy Kerr <jk@ozlabs.org>
Tue, 17 Sep 2013 01:34:34 +0000 (09:34 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 24 Sep 2013 05:14:59 +0000 (13:14 +0800)
Only run the script if the parse succeeded, and and improve the
error reporting by enabling verbose errors and line numbers.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/grub2/lexer.l
discover/grub2/parser.y

index 3e1f9fa148c62174acb30258328c578c231f954e..6c0a456e6503137f2be5c466e2b57d396fc3d33e 100644 (file)
@@ -12,6 +12,7 @@
 %option stack noyy_top_state
 %option reentrant
 %option bison-bridge
 %option stack noyy_top_state
 %option reentrant
 %option bison-bridge
+%option yylineno
 %option noyyalloc noyyfree noyyrealloc
 %option extra-type="struct grub2_parser *"
 %option header-file="lexer.h"
 %option noyyalloc noyyfree noyyrealloc
 %option extra-type="struct grub2_parser *"
 %option header-file="lexer.h"
index e13cd72a8f72e6358e7dfa7ab7387000b384efc4..550c3748df70c0ec1a3636a3f2fc0e242e19e9ef 100644 (file)
@@ -2,6 +2,7 @@
 %pure-parser
 %lex-param { yyscan_t scanner }
 %parse-param { struct grub2_parser *parser }
 %pure-parser
 %lex-param { yyscan_t scanner }
 %parse-param { struct grub2_parser *parser }
+%error-verbose
 
 %{
 #include <talloc/talloc.h>
 
 %{
 #include <talloc/talloc.h>
@@ -244,13 +245,15 @@ struct grub2_parser *grub2_parser_create(struct discover_context *ctx)
 void grub2_parser_parse(struct grub2_parser *parser, char *buf, int len)
 {
        YY_BUFFER_STATE bufstate;
 void grub2_parser_parse(struct grub2_parser *parser, char *buf, int len)
 {
        YY_BUFFER_STATE bufstate;
+       int rc;
 
        bufstate = yy_scan_bytes(buf, len - 1, parser->scanner);
 
 
        bufstate = yy_scan_bytes(buf, len - 1, parser->scanner);
 
-       yyparse(parser);
+       rc = yyparse(parser);
 
        yy_delete_buffer(bufstate, parser->scanner);
 
 
        yy_delete_buffer(bufstate, parser->scanner);
 
-       script_execute(parser->script);
+       if (!rc)
+               script_execute(parser->script);
 }
 
 }