[Forensics-changes] [yara] 01/02: Add patches for CVE-2016-10210, CVE-2016-10211, CVE-2017-5923, CVE-2017-5924 (Closes: #859821)
Hilko Bengen
bengen at moszumanska.debian.org
Sun Apr 9 11:49:43 UTC 2017
This is an automated email from the git hooks/post-receive script.
bengen pushed a commit to branch master
in repository yara.
commit 870666e1cc23a064599ed47fe142f047671762a3
Author: Hilko Bengen <bengen at debian.org>
Date: Sun Apr 9 13:00:55 2017 +0200
Add patches for CVE-2016-10210, CVE-2016-10211, CVE-2017-5923, CVE-2017-5924 (Closes: #859821)
---
debian/patches/0004-Fix-issue-576.patch | 272 +++++
debian/patches/0005-Fix-issue-575.patch | 1241 ++++++++++++++++++++
...hat-loop-depth-is-greater-than-0-before-d.patch | 28 +
debian/patches/0007-Fix-issue-597.patch | 1001 ++++++++++++++++
debian/patches/series | 4 +
5 files changed, 2546 insertions(+)
diff --git a/debian/patches/0004-Fix-issue-576.patch b/debian/patches/0004-Fix-issue-576.patch
new file mode 100644
index 0000000..497a52a
--- /dev/null
+++ b/debian/patches/0004-Fix-issue-576.patch
@@ -0,0 +1,272 @@
+From: plusvic <plusvic at gmail.com>
+Date: Wed, 4 Jan 2017 16:18:03 +0100
+Subject: Fix issue #576
+
+(cherry picked from upstream commit
+eb491e03851a11bc811173f5e13c89cefa7257ac, fixing CVE-2016-10210)
+---
+ libyara/lexer.c | 67 +++++++++++++++++++++++++++++++--------------------------
+ libyara/lexer.l | 7 ++++++
+ 2 files changed, 44 insertions(+), 30 deletions(-)
+
+diff --git a/libyara/lexer.c b/libyara/lexer.c
+index 6669c5c..d350038 100644
+--- a/libyara/lexer.c
++++ b/libyara/lexer.c
+@@ -178,7 +178,7 @@ typedef size_t yy_size_t;
+
+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+ * access to the local variable yy_act. Since yyless() is a macro, it would break
+- * existing scanners that call yyless() from OUTSIDE yara_yylex.
++ * existing scanners that call yyless() from OUTSIDE yara_yylex.
+ * One obvious solution it to make yy_act a global. I tried that, and saw
+ * a 5% performance hit in a non-yylineno scanner, because yy_act is
+ * normally declared as a register variable-- so it is not worth it.
+@@ -254,7 +254,7 @@ struct yy_buffer_state
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+-
++
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+@@ -1118,10 +1118,10 @@ yy_find_action:
+
+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+ {
+- yy_size_t yyl;
++ int yyl;
+ for ( yyl = 0; yyl < yyleng; ++yyl )
+ if ( yytext[yyl] == '\n' )
+-
++
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+@@ -1814,6 +1814,13 @@ YY_RULE_SETUP
+ {
+
+ LEX_CHECK_SPACE_OK("\\.", yyextra->lex_buf_len, LEX_BUF_SIZE);
++
++ if (yytext[1] == 0)
++ {
++ yyerror(yyscanner, compiler, "malformed regular expression");
++ yyterminate();
++ }
++
+ *yyextra->lex_buf_ptr++ = yytext[0];
+ *yyextra->lex_buf_ptr++ = yytext[1];
+ yyextra->lex_buf_len += 2;
+@@ -1821,13 +1828,13 @@ YY_RULE_SETUP
+ YY_BREAK
+ case 66:
+ YY_RULE_SETUP
+-#line 590 "lexer.l"
++#line 597 "lexer.l"
+ { YYTEXT_TO_BUFFER; }
+ YY_BREAK
+ case 67:
+ /* rule 67 can match eol */
+ YY_RULE_SETUP
+-#line 593 "lexer.l"
++#line 600 "lexer.l"
+ {
+
+ yyerror(yyscanner, compiler, "unterminated regular expression");
+@@ -1836,7 +1843,7 @@ YY_RULE_SETUP
+ YY_BREAK
+ case 68:
+ YY_RULE_SETUP
+-#line 600 "lexer.l"
++#line 607 "lexer.l"
+ {
+
+ yyextra->lex_buf_ptr = yyextra->lex_buf;
+@@ -1846,7 +1853,7 @@ YY_RULE_SETUP
+ YY_BREAK
+ case 69:
+ YY_RULE_SETUP
+-#line 608 "lexer.l"
++#line 615 "lexer.l"
+ {
+
+ yyextra->lex_buf_ptr = yyextra->lex_buf;
+@@ -1857,7 +1864,7 @@ YY_RULE_SETUP
+ case 70:
+ /* rule 70 can match eol */
+ YY_RULE_SETUP
+-#line 616 "lexer.l"
++#line 623 "lexer.l"
+ {
+ // Match hex-digits with whitespace or comments. The latter are stripped
+ // out by hex_lexer.l
+@@ -1873,12 +1880,12 @@ YY_RULE_SETUP
+ case 71:
+ /* rule 71 can match eol */
+ YY_RULE_SETUP
+-#line 629 "lexer.l"
++#line 636 "lexer.l"
+ /* skip whitespace */
+ YY_BREAK
+ case 72:
+ YY_RULE_SETUP
+-#line 631 "lexer.l"
++#line 638 "lexer.l"
+ {
+
+ if (yytext[0] >= 32 && yytext[0] < 127)
+@@ -1894,10 +1901,10 @@ YY_RULE_SETUP
+ YY_BREAK
+ case 73:
+ YY_RULE_SETUP
+-#line 644 "lexer.l"
++#line 651 "lexer.l"
+ ECHO;
+ YY_BREAK
+-#line 1901 "lexer.c"
++#line 1908 "lexer.c"
+
+ case YY_END_OF_BUFFER:
+ {
+@@ -2042,7 +2049,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+- yy_size_t number_to_move, i;
++ int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+@@ -2071,7 +2078,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+- number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
++ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+@@ -2153,7 +2160,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+- if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
++ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yara_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
+@@ -2306,7 +2313,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+ if ( c == '\n' )
+-
++
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+@@ -2561,9 +2568,9 @@ static void yara_yyensure_buffer_stack (yyscan_t yyscanner)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yara_yyensure_buffer_stack()" );
+-
++
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+-
++
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+@@ -2592,7 +2599,7 @@ static void yara_yyensure_buffer_stack (yyscan_t yyscanner)
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+- * @return the newly allocated buffer state object.
++ * @return the newly allocated buffer state object.
+ */
+ YY_BUFFER_STATE yara_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+ {
+@@ -2649,10 +2656,10 @@ YY_BUFFER_STATE yara_yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ,
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+- yy_size_t i;
++ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+- n = (yy_size_t) _yybytes_len + 2;
++ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yara_yyalloc(n ,yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yara_yy_scan_bytes()" );
+@@ -2720,7 +2727,7 @@ YY_EXTRA_TYPE yara_yyget_extra (yyscan_t yyscanner)
+ int yara_yyget_lineno (yyscan_t yyscanner)
+ {
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+-
++
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+@@ -2733,7 +2740,7 @@ int yara_yyget_lineno (yyscan_t yyscanner)
+ int yara_yyget_column (yyscan_t yyscanner)
+ {
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+-
++
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+@@ -2908,20 +2915,20 @@ int yara_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals
+ errno = EINVAL;
+ return 1;
+ }
+-
++
+ *ptr_yy_globals = (yyscan_t) yara_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+-
++
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+-
++
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+-
++
+ yara_yyset_extra (yy_user_defined, *ptr_yy_globals);
+-
++
+ return yy_init_globals ( *ptr_yy_globals );
+ }
+
+@@ -3046,7 +3053,7 @@ void yara_yyfree (void * ptr , yyscan_t yyscanner)
+
+ #define YYTABLES_NAME "yytables"
+
+-#line 644 "lexer.l"
++#line 651 "lexer.l"
+
+
+
+diff --git a/libyara/lexer.l b/libyara/lexer.l
+index 640304a..0f32a0e 100644
+--- a/libyara/lexer.l
++++ b/libyara/lexer.l
+@@ -581,6 +581,13 @@ u?int(8|16|32)(be)? {
+ <regexp>\\. {
+
+ LEX_CHECK_SPACE_OK("\\.", yyextra->lex_buf_len, LEX_BUF_SIZE);
++
++ if (yytext[1] == 0)
++ {
++ yyerror(yyscanner, compiler, "malformed regular expression");
++ yyterminate();
++ }
++
+ *yyextra->lex_buf_ptr++ = yytext[0];
+ *yyextra->lex_buf_ptr++ = yytext[1];
+ yyextra->lex_buf_len += 2;
diff --git a/debian/patches/0005-Fix-issue-575.patch b/debian/patches/0005-Fix-issue-575.patch
new file mode 100644
index 0000000..2b73bc3
--- /dev/null
+++ b/debian/patches/0005-Fix-issue-575.patch
@@ -0,0 +1,1241 @@
+From: plusvic <plusvic at gmail.com>
+Date: Wed, 4 Jan 2017 17:09:35 +0100
+Subject: Fix issue #575
+
+(cherry picked from upstream commit
+890c3f850293176c0e996a602ffa88b315f4e98f, fixing CVE-2016-10211)
+---
+ libyara/grammar.c | 645 +++++++++++++++++++++++++++---------------------------
+ libyara/grammar.y | 5 +
+ 2 files changed, 332 insertions(+), 318 deletions(-)
+
+diff --git a/libyara/grammar.c b/libyara/grammar.c
+index 0ce27b2..eb28701 100644
+--- a/libyara/grammar.c
++++ b/libyara/grammar.c
+@@ -546,16 +546,16 @@ union yyalloc
+ /* YYFINAL -- State number of the termination state. */
+ #define YYFINAL 2
+ /* YYLAST -- Last index in YYTABLE. */
+-#define YYLAST 408
++#define YYLAST 406
+
+ /* YYNTOKENS -- Number of terminals. */
+ #define YYNTOKENS 72
+ /* YYNNTS -- Number of nonterminals. */
+ #define YYNNTS 41
+ /* YYNRULES -- Number of rules. */
+-#define YYNRULES 121
++#define YYNRULES 122
+ /* YYNSTATES -- Number of states. */
+-#define YYNSTATES 209
++#define YYNSTATES 210
+
+ /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+ by yylex, with out-of-bounds checking. */
+@@ -612,13 +612,13 @@ static const yytype_uint16 yyrline[] =
+ 472, 485, 502, 503, 509, 508, 524, 523, 539, 553,
+ 554, 559, 560, 561, 562, 567, 652, 698, 756, 801,
+ 802, 806, 831, 867, 913, 935, 944, 953, 968, 980,
+- 994, 1007, 1019, 1049, 1018, 1163, 1162, 1241, 1247, 1254,
+- 1253, 1316, 1315, 1376, 1385, 1394, 1403, 1412, 1421, 1430,
+- 1434, 1442, 1443, 1448, 1470, 1482, 1498, 1497, 1503, 1514,
+- 1515, 1520, 1527, 1538, 1539, 1543, 1551, 1555, 1565, 1579,
+- 1595, 1605, 1614, 1639, 1651, 1663, 1679, 1691, 1707, 1752,
+- 1771, 1789, 1807, 1825, 1851, 1869, 1879, 1889, 1899, 1909,
+- 1919, 1929
++ 994, 1007, 1018, 1024, 1054, 1023, 1168, 1167, 1246, 1252,
++ 1259, 1258, 1321, 1320, 1381, 1390, 1399, 1408, 1417, 1426,
++ 1435, 1439, 1447, 1448, 1453, 1475, 1487, 1503, 1502, 1508,
++ 1519, 1520, 1525, 1532, 1543, 1544, 1548, 1556, 1560, 1570,
++ 1584, 1600, 1610, 1619, 1644, 1656, 1668, 1684, 1696, 1712,
++ 1757, 1776, 1794, 1812, 1830, 1856, 1874, 1884, 1894, 1904,
++ 1914, 1924, 1934
+ };
+ #endif
+
+@@ -672,7 +672,7 @@ static const yytype_uint16 yytoknum[] =
+ #define yypact_value_is_default(Yystate) \
+ (!!((Yystate) == (-73)))
+
+-#define YYTABLE_NINF -94
++#define YYTABLE_NINF -95
+
+ #define yytable_value_is_error(Yytable_value) \
+ 0
+@@ -681,27 +681,27 @@ static const yytype_uint16 yytoknum[] =
+ STATE-NUM. */
+ static const yytype_int16 yypact[] =
+ {
+- -73, 79, -73, -32, -4, -73, -73, 94, -73, -73,
+- -73, -73, 13, -73, -73, -73, -73, -8, 72, 6,
+- -73, 78, 111, -73, 61, 122, 123, 82, -73, 90,
+- 123, -73, 147, 150, 16, -73, 96, 147, -73, 101,
+- 97, -73, -73, -73, -73, 151, 53, -73, 48, -73,
+- -73, -73, 149, 145, -73, -9, -73, 103, 107, -73,
+- -73, 106, -73, -73, -73, -73, -73, -73, 110, -73,
+- -73, 135, 48, 135, 48, -33, -73, 64, -73, 144,
+- 306, -73, -73, 135, 108, 135, 135, 135, 135, -7,
+- 322, -73, -73, -73, 64, 117, 163, 168, 135, 48,
+- -73, -73, -6, 167, 135, 135, 135, 135, 135, 135,
+- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+- 135, 86, 86, 322, 135, -73, 243, 261, 183, 203,
+- 159, -6, -73, -73, -73, 279, 121, 125, 95, 48,
+- 48, -73, -73, -73, -73, 322, 337, 351, -43, 322,
+- 322, 322, 322, 322, 322, 40, 40, 58, 58, -73,
+- -73, -73, -73, -73, -73, -73, -73, 129, -73, -73,
+- -73, -73, 128, -73, -73, 48, 152, -73, 15, 135,
+- 131, -73, 95, -73, -73, 71, -73, 223, 135, 133,
+- -73, 132, -73, 15, -73, 73, 129, -73, 48, -73,
+- -73, 135, 134, 31, 322, 48, -73, 49, -73
++ -73, 90, -73, -32, -10, -73, -73, 93, -73, -73,
++ -73, -73, 1, -73, -73, -73, -73, -49, 7, -36,
++ -73, 20, 26, -73, -28, 92, 46, 4, -73, 40,
++ 46, -73, 100, 119, 16, -73, 72, 100, -73, 77,
++ 83, -73, -73, -73, -73, 134, 59, -73, 48, -73,
++ -73, -73, 133, 136, -73, -18, -73, 88, 95, -73,
++ -73, 91, -73, -73, -73, -73, -73, -73, 102, -73,
++ -73, 126, 48, 126, 48, -44, -73, 85, -73, 127,
++ 297, -73, -73, 126, 110, 126, 126, 126, 126, 2,
++ 313, -73, -73, -73, 85, 111, 154, 172, 126, 48,
++ -73, -73, -6, 162, 126, 126, 126, 126, 126, 126,
++ 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
++ 126, 60, 60, 313, 126, -73, 234, 252, 174, 194,
++ -73, 153, -6, -73, -73, -73, 270, 117, 120, 108,
++ 48, 48, -73, -73, -73, -73, 313, 328, 342, 349,
++ 313, 313, 313, 313, 313, 313, 113, 113, 53, 53,
++ -73, -73, -73, -73, -73, -73, -73, -73, 121, -73,
++ -73, -73, -73, 124, -73, -73, 48, 151, -73, -1,
++ 126, 125, -73, 108, -73, -73, 18, -73, 214, 126,
++ 129, -73, 143, -73, -1, -73, 63, 121, -73, 48,
++ -73, -73, 126, 144, 31, 313, 48, -73, 33, -73
+ };
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+@@ -714,31 +714,31 @@ static const yytype_uint8 yydefact[] =
+ 23, 22, 12, 24, 0, 14, 0, 0, 10, 0,
+ 13, 25, 0, 0, 0, 26, 0, 15, 32, 0,
+ 0, 28, 27, 30, 31, 0, 34, 33, 0, 11,
+- 29, 38, 0, 0, 45, 59, 103, 105, 107, 100,
+- 101, 0, 102, 53, 97, 98, 94, 95, 0, 55,
+- 56, 0, 0, 0, 0, 108, 121, 16, 54, 0,
+- 79, 39, 39, 0, 0, 0, 0, 0, 0, 0,
+- 93, 109, 68, 118, 0, 54, 79, 0, 0, 49,
+- 71, 69, 0, 0, 0, 0, 0, 0, 0, 0,
++ 29, 38, 0, 0, 45, 59, 104, 106, 108, 101,
++ 102, 0, 103, 53, 98, 99, 95, 96, 0, 55,
++ 56, 0, 0, 0, 0, 109, 122, 16, 54, 0,
++ 80, 39, 39, 0, 0, 0, 0, 0, 0, 0,
++ 94, 110, 69, 119, 0, 54, 80, 0, 0, 49,
++ 72, 70, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35, 37, 60, 0, 61, 0, 0, 0, 0,
+- 0, 0, 80, 96, 46, 0, 0, 50, 51, 0,
+- 0, 88, 86, 67, 57, 58, 117, 115, 116, 77,
+- 78, 73, 75, 74, 76, 119, 120, 110, 111, 112,
+- 113, 114, 42, 41, 43, 44, 40, 0, 104, 106,
+- 99, 62, 0, 47, 48, 0, 72, 70, 0, 0,
+- 0, 65, 52, 91, 92, 0, 89, 0, 0, 0,
+- 82, 0, 87, 0, 83, 0, 84, 63, 0, 90,
+- 81, 0, 0, 0, 85, 0, 66, 0, 64
++ 62, 0, 0, 81, 97, 46, 0, 0, 50, 51,
++ 0, 0, 89, 87, 68, 57, 58, 118, 116, 117,
++ 78, 79, 74, 76, 75, 77, 120, 121, 111, 112,
++ 113, 114, 115, 42, 41, 43, 44, 40, 0, 105,
++ 107, 100, 63, 0, 47, 48, 0, 73, 71, 0,
++ 0, 0, 66, 52, 92, 93, 0, 90, 0, 0,
++ 0, 83, 0, 88, 0, 84, 0, 85, 64, 0,
++ 91, 82, 0, 0, 0, 86, 0, 67, 0, 65
+ };
+
+ /* YYPGOTO[NTERM-NUM]. */
+ static const yytype_int16 yypgoto[] =
+ {
+- -73, -73, 199, 218, -73, -73, -73, -73, -73, -73,
+- -73, -73, -73, -73, 192, -73, 186, -73, -73, 142,
+- -73, -73, -73, -73, 126, -48, -72, -73, -73, -73,
+- -73, -73, -73, 50, -73, 100, -73, -73, 35, 164,
++ -73, -73, 211, 212, -73, -73, -73, -73, -73, -73,
++ -73, -73, -73, -73, 189, -73, 183, -73, -73, 139,
++ -73, -73, -73, -73, 130, -48, -72, -73, -73, -73,
++ -73, -73, -73, 41, -73, 103, -73, -73, 29, 164,
+ -67
+ };
+
+@@ -747,8 +747,8 @@ static const yytype_int16 yydefgoto[] =
+ {
+ -1, 1, 5, 6, 17, 33, 25, 28, 40, 7,
+ 15, 19, 21, 30, 31, 37, 38, 52, 53, 121,
+- 166, 75, 136, 137, 76, 94, 78, 180, 202, 191,
+- 140, 139, 189, 125, 195, 143, 178, 185, 186, 79,
++ 167, 75, 137, 138, 76, 94, 78, 181, 203, 192,
++ 141, 140, 190, 125, 196, 144, 179, 186, 187, 79,
+ 80
+ };
+
+@@ -757,92 +757,92 @@ static const yytype_int16 yydefgoto[] =
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+ static const yytype_int16 yytable[] =
+ {
+- 77, 90, 95, 130, 91, 4, 93, 96, 114, 115,
+- 116, 117, 118, 119, 120, 11, 123, 83, 126, 127,
+- 128, 129, 84, 16, 92, 131, 183, 138, 141, 8,
+- 184, 135, 41, 97, 98, 42, 99, 145, 146, 147,
+- 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
+- 158, 159, 160, 161, 43, 44, 18, 167, 54, 55,
+- 56, 57, 58, 142, 59, 60, 61, 62, 22, 63,
+- 45, 100, 101, 51, -36, 64, 65, 66, 67, 2,
+- 3, 68, 20, -17, -17, -17, 69, 70, 23, 100,
+- 101, 176, 177, 116, 117, 118, 119, 120, 12, 13,
+- 14, 206, 71, 182, 100, 101, 72, 73, 162, 163,
+- 164, 165, 187, 118, 119, 120, 4, 74, 24, 208,
+- 54, 196, 56, 57, 58, 26, 59, 60, 61, 62,
+- 27, 63, 179, 29, 204, -54, -54, 64, 65, 66,
+- 67, 192, 193, 200, 201, 54, 32, 56, 57, 58,
+- 203, 59, 60, 61, 62, 34, 63, 207, 36, 39,
+- 49, 46, 64, 65, 71, 48, 82, 50, 81, 73,
+- 85, 105, 106, 107, 86, 87, 102, 124, 134, 88,
+- 114, 115, 116, 117, 118, 119, 120, 132, 63, 71,
+- 171, 174, 181, 101, 73, -93, 175, 197, 103, 104,
+- 188, 198, 9, 205, 88, 105, 106, 107, 108, 109,
+- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+- 120, 10, 35, 47, 122, 105, 106, 107, 199, 144,
+- 190, 172, 89, 133, 114, 115, 116, 117, 118, 119,
+- 120, 0, 0, 0, 0, 105, 106, 107, 0, 0,
+- 0, 0, 0, 170, 114, 115, 116, 117, 118, 119,
+- 120, 0, 0, 0, 0, 105, 106, 107, 0, 0,
+- 0, 0, 0, 133, 114, 115, 116, 117, 118, 119,
+- 120, 0, 0, 0, 0, 105, 106, 107, 0, 0,
+- 0, 0, 0, 194, 114, 115, 116, 117, 118, 119,
+- 120, 0, 0, 105, 106, 107, 0, 0, 0, 0,
+- 0, 168, 114, 115, 116, 117, 118, 119, 120, 0,
+- 0, 105, 106, 107, 0, 0, 0, 0, 0, 169,
+- 114, 115, 116, 117, 118, 119, 120, 0, -93, 0,
+- 0, 103, 104, 0, 0, 0, 0, 173, 105, 106,
+- 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
+- 117, 118, 119, 120, 105, 106, 107, 0, 0, 0,
++ 77, 90, 95, 130, 91, 4, 93, 96, 83, 11,
++ 184, 16, 131, 84, 185, 18, 123, 20, 126, 127,
++ 128, 129, 97, 98, 92, 99, 22, 139, 142, 8,
++ 23, 136, 41, 24, 132, 42, 26, 146, 147, 148,
++ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
++ 159, 160, 161, 162, 43, 44, 29, 168, 54, 55,
++ 56, 57, 58, 143, 59, 60, 61, 62, 32, 63,
++ 45, 100, 101, 100, 101, 64, 65, 66, 67, 51,
++ -36, 68, 163, 164, 165, 166, 69, 70, 193, 194,
++ 2, 3, 177, 178, -17, -17, -17, 12, 13, 14,
++ 27, 207, 71, 209, 183, 34, 72, 73, 118, 119,
++ 120, 36, 54, 188, 56, 57, 58, 74, 59, 60,
++ 61, 62, 197, 63, 180, 100, 101, 4, 39, 64,
++ 65, 66, 67, 201, 202, 205, 54, 46, 56, 57,
++ 58, 48, 59, 60, 61, 62, 49, 63, -54, -54,
++ 50, 204, 81, 64, 65, 85, 71, 82, 208, 102,
++ 87, 73, 86, 105, 106, 107, 116, 117, 118, 119,
++ 120, 88, 114, 115, 116, 117, 118, 119, 120, 124,
++ 71, 133, 135, 63, 172, 73, -94, 175, 182, 103,
++ 104, 176, 101, 198, 189, 88, 105, 106, 107, 108,
++ 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
++ 119, 120, 199, 206, 9, 10, 105, 106, 107, 35,
++ 47, 122, 191, 200, 134, 114, 115, 116, 117, 118,
++ 119, 120, 89, 145, 0, 173, 105, 106, 107, 0,
++ 0, 0, 0, 0, 171, 114, 115, 116, 117, 118,
++ 119, 120, 0, 0, 0, 0, 105, 106, 107, 0,
++ 0, 0, 0, 0, 134, 114, 115, 116, 117, 118,
++ 119, 120, 0, 0, 0, 0, 105, 106, 107, 0,
++ 0, 0, 0, 0, 195, 114, 115, 116, 117, 118,
++ 119, 120, 0, 0, 105, 106, 107, 0, 0, 0,
++ 0, 0, 169, 114, 115, 116, 117, 118, 119, 120,
++ 0, 0, 105, 106, 107, 0, 0, 0, 0, 0,
++ 170, 114, 115, 116, 117, 118, 119, 120, 0, -94,
++ 0, 0, 103, 104, 0, 0, 0, 0, 174, 105,
++ 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
++ 116, 117, 118, 119, 120, 105, 106, 107, 0, 0,
++ 0, 0, 0, 0, 114, 115, 116, 117, 118, 119,
++ 120, 106, 107, 0, 0, 0, 0, 0, 0, 114,
++ 115, 116, 117, 118, 119, 120, 107, 0, 0, 0,
+ 0, 0, 0, 114, 115, 116, 117, 118, 119, 120,
+- 106, 107, 0, 0, 0, 0, 0, 0, 114, 115,
+- 116, 117, 118, 119, 120, 107, 0, 0, 0, 0,
+- 0, 0, 114, 115, 116, 117, 118, 119, 120
++ 114, 115, 116, 117, 118, 119, 120
+ };
+
+ static const yytype_int16 yycheck[] =
+ {
+- 48, 68, 74, 10, 71, 37, 73, 74, 51, 52,
+- 53, 54, 55, 56, 57, 19, 83, 26, 85, 86,
+- 87, 88, 31, 10, 72, 32, 11, 99, 34, 61,
+- 15, 98, 16, 66, 67, 19, 69, 104, 105, 106,
++ 48, 68, 74, 1, 71, 37, 73, 74, 26, 19,
++ 11, 10, 10, 31, 15, 64, 83, 10, 85, 86,
++ 87, 88, 66, 67, 72, 69, 62, 99, 34, 61,
++ 10, 98, 16, 7, 32, 19, 64, 104, 105, 106,
+ 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
+- 117, 118, 119, 120, 38, 39, 64, 124, 10, 11,
+- 12, 13, 14, 69, 16, 17, 18, 19, 62, 21,
+- 54, 40, 41, 20, 21, 27, 28, 29, 30, 0,
+- 1, 33, 10, 4, 5, 6, 38, 39, 10, 40,
+- 41, 139, 140, 53, 54, 55, 56, 57, 4, 5,
+- 6, 70, 54, 175, 40, 41, 58, 59, 22, 23,
+- 24, 25, 179, 55, 56, 57, 37, 69, 7, 70,
+- 10, 188, 12, 13, 14, 64, 16, 17, 18, 19,
+- 8, 21, 3, 10, 201, 40, 41, 27, 28, 29,
+- 30, 70, 71, 70, 71, 10, 64, 12, 13, 14,
+- 198, 16, 17, 18, 19, 65, 21, 205, 11, 9,
+- 63, 65, 27, 28, 54, 64, 21, 16, 19, 59,
+- 67, 42, 43, 44, 67, 69, 32, 69, 10, 69,
+- 51, 52, 53, 54, 55, 56, 57, 70, 21, 54,
+- 31, 70, 64, 41, 59, 32, 71, 64, 35, 36,
+- 69, 69, 3, 69, 69, 42, 43, 44, 45, 46,
+- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+- 57, 3, 30, 37, 82, 42, 43, 44, 193, 103,
+- 180, 131, 68, 70, 51, 52, 53, 54, 55, 56,
+- 57, -1, -1, -1, -1, 42, 43, 44, -1, -1,
+- -1, -1, -1, 70, 51, 52, 53, 54, 55, 56,
+- 57, -1, -1, -1, -1, 42, 43, 44, -1, -1,
+- -1, -1, -1, 70, 51, 52, 53, 54, 55, 56,
+- 57, -1, -1, -1, -1, 42, 43, 44, -1, -1,
+- -1, -1, -1, 70, 51, 52, 53, 54, 55, 56,
+- 57, -1, -1, 42, 43, 44, -1, -1, -1, -1,
+- -1, 68, 51, 52, 53, 54, 55, 56, 57, -1,
+- -1, 42, 43, 44, -1, -1, -1, -1, -1, 68,
+- 51, 52, 53, 54, 55, 56, 57, -1, 32, -1,
+- -1, 35, 36, -1, -1, -1, -1, 68, 42, 43,
+- 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+- 54, 55, 56, 57, 42, 43, 44, -1, -1, -1,
++ 117, 118, 119, 120, 38, 39, 10, 124, 10, 11,
++ 12, 13, 14, 69, 16, 17, 18, 19, 64, 21,
++ 54, 40, 41, 40, 41, 27, 28, 29, 30, 20,
++ 21, 33, 22, 23, 24, 25, 38, 39, 70, 71,
++ 0, 1, 140, 141, 4, 5, 6, 4, 5, 6,
++ 8, 70, 54, 70, 176, 65, 58, 59, 55, 56,
++ 57, 11, 10, 180, 12, 13, 14, 69, 16, 17,
++ 18, 19, 189, 21, 3, 40, 41, 37, 9, 27,
++ 28, 29, 30, 70, 71, 202, 10, 65, 12, 13,
++ 14, 64, 16, 17, 18, 19, 63, 21, 40, 41,
++ 16, 199, 19, 27, 28, 67, 54, 21, 206, 32,
++ 69, 59, 67, 42, 43, 44, 53, 54, 55, 56,
++ 57, 69, 51, 52, 53, 54, 55, 56, 57, 69,
++ 54, 70, 10, 21, 31, 59, 32, 70, 64, 35,
++ 36, 71, 41, 64, 69, 69, 42, 43, 44, 45,
++ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
++ 56, 57, 69, 69, 3, 3, 42, 43, 44, 30,
++ 37, 82, 181, 194, 70, 51, 52, 53, 54, 55,
++ 56, 57, 68, 103, -1, 132, 42, 43, 44, -1,
++ -1, -1, -1, -1, 70, 51, 52, 53, 54, 55,
++ 56, 57, -1, -1, -1, -1, 42, 43, 44, -1,
++ -1, -1, -1, -1, 70, 51, 52, 53, 54, 55,
++ 56, 57, -1, -1, -1, -1, 42, 43, 44, -1,
++ -1, -1, -1, -1, 70, 51, 52, 53, 54, 55,
++ 56, 57, -1, -1, 42, 43, 44, -1, -1, -1,
++ -1, -1, 68, 51, 52, 53, 54, 55, 56, 57,
++ -1, -1, 42, 43, 44, -1, -1, -1, -1, -1,
++ 68, 51, 52, 53, 54, 55, 56, 57, -1, 32,
++ -1, -1, 35, 36, -1, -1, -1, -1, 68, 42,
++ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
++ 53, 54, 55, 56, 57, 42, 43, 44, -1, -1,
++ -1, -1, -1, -1, 51, 52, 53, 54, 55, 56,
++ 57, 43, 44, -1, -1, -1, -1, -1, -1, 51,
++ 52, 53, 54, 55, 56, 57, 44, -1, -1, -1,
+ -1, -1, -1, 51, 52, 53, 54, 55, 56, 57,
+- 43, 44, -1, -1, -1, -1, -1, -1, 51, 52,
+- 53, 54, 55, 56, 57, 44, -1, -1, -1, -1,
+- -1, -1, 51, 52, 53, 54, 55, 56, 57
++ 51, 52, 53, 54, 55, 56, 57
+ };
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+@@ -862,14 +862,14 @@ static const yytype_uint8 yystos[] =
+ 40, 41, 32, 35, 36, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 91, 91, 112, 69, 105, 112, 112, 112, 112,
+- 10, 32, 70, 70, 10, 112, 94, 95, 98, 103,
+- 102, 34, 69, 107, 96, 112, 112, 112, 112, 112,
++ 1, 10, 32, 70, 70, 10, 112, 94, 95, 98,
++ 103, 102, 34, 69, 107, 96, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+- 112, 112, 22, 23, 24, 25, 92, 112, 68, 68,
+- 70, 31, 107, 68, 70, 71, 97, 97, 108, 3,
+- 99, 64, 98, 11, 15, 109, 110, 112, 69, 104,
+- 105, 101, 70, 71, 70, 106, 112, 64, 69, 110,
+- 70, 71, 100, 97, 112, 69, 70, 97, 70
++ 112, 112, 112, 22, 23, 24, 25, 92, 112, 68,
++ 68, 70, 31, 107, 68, 70, 71, 97, 97, 108,
++ 3, 99, 64, 98, 11, 15, 109, 110, 112, 69,
++ 104, 105, 101, 70, 71, 70, 106, 112, 64, 69,
++ 110, 70, 71, 100, 97, 112, 69, 70, 97, 70
+ };
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+@@ -881,13 +881,13 @@ static const yytype_uint8 yyr1[] =
+ 86, 86, 87, 87, 89, 88, 90, 88, 88, 91,
+ 91, 92, 92, 92, 92, 93, 93, 93, 93, 94,
+ 94, 95, 95, 96, 97, 98, 98, 98, 98, 98,
+- 98, 98, 99, 100, 98, 101, 98, 98, 98, 102,
+- 98, 103, 98, 98, 98, 98, 98, 98, 98, 98,
+- 98, 104, 104, 105, 106, 106, 108, 107, 107, 109,
+- 109, 110, 110, 111, 111, 111, 112, 112, 112, 112,
++ 98, 98, 98, 99, 100, 98, 101, 98, 98, 98,
++ 102, 98, 103, 98, 98, 98, 98, 98, 98, 98,
++ 98, 98, 104, 104, 105, 106, 106, 108, 107, 107,
++ 109, 109, 110, 110, 111, 111, 111, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+- 112, 112
++ 112, 112, 112
+ };
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+@@ -899,13 +899,13 @@ static const yytype_uint8 yyr2[] =
+ 3, 3, 1, 2, 0, 5, 0, 5, 3, 0,
+ 2, 1, 1, 1, 1, 1, 3, 4, 4, 0,
+ 1, 1, 3, 1, 1, 1, 1, 3, 3, 1,
+- 3, 3, 0, 0, 11, 0, 9, 3, 2, 0,
+- 4, 0, 4, 3, 3, 3, 3, 3, 3, 1,
+- 3, 3, 1, 5, 1, 3, 0, 4, 1, 1,
+- 3, 1, 1, 1, 1, 1, 3, 1, 1, 4,
+- 1, 1, 1, 1, 4, 1, 4, 1, 1, 2,
+- 3, 3, 3, 3, 3, 3, 3, 3, 2, 3,
+- 3, 1
++ 3, 3, 3, 0, 0, 11, 0, 9, 3, 2,
++ 0, 4, 0, 4, 3, 3, 3, 3, 3, 3,
++ 1, 3, 3, 1, 5, 1, 3, 0, 4, 1,
++ 1, 3, 1, 1, 1, 1, 1, 3, 1, 1,
++ 4, 1, 1, 1, 1, 4, 1, 4, 1, 1,
++ 2, 3, 3, 3, 3, 3, 3, 3, 3, 2,
++ 3, 3, 1
+ };
+
+
+@@ -2587,6 +2587,15 @@ yyreduce:
+ case 62:
+ #line 1019 "grammar.y" /* yacc.c:1646 */
+ {
++ compiler->loop_depth--;
++ compiler->loop_identifier[compiler->loop_depth] = NULL;
++ }
++#line 2594 "grammar.c" /* yacc.c:1646 */
++ break;
++
++ case 63:
++#line 1024 "grammar.y" /* yacc.c:1646 */
++ {
+ int var_index;
+
+ if (compiler->loop_depth == MAX_LOOP_NESTING)
+@@ -2615,11 +2624,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 2619 "grammar.c" /* yacc.c:1646 */
++#line 2628 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 63:
+-#line 1049 "grammar.y" /* yacc.c:1646 */
++ case 64:
++#line 1054 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
+ uint8_t* addr;
+@@ -2654,11 +2663,11 @@ yyreduce:
+ compiler->loop_identifier[compiler->loop_depth] = (yyvsp[-4].c_string);
+ compiler->loop_depth++;
+ }
+-#line 2658 "grammar.c" /* yacc.c:1646 */
++#line 2667 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 64:
+-#line 1084 "grammar.y" /* yacc.c:1646 */
++ case 65:
++#line 1089 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset;
+
+@@ -2737,11 +2746,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2741 "grammar.c" /* yacc.c:1646 */
++#line 2750 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 65:
+-#line 1163 "grammar.y" /* yacc.c:1646 */
++ case 66:
++#line 1168 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
+ uint8_t* addr;
+@@ -2771,11 +2780,11 @@ yyreduce:
+ compiler->loop_identifier[compiler->loop_depth] = NULL;
+ compiler->loop_depth++;
+ }
+-#line 2775 "grammar.c" /* yacc.c:1646 */
++#line 2784 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 66:
+-#line 1193 "grammar.y" /* yacc.c:1646 */
++ case 67:
++#line 1198 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset;
+
+@@ -2824,31 +2833,31 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+
+ }
+-#line 2828 "grammar.c" /* yacc.c:1646 */
++#line 2837 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 67:
+-#line 1242 "grammar.y" /* yacc.c:1646 */
++ case 68:
++#line 1247 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit(yyscanner, OP_OF, NULL);
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2838 "grammar.c" /* yacc.c:1646 */
++#line 2847 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 68:
+-#line 1248 "grammar.y" /* yacc.c:1646 */
++ case 69:
++#line 1253 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit(yyscanner, OP_NOT, NULL);
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2848 "grammar.c" /* yacc.c:1646 */
++#line 2857 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 69:
+-#line 1254 "grammar.y" /* yacc.c:1646 */
++ case 70:
++#line 1259 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ void* jmp_destination_addr;
+@@ -2874,11 +2883,11 @@ yyreduce:
+ fixup->next = compiler->fixup_stack_head;
+ compiler->fixup_stack_head = fixup;
+ }
+-#line 2878 "grammar.c" /* yacc.c:1646 */
++#line 2887 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 70:
+-#line 1280 "grammar.y" /* yacc.c:1646 */
++ case 71:
++#line 1285 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ uint8_t* and_addr;
+@@ -2914,11 +2923,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2918 "grammar.c" /* yacc.c:1646 */
++#line 2927 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 71:
+-#line 1316 "grammar.y" /* yacc.c:1646 */
++ case 72:
++#line 1321 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ void* jmp_destination_addr;
+@@ -2943,11 +2952,11 @@ yyreduce:
+ fixup->next = compiler->fixup_stack_head;
+ compiler->fixup_stack_head = fixup;
+ }
+-#line 2947 "grammar.c" /* yacc.c:1646 */
++#line 2956 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 72:
+-#line 1341 "grammar.y" /* yacc.c:1646 */
++ case 73:
++#line 1346 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ uint8_t* or_addr;
+@@ -2983,11 +2992,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2987 "grammar.c" /* yacc.c:1646 */
++#line 2996 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 73:
+-#line 1377 "grammar.y" /* yacc.c:1646 */
++ case 74:
++#line 1382 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "<", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -2996,11 +3005,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3000 "grammar.c" /* yacc.c:1646 */
++#line 3009 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 74:
+-#line 1386 "grammar.y" /* yacc.c:1646 */
++ case 75:
++#line 1391 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, ">", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3009,11 +3018,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3013 "grammar.c" /* yacc.c:1646 */
++#line 3022 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 75:
+-#line 1395 "grammar.y" /* yacc.c:1646 */
++ case 76:
++#line 1400 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "<=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3022,11 +3031,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3026 "grammar.c" /* yacc.c:1646 */
++#line 3035 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 76:
+-#line 1404 "grammar.y" /* yacc.c:1646 */
++ case 77:
++#line 1409 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, ">=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3035,11 +3044,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3039 "grammar.c" /* yacc.c:1646 */
++#line 3048 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 77:
+-#line 1413 "grammar.y" /* yacc.c:1646 */
++ case 78:
++#line 1418 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "==", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3048,11 +3057,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3052 "grammar.c" /* yacc.c:1646 */
++#line 3061 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 78:
+-#line 1422 "grammar.y" /* yacc.c:1646 */
++ case 79:
++#line 1427 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "!=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3061,39 +3070,39 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3065 "grammar.c" /* yacc.c:1646 */
++#line 3074 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 79:
+-#line 1431 "grammar.y" /* yacc.c:1646 */
++ case 80:
++#line 1436 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[0].expression);
+ }
+-#line 3073 "grammar.c" /* yacc.c:1646 */
++#line 3082 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 80:
+-#line 1435 "grammar.y" /* yacc.c:1646 */
++ case 81:
++#line 1440 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[-1].expression);
+ }
+-#line 3081 "grammar.c" /* yacc.c:1646 */
++#line 3090 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 81:
+-#line 1442 "grammar.y" /* yacc.c:1646 */
++ case 82:
++#line 1447 "grammar.y" /* yacc.c:1646 */
+ { (yyval.integer) = INTEGER_SET_ENUMERATION; }
+-#line 3087 "grammar.c" /* yacc.c:1646 */
++#line 3096 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 82:
+-#line 1443 "grammar.y" /* yacc.c:1646 */
++ case 83:
++#line 1448 "grammar.y" /* yacc.c:1646 */
+ { (yyval.integer) = INTEGER_SET_RANGE; }
+-#line 3093 "grammar.c" /* yacc.c:1646 */
++#line 3102 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 83:
+-#line 1449 "grammar.y" /* yacc.c:1646 */
++ case 84:
++#line 1454 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[-3].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3111,11 +3120,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3115 "grammar.c" /* yacc.c:1646 */
++#line 3124 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 84:
+-#line 1471 "grammar.y" /* yacc.c:1646 */
++ case 85:
++#line 1476 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3127,11 +3136,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3131 "grammar.c" /* yacc.c:1646 */
++#line 3140 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 85:
+-#line 1483 "grammar.y" /* yacc.c:1646 */
++ case 86:
++#line 1488 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3142,77 +3151,77 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3146 "grammar.c" /* yacc.c:1646 */
++#line 3155 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 86:
+-#line 1498 "grammar.y" /* yacc.c:1646 */
++ case 87:
++#line 1503 "grammar.y" /* yacc.c:1646 */
+ {
+ // Push end-of-list marker
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ }
+-#line 3155 "grammar.c" /* yacc.c:1646 */
++#line 3164 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 88:
+-#line 1504 "grammar.y" /* yacc.c:1646 */
++ case 89:
++#line 1509 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ yr_parser_emit_pushes_for_strings(yyscanner, "$*");
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3166 "grammar.c" /* yacc.c:1646 */
++#line 3175 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 91:
+-#line 1521 "grammar.y" /* yacc.c:1646 */
++ case 92:
++#line 1526 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
+ yr_free((yyvsp[0].c_string));
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3177 "grammar.c" /* yacc.c:1646 */
++#line 3186 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 92:
+-#line 1528 "grammar.y" /* yacc.c:1646 */
++ case 93:
++#line 1533 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
+ yr_free((yyvsp[0].c_string));
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3188 "grammar.c" /* yacc.c:1646 */
++#line 3197 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 94:
+-#line 1540 "grammar.y" /* yacc.c:1646 */
++ case 95:
++#line 1545 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ }
+-#line 3196 "grammar.c" /* yacc.c:1646 */
++#line 3205 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 95:
+-#line 1544 "grammar.y" /* yacc.c:1646 */
++ case 96:
++#line 1549 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, 1, NULL, NULL);
+ }
+-#line 3204 "grammar.c" /* yacc.c:1646 */
++#line 3213 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 96:
+-#line 1552 "grammar.y" /* yacc.c:1646 */
++ case 97:
++#line 1557 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[-1].expression);
+ }
+-#line 3212 "grammar.c" /* yacc.c:1646 */
++#line 3221 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 97:
+-#line 1556 "grammar.y" /* yacc.c:1646 */
++ case 98:
++#line 1561 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit(
+ yyscanner, OP_FILESIZE, NULL);
+@@ -3222,11 +3231,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3226 "grammar.c" /* yacc.c:1646 */
++#line 3235 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 98:
+-#line 1566 "grammar.y" /* yacc.c:1646 */
++ case 99:
++#line 1571 "grammar.y" /* yacc.c:1646 */
+ {
+ yywarning(yyscanner,
+ "Using deprecated \"entrypoint\" keyword. Use the \"entry_point\" "
+@@ -3240,11 +3249,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3244 "grammar.c" /* yacc.c:1646 */
++#line 3253 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 99:
+-#line 1580 "grammar.y" /* yacc.c:1646 */
++ case 100:
++#line 1585 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-1].expression), EXPRESSION_TYPE_INTEGER, "intXXXX or uintXXXX");
+
+@@ -3260,11 +3269,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3264 "grammar.c" /* yacc.c:1646 */
++#line 3273 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 100:
+-#line 1596 "grammar.y" /* yacc.c:1646 */
++ case 101:
++#line 1601 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, (yyvsp[0].integer), NULL, NULL);
+@@ -3274,11 +3283,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = (yyvsp[0].integer);
+ }
+-#line 3278 "grammar.c" /* yacc.c:1646 */
++#line 3287 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 101:
+-#line 1606 "grammar.y" /* yacc.c:1646 */
++ case 102:
++#line 1611 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg_double(
+ yyscanner, OP_PUSH, (yyvsp[0].double_), NULL, NULL);
+@@ -3287,11 +3296,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+-#line 3291 "grammar.c" /* yacc.c:1646 */
++#line 3300 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 102:
+-#line 1615 "grammar.y" /* yacc.c:1646 */
++ case 103:
++#line 1620 "grammar.y" /* yacc.c:1646 */
+ {
+ SIZED_STRING* sized_string;
+
+@@ -3316,11 +3325,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_STRING;
+ (yyval.expression).value.sized_string = sized_string;
+ }
+-#line 3320 "grammar.c" /* yacc.c:1646 */
++#line 3329 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 103:
+-#line 1640 "grammar.y" /* yacc.c:1646 */
++ case 104:
++#line 1645 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[0].c_string), OP_COUNT, UNDEFINED);
+@@ -3332,11 +3341,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3336 "grammar.c" /* yacc.c:1646 */
++#line 3345 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 104:
+-#line 1652 "grammar.y" /* yacc.c:1646 */
++ case 105:
++#line 1657 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[-3].c_string), OP_OFFSET, UNDEFINED);
+@@ -3348,11 +3357,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3352 "grammar.c" /* yacc.c:1646 */
++#line 3361 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 105:
+-#line 1664 "grammar.y" /* yacc.c:1646 */
++ case 106:
++#line 1669 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 1, NULL, NULL);
+@@ -3368,11 +3377,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3372 "grammar.c" /* yacc.c:1646 */
++#line 3381 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 106:
+-#line 1680 "grammar.y" /* yacc.c:1646 */
++ case 107:
++#line 1685 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[-3].c_string), OP_LENGTH, UNDEFINED);
+@@ -3384,11 +3393,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3388 "grammar.c" /* yacc.c:1646 */
++#line 3397 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 107:
+-#line 1692 "grammar.y" /* yacc.c:1646 */
++ case 108:
++#line 1697 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 1, NULL, NULL);
+@@ -3404,11 +3413,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3408 "grammar.c" /* yacc.c:1646 */
++#line 3417 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 108:
+-#line 1708 "grammar.y" /* yacc.c:1646 */
++ case 109:
++#line 1713 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type == EXPRESSION_TYPE_INTEGER) // loop identifier
+ {
+@@ -3453,11 +3462,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3457 "grammar.c" /* yacc.c:1646 */
++#line 3466 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 109:
+-#line 1753 "grammar.y" /* yacc.c:1646 */
++ case 110:
++#line 1758 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER | EXPRESSION_TYPE_FLOAT, "-");
+
+@@ -3476,11 +3485,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3480 "grammar.c" /* yacc.c:1646 */
++#line 3489 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 110:
+-#line 1772 "grammar.y" /* yacc.c:1646 */
++ case 111:
++#line 1777 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "+", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3498,11 +3507,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3502 "grammar.c" /* yacc.c:1646 */
++#line 3511 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 111:
+-#line 1790 "grammar.y" /* yacc.c:1646 */
++ case 112:
++#line 1795 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "-", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3520,11 +3529,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3524 "grammar.c" /* yacc.c:1646 */
++#line 3533 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 112:
+-#line 1808 "grammar.y" /* yacc.c:1646 */
++ case 113:
++#line 1813 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "*", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3542,11 +3551,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3546 "grammar.c" /* yacc.c:1646 */
++#line 3555 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 113:
+-#line 1826 "grammar.y" /* yacc.c:1646 */
++ case 114:
++#line 1831 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "\\", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3572,11 +3581,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3576 "grammar.c" /* yacc.c:1646 */
++#line 3585 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 114:
+-#line 1852 "grammar.y" /* yacc.c:1646 */
++ case 115:
++#line 1857 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "%");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "%");
+@@ -3594,11 +3603,11 @@ yyreduce:
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+ }
+-#line 3598 "grammar.c" /* yacc.c:1646 */
++#line 3607 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 115:
+-#line 1870 "grammar.y" /* yacc.c:1646 */
++ case 116:
++#line 1875 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
+@@ -3608,11 +3617,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(^, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3612 "grammar.c" /* yacc.c:1646 */
++#line 3621 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 116:
+-#line 1880 "grammar.y" /* yacc.c:1646 */
++ case 117:
++#line 1885 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
+@@ -3622,11 +3631,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(&, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3626 "grammar.c" /* yacc.c:1646 */
++#line 3635 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 117:
+-#line 1890 "grammar.y" /* yacc.c:1646 */
++ case 118:
++#line 1895 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "|");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "|");
+@@ -3636,11 +3645,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(|, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3640 "grammar.c" /* yacc.c:1646 */
++#line 3649 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 118:
+-#line 1900 "grammar.y" /* yacc.c:1646 */
++ case 119:
++#line 1905 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "~");
+
+@@ -3650,11 +3659,11 @@ yyreduce:
+ (yyval.expression).value.integer = ((yyvsp[0].expression).value.integer == UNDEFINED) ?
+ UNDEFINED : ~((yyvsp[0].expression).value.integer);
+ }
+-#line 3654 "grammar.c" /* yacc.c:1646 */
++#line 3663 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 119:
+-#line 1910 "grammar.y" /* yacc.c:1646 */
++ case 120:
++#line 1915 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "<<");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "<<");
+@@ -3664,11 +3673,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(<<, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3668 "grammar.c" /* yacc.c:1646 */
++#line 3677 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 120:
+-#line 1920 "grammar.y" /* yacc.c:1646 */
++ case 121:
++#line 1925 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, ">>");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, ">>");
+@@ -3678,19 +3687,19 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(>>, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3682 "grammar.c" /* yacc.c:1646 */
++#line 3691 "grammar.c" /* yacc.c:1646 */
+ break;
+
+- case 121:
+-#line 1930 "grammar.y" /* yacc.c:1646 */
++ case 122:
++#line 1935 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[0].expression);
+ }
+-#line 3690 "grammar.c" /* yacc.c:1646 */
++#line 3699 "grammar.c" /* yacc.c:1646 */
+ break;
+
+
+-#line 3694 "grammar.c" /* yacc.c:1646 */
++#line 3703 "grammar.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+@@ -3918,5 +3927,5 @@ yyreturn:
+ #endif
+ return yyresult;
+ }
+-#line 1935 "grammar.y" /* yacc.c:1906 */
++#line 1940 "grammar.y" /* yacc.c:1906 */
+
+diff --git a/libyara/grammar.y b/libyara/grammar.y
+index 56bae40..be24307 100644
+--- a/libyara/grammar.y
++++ b/libyara/grammar.y
+@@ -1015,6 +1015,11 @@ expression
+
+ $$.type = EXPRESSION_TYPE_BOOLEAN;
+ }
++ | _FOR_ for_expression error
++ {
++ compiler->loop_depth--;
++ compiler->loop_identifier[compiler->loop_depth] = NULL;
++ }
+ | _FOR_ for_expression _IDENTIFIER_ _IN_
+ {
+ int var_index;
diff --git a/debian/patches/0006-Make-sure-that-loop-depth-is-greater-than-0-before-d.patch b/debian/patches/0006-Make-sure-that-loop-depth-is-greater-than-0-before-d.patch
new file mode 100644
index 0000000..a232f2e
--- /dev/null
+++ b/debian/patches/0006-Make-sure-that-loop-depth-is-greater-than-0-before-d.patch
@@ -0,0 +1,28 @@
+From: plusvic <plusvic at gmail.com>
+Date: Mon, 9 Jan 2017 13:17:39 +0100
+Subject: Make sure that loop depth is greater than 0 before decrementing it.
+
+(cherry picked from upstream commit
+7f02eca670f29c00a1d2c305e96febae6ce5d37b, fixing CVE-2017-5924)
+---
+ libyara/grammar.y | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/libyara/grammar.y b/libyara/grammar.y
+index be24307..addb55d 100644
+--- a/libyara/grammar.y
++++ b/libyara/grammar.y
+@@ -1017,8 +1017,11 @@ expression
+ }
+ | _FOR_ for_expression error
+ {
+- compiler->loop_depth--;
+- compiler->loop_identifier[compiler->loop_depth] = NULL;
++ if (compiler->loop_depth > 0)
++ {
++ compiler->loop_depth--;
++ compiler->loop_identifier[compiler->loop_depth] = NULL;
++ }
+ }
+ | _FOR_ for_expression _IDENTIFIER_ _IN_
+ {
diff --git a/debian/patches/0007-Fix-issue-597.patch b/debian/patches/0007-Fix-issue-597.patch
new file mode 100644
index 0000000..cc18b93
--- /dev/null
+++ b/debian/patches/0007-Fix-issue-597.patch
@@ -0,0 +1,1001 @@
+From: plusvic <plusvic at gmail.com>
+Date: Mon, 23 Jan 2017 18:08:51 +0100
+Subject: Fix issue #597
+
+(cherry picked from upstream commit
+ab906da53ff2a68c6fd6d1fa73f2b7c7bf0bc636, fixing CVE-2017-5923)
+---
+ libyara/grammar.c | 303 ++++++++++++++++++++++++++++--------------------------
+ libyara/grammar.y | 6 ++
+ 2 files changed, 162 insertions(+), 147 deletions(-)
+
+diff --git a/libyara/grammar.c b/libyara/grammar.c
+index eb28701..6d4ba05 100644
+--- a/libyara/grammar.c
++++ b/libyara/grammar.c
+@@ -611,14 +611,14 @@ static const yytype_uint16 yyrline[] =
+ 347, 353, 356, 374, 387, 424, 425, 430, 446, 459,
+ 472, 485, 502, 503, 509, 508, 524, 523, 539, 553,
+ 554, 559, 560, 561, 562, 567, 652, 698, 756, 801,
+- 802, 806, 831, 867, 913, 935, 944, 953, 968, 980,
+- 994, 1007, 1018, 1024, 1054, 1023, 1168, 1167, 1246, 1252,
+- 1259, 1258, 1321, 1320, 1381, 1390, 1399, 1408, 1417, 1426,
+- 1435, 1439, 1447, 1448, 1453, 1475, 1487, 1503, 1502, 1508,
+- 1519, 1520, 1525, 1532, 1543, 1544, 1548, 1556, 1560, 1570,
+- 1584, 1600, 1610, 1619, 1644, 1656, 1668, 1684, 1696, 1712,
+- 1757, 1776, 1794, 1812, 1830, 1856, 1874, 1884, 1894, 1904,
+- 1914, 1924, 1934
++ 802, 806, 833, 871, 917, 939, 948, 957, 972, 984,
++ 998, 1011, 1022, 1033, 1063, 1032, 1177, 1176, 1255, 1261,
++ 1268, 1267, 1330, 1329, 1390, 1399, 1408, 1417, 1426, 1435,
++ 1444, 1448, 1456, 1457, 1462, 1484, 1496, 1512, 1511, 1517,
++ 1528, 1529, 1534, 1541, 1552, 1553, 1557, 1565, 1569, 1579,
++ 1593, 1609, 1619, 1628, 1653, 1665, 1677, 1693, 1705, 1721,
++ 1766, 1785, 1803, 1821, 1839, 1865, 1883, 1893, 1903, 1913,
++ 1923, 1933, 1943
+ };
+ #endif
+
+@@ -2361,15 +2361,17 @@ yyreduce:
+ case EXPRESSION_TYPE_REGEXP:
+ strlcpy((yyval.c_string), "r", MAX_FUNCTION_ARGS);
+ break;
++ default:
++ assert(FALSE);
+ }
+
+ ERROR_IF((yyval.c_string) == NULL);
+ }
+-#line 2369 "grammar.c" /* yacc.c:1646 */
++#line 2371 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 52:
+-#line 832 "grammar.y" /* yacc.c:1646 */
++#line 834 "grammar.y" /* yacc.c:1646 */
+ {
+ if (strlen((yyvsp[-2].c_string)) == MAX_FUNCTION_ARGS)
+ {
+@@ -2394,6 +2396,8 @@ yyreduce:
+ case EXPRESSION_TYPE_REGEXP:
+ strlcat((yyvsp[-2].c_string), "r", MAX_FUNCTION_ARGS);
+ break;
++ default:
++ assert(FALSE);
+ }
+ }
+
+@@ -2401,11 +2405,11 @@ yyreduce:
+
+ (yyval.c_string) = (yyvsp[-2].c_string);
+ }
+-#line 2405 "grammar.c" /* yacc.c:1646 */
++#line 2409 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 53:
+-#line 868 "grammar.y" /* yacc.c:1646 */
++#line 872 "grammar.y" /* yacc.c:1646 */
+ {
+ SIZED_STRING* sized_string = (yyvsp[0].sized_string);
+ RE* re;
+@@ -2447,11 +2451,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_REGEXP;
+ }
+-#line 2451 "grammar.c" /* yacc.c:1646 */
++#line 2455 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 54:
+-#line 914 "grammar.y" /* yacc.c:1646 */
++#line 918 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type == EXPRESSION_TYPE_STRING)
+ {
+@@ -2470,11 +2474,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2474 "grammar.c" /* yacc.c:1646 */
++#line 2478 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 55:
+-#line 936 "grammar.y" /* yacc.c:1646 */
++#line 940 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 1, NULL, NULL);
+@@ -2483,11 +2487,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2487 "grammar.c" /* yacc.c:1646 */
++#line 2491 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 56:
+-#line 945 "grammar.y" /* yacc.c:1646 */
++#line 949 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 0, NULL, NULL);
+@@ -2496,11 +2500,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2500 "grammar.c" /* yacc.c:1646 */
++#line 2504 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 57:
+-#line 954 "grammar.y" /* yacc.c:1646 */
++#line 958 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_STRING, "matches");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_REGEXP, "matches");
+@@ -2515,11 +2519,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2519 "grammar.c" /* yacc.c:1646 */
++#line 2523 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 58:
+-#line 969 "grammar.y" /* yacc.c:1646 */
++#line 973 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_STRING, "contains");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_STRING, "contains");
+@@ -2531,11 +2535,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2535 "grammar.c" /* yacc.c:1646 */
++#line 2539 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 59:
+-#line 981 "grammar.y" /* yacc.c:1646 */
++#line 985 "grammar.y" /* yacc.c:1646 */
+ {
+ int result = yr_parser_reduce_string_identifier(
+ yyscanner,
+@@ -2549,11 +2553,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2553 "grammar.c" /* yacc.c:1646 */
++#line 2557 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 60:
+-#line 995 "grammar.y" /* yacc.c:1646 */
++#line 999 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "at");
+
+@@ -2566,11 +2570,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2570 "grammar.c" /* yacc.c:1646 */
++#line 2574 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 61:
+-#line 1008 "grammar.y" /* yacc.c:1646 */
++#line 1012 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[-2].c_string), OP_FOUND_IN, UNDEFINED);
+@@ -2581,20 +2585,25 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2585 "grammar.c" /* yacc.c:1646 */
++#line 2589 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 62:
+-#line 1019 "grammar.y" /* yacc.c:1646 */
++#line 1023 "grammar.y" /* yacc.c:1646 */
+ {
+- compiler->loop_depth--;
+- compiler->loop_identifier[compiler->loop_depth] = NULL;
++ if (compiler->loop_depth > 0)
++ {
++ compiler->loop_depth--;
++ compiler->loop_identifier[compiler->loop_depth] = NULL;
++ }
++
++ YYERROR;
+ }
+-#line 2594 "grammar.c" /* yacc.c:1646 */
++#line 2603 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 63:
+-#line 1024 "grammar.y" /* yacc.c:1646 */
++#line 1033 "grammar.y" /* yacc.c:1646 */
+ {
+ int var_index;
+
+@@ -2624,11 +2633,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 2628 "grammar.c" /* yacc.c:1646 */
++#line 2637 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 64:
+-#line 1054 "grammar.y" /* yacc.c:1646 */
++#line 1063 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
+ uint8_t* addr;
+@@ -2663,11 +2672,11 @@ yyreduce:
+ compiler->loop_identifier[compiler->loop_depth] = (yyvsp[-4].c_string);
+ compiler->loop_depth++;
+ }
+-#line 2667 "grammar.c" /* yacc.c:1646 */
++#line 2676 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 65:
+-#line 1089 "grammar.y" /* yacc.c:1646 */
++#line 1098 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset;
+
+@@ -2746,11 +2755,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2750 "grammar.c" /* yacc.c:1646 */
++#line 2759 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 66:
+-#line 1168 "grammar.y" /* yacc.c:1646 */
++#line 1177 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
+ uint8_t* addr;
+@@ -2780,11 +2789,11 @@ yyreduce:
+ compiler->loop_identifier[compiler->loop_depth] = NULL;
+ compiler->loop_depth++;
+ }
+-#line 2784 "grammar.c" /* yacc.c:1646 */
++#line 2793 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 67:
+-#line 1198 "grammar.y" /* yacc.c:1646 */
++#line 1207 "grammar.y" /* yacc.c:1646 */
+ {
+ int mem_offset;
+
+@@ -2833,31 +2842,31 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+
+ }
+-#line 2837 "grammar.c" /* yacc.c:1646 */
++#line 2846 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 68:
+-#line 1247 "grammar.y" /* yacc.c:1646 */
++#line 1256 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit(yyscanner, OP_OF, NULL);
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2847 "grammar.c" /* yacc.c:1646 */
++#line 2856 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 69:
+-#line 1253 "grammar.y" /* yacc.c:1646 */
++#line 1262 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit(yyscanner, OP_NOT, NULL);
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2857 "grammar.c" /* yacc.c:1646 */
++#line 2866 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 70:
+-#line 1259 "grammar.y" /* yacc.c:1646 */
++#line 1268 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ void* jmp_destination_addr;
+@@ -2883,11 +2892,11 @@ yyreduce:
+ fixup->next = compiler->fixup_stack_head;
+ compiler->fixup_stack_head = fixup;
+ }
+-#line 2887 "grammar.c" /* yacc.c:1646 */
++#line 2896 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 71:
+-#line 1285 "grammar.y" /* yacc.c:1646 */
++#line 1294 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ uint8_t* and_addr;
+@@ -2923,11 +2932,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2927 "grammar.c" /* yacc.c:1646 */
++#line 2936 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 72:
+-#line 1321 "grammar.y" /* yacc.c:1646 */
++#line 1330 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ void* jmp_destination_addr;
+@@ -2952,11 +2961,11 @@ yyreduce:
+ fixup->next = compiler->fixup_stack_head;
+ compiler->fixup_stack_head = fixup;
+ }
+-#line 2956 "grammar.c" /* yacc.c:1646 */
++#line 2965 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 73:
+-#line 1346 "grammar.y" /* yacc.c:1646 */
++#line 1355 "grammar.y" /* yacc.c:1646 */
+ {
+ YR_FIXUP* fixup;
+ uint8_t* or_addr;
+@@ -2992,11 +3001,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 2996 "grammar.c" /* yacc.c:1646 */
++#line 3005 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 74:
+-#line 1382 "grammar.y" /* yacc.c:1646 */
++#line 1391 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "<", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3005,11 +3014,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3009 "grammar.c" /* yacc.c:1646 */
++#line 3018 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 75:
+-#line 1391 "grammar.y" /* yacc.c:1646 */
++#line 1400 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, ">", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3018,11 +3027,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3022 "grammar.c" /* yacc.c:1646 */
++#line 3031 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 76:
+-#line 1400 "grammar.y" /* yacc.c:1646 */
++#line 1409 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "<=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3031,11 +3040,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3035 "grammar.c" /* yacc.c:1646 */
++#line 3044 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 77:
+-#line 1409 "grammar.y" /* yacc.c:1646 */
++#line 1418 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, ">=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3044,11 +3053,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3048 "grammar.c" /* yacc.c:1646 */
++#line 3057 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 78:
+-#line 1418 "grammar.y" /* yacc.c:1646 */
++#line 1427 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "==", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3057,11 +3066,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3061 "grammar.c" /* yacc.c:1646 */
++#line 3070 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 79:
+-#line 1427 "grammar.y" /* yacc.c:1646 */
++#line 1436 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "!=", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3070,39 +3079,39 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
+ }
+-#line 3074 "grammar.c" /* yacc.c:1646 */
++#line 3083 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 80:
+-#line 1436 "grammar.y" /* yacc.c:1646 */
++#line 1445 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[0].expression);
+ }
+-#line 3082 "grammar.c" /* yacc.c:1646 */
++#line 3091 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 81:
+-#line 1440 "grammar.y" /* yacc.c:1646 */
++#line 1449 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[-1].expression);
+ }
+-#line 3090 "grammar.c" /* yacc.c:1646 */
++#line 3099 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 82:
+-#line 1447 "grammar.y" /* yacc.c:1646 */
++#line 1456 "grammar.y" /* yacc.c:1646 */
+ { (yyval.integer) = INTEGER_SET_ENUMERATION; }
+-#line 3096 "grammar.c" /* yacc.c:1646 */
++#line 3105 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 83:
+-#line 1448 "grammar.y" /* yacc.c:1646 */
++#line 1457 "grammar.y" /* yacc.c:1646 */
+ { (yyval.integer) = INTEGER_SET_RANGE; }
+-#line 3102 "grammar.c" /* yacc.c:1646 */
++#line 3111 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 84:
+-#line 1454 "grammar.y" /* yacc.c:1646 */
++#line 1463 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[-3].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3120,11 +3129,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3124 "grammar.c" /* yacc.c:1646 */
++#line 3133 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 85:
+-#line 1476 "grammar.y" /* yacc.c:1646 */
++#line 1485 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3136,11 +3145,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3140 "grammar.c" /* yacc.c:1646 */
++#line 3149 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 86:
+-#line 1488 "grammar.y" /* yacc.c:1646 */
++#line 1497 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
+ {
+@@ -3151,77 +3160,77 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3155 "grammar.c" /* yacc.c:1646 */
++#line 3164 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 87:
+-#line 1503 "grammar.y" /* yacc.c:1646 */
++#line 1512 "grammar.y" /* yacc.c:1646 */
+ {
+ // Push end-of-list marker
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ }
+-#line 3164 "grammar.c" /* yacc.c:1646 */
++#line 3173 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 89:
+-#line 1509 "grammar.y" /* yacc.c:1646 */
++#line 1518 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ yr_parser_emit_pushes_for_strings(yyscanner, "$*");
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3175 "grammar.c" /* yacc.c:1646 */
++#line 3184 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 92:
+-#line 1526 "grammar.y" /* yacc.c:1646 */
++#line 1535 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
+ yr_free((yyvsp[0].c_string));
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3186 "grammar.c" /* yacc.c:1646 */
++#line 3195 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 93:
+-#line 1533 "grammar.y" /* yacc.c:1646 */
++#line 1542 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
+ yr_free((yyvsp[0].c_string));
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3197 "grammar.c" /* yacc.c:1646 */
++#line 3206 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 95:
+-#line 1545 "grammar.y" /* yacc.c:1646 */
++#line 1554 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
+ }
+-#line 3205 "grammar.c" /* yacc.c:1646 */
++#line 3214 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 96:
+-#line 1549 "grammar.y" /* yacc.c:1646 */
++#line 1558 "grammar.y" /* yacc.c:1646 */
+ {
+ yr_parser_emit_with_arg(yyscanner, OP_PUSH, 1, NULL, NULL);
+ }
+-#line 3213 "grammar.c" /* yacc.c:1646 */
++#line 3222 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 97:
+-#line 1557 "grammar.y" /* yacc.c:1646 */
++#line 1566 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[-1].expression);
+ }
+-#line 3221 "grammar.c" /* yacc.c:1646 */
++#line 3230 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 98:
+-#line 1561 "grammar.y" /* yacc.c:1646 */
++#line 1570 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit(
+ yyscanner, OP_FILESIZE, NULL);
+@@ -3231,11 +3240,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3235 "grammar.c" /* yacc.c:1646 */
++#line 3244 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 99:
+-#line 1571 "grammar.y" /* yacc.c:1646 */
++#line 1580 "grammar.y" /* yacc.c:1646 */
+ {
+ yywarning(yyscanner,
+ "Using deprecated \"entrypoint\" keyword. Use the \"entry_point\" "
+@@ -3249,11 +3258,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3253 "grammar.c" /* yacc.c:1646 */
++#line 3262 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 100:
+-#line 1585 "grammar.y" /* yacc.c:1646 */
++#line 1594 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-1].expression), EXPRESSION_TYPE_INTEGER, "intXXXX or uintXXXX");
+
+@@ -3269,11 +3278,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3273 "grammar.c" /* yacc.c:1646 */
++#line 3282 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 101:
+-#line 1601 "grammar.y" /* yacc.c:1646 */
++#line 1610 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, (yyvsp[0].integer), NULL, NULL);
+@@ -3283,11 +3292,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = (yyvsp[0].integer);
+ }
+-#line 3287 "grammar.c" /* yacc.c:1646 */
++#line 3296 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 102:
+-#line 1611 "grammar.y" /* yacc.c:1646 */
++#line 1620 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg_double(
+ yyscanner, OP_PUSH, (yyvsp[0].double_), NULL, NULL);
+@@ -3296,11 +3305,11 @@ yyreduce:
+
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+-#line 3300 "grammar.c" /* yacc.c:1646 */
++#line 3309 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 103:
+-#line 1620 "grammar.y" /* yacc.c:1646 */
++#line 1629 "grammar.y" /* yacc.c:1646 */
+ {
+ SIZED_STRING* sized_string;
+
+@@ -3325,11 +3334,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_STRING;
+ (yyval.expression).value.sized_string = sized_string;
+ }
+-#line 3329 "grammar.c" /* yacc.c:1646 */
++#line 3338 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 104:
+-#line 1645 "grammar.y" /* yacc.c:1646 */
++#line 1654 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[0].c_string), OP_COUNT, UNDEFINED);
+@@ -3341,11 +3350,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3345 "grammar.c" /* yacc.c:1646 */
++#line 3354 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 105:
+-#line 1657 "grammar.y" /* yacc.c:1646 */
++#line 1666 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[-3].c_string), OP_OFFSET, UNDEFINED);
+@@ -3357,11 +3366,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3361 "grammar.c" /* yacc.c:1646 */
++#line 3370 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 106:
+-#line 1669 "grammar.y" /* yacc.c:1646 */
++#line 1678 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 1, NULL, NULL);
+@@ -3377,11 +3386,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3381 "grammar.c" /* yacc.c:1646 */
++#line 3390 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 107:
+-#line 1685 "grammar.y" /* yacc.c:1646 */
++#line 1694 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_string_identifier(
+ yyscanner, (yyvsp[-3].c_string), OP_LENGTH, UNDEFINED);
+@@ -3393,11 +3402,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3397 "grammar.c" /* yacc.c:1646 */
++#line 3406 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 108:
+-#line 1697 "grammar.y" /* yacc.c:1646 */
++#line 1706 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_emit_with_arg(
+ yyscanner, OP_PUSH, 1, NULL, NULL);
+@@ -3413,11 +3422,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = UNDEFINED;
+ }
+-#line 3417 "grammar.c" /* yacc.c:1646 */
++#line 3426 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 109:
+-#line 1713 "grammar.y" /* yacc.c:1646 */
++#line 1722 "grammar.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].expression).type == EXPRESSION_TYPE_INTEGER) // loop identifier
+ {
+@@ -3462,11 +3471,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3466 "grammar.c" /* yacc.c:1646 */
++#line 3475 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 110:
+-#line 1758 "grammar.y" /* yacc.c:1646 */
++#line 1767 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER | EXPRESSION_TYPE_FLOAT, "-");
+
+@@ -3485,11 +3494,11 @@ yyreduce:
+
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+-#line 3489 "grammar.c" /* yacc.c:1646 */
++#line 3498 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 111:
+-#line 1777 "grammar.y" /* yacc.c:1646 */
++#line 1786 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "+", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3507,11 +3516,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3511 "grammar.c" /* yacc.c:1646 */
++#line 3520 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 112:
+-#line 1795 "grammar.y" /* yacc.c:1646 */
++#line 1804 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "-", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3529,11 +3538,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3533 "grammar.c" /* yacc.c:1646 */
++#line 3542 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 113:
+-#line 1813 "grammar.y" /* yacc.c:1646 */
++#line 1822 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "*", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3551,11 +3560,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3555 "grammar.c" /* yacc.c:1646 */
++#line 3564 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 114:
+-#line 1831 "grammar.y" /* yacc.c:1646 */
++#line 1840 "grammar.y" /* yacc.c:1646 */
+ {
+ compiler->last_result = yr_parser_reduce_operation(
+ yyscanner, "\\", (yyvsp[-2].expression), (yyvsp[0].expression));
+@@ -3581,11 +3590,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
+ }
+ }
+-#line 3585 "grammar.c" /* yacc.c:1646 */
++#line 3594 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 115:
+-#line 1857 "grammar.y" /* yacc.c:1646 */
++#line 1866 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "%");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "%");
+@@ -3603,11 +3612,11 @@ yyreduce:
+ ERROR_IF(compiler->last_result != ERROR_SUCCESS);
+ }
+ }
+-#line 3607 "grammar.c" /* yacc.c:1646 */
++#line 3616 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 116:
+-#line 1875 "grammar.y" /* yacc.c:1646 */
++#line 1884 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
+@@ -3617,11 +3626,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(^, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3621 "grammar.c" /* yacc.c:1646 */
++#line 3630 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 117:
+-#line 1885 "grammar.y" /* yacc.c:1646 */
++#line 1894 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
+@@ -3631,11 +3640,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(&, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3635 "grammar.c" /* yacc.c:1646 */
++#line 3644 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 118:
+-#line 1895 "grammar.y" /* yacc.c:1646 */
++#line 1904 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "|");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "|");
+@@ -3645,11 +3654,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(|, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3649 "grammar.c" /* yacc.c:1646 */
++#line 3658 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 119:
+-#line 1905 "grammar.y" /* yacc.c:1646 */
++#line 1914 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "~");
+
+@@ -3659,11 +3668,11 @@ yyreduce:
+ (yyval.expression).value.integer = ((yyvsp[0].expression).value.integer == UNDEFINED) ?
+ UNDEFINED : ~((yyvsp[0].expression).value.integer);
+ }
+-#line 3663 "grammar.c" /* yacc.c:1646 */
++#line 3672 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 120:
+-#line 1915 "grammar.y" /* yacc.c:1646 */
++#line 1924 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "<<");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "<<");
+@@ -3673,11 +3682,11 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(<<, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3677 "grammar.c" /* yacc.c:1646 */
++#line 3686 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 121:
+-#line 1925 "grammar.y" /* yacc.c:1646 */
++#line 1934 "grammar.y" /* yacc.c:1646 */
+ {
+ CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, ">>");
+ CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, ">>");
+@@ -3687,19 +3696,19 @@ yyreduce:
+ (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
+ (yyval.expression).value.integer = OPERATION(>>, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
+ }
+-#line 3691 "grammar.c" /* yacc.c:1646 */
++#line 3700 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 122:
+-#line 1935 "grammar.y" /* yacc.c:1646 */
++#line 1944 "grammar.y" /* yacc.c:1646 */
+ {
+ (yyval.expression) = (yyvsp[0].expression);
+ }
+-#line 3699 "grammar.c" /* yacc.c:1646 */
++#line 3708 "grammar.c" /* yacc.c:1646 */
+ break;
+
+
+-#line 3703 "grammar.c" /* yacc.c:1646 */
++#line 3712 "grammar.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+@@ -3927,5 +3936,5 @@ yyreturn:
+ #endif
+ return yyresult;
+ }
+-#line 1940 "grammar.y" /* yacc.c:1906 */
++#line 1949 "grammar.y" /* yacc.c:1906 */
+
+diff --git a/libyara/grammar.y b/libyara/grammar.y
+index addb55d..9cb4be7 100644
+--- a/libyara/grammar.y
++++ b/libyara/grammar.y
+@@ -824,6 +824,8 @@ arguments_list
+ case EXPRESSION_TYPE_REGEXP:
+ strlcpy($$, "r", MAX_FUNCTION_ARGS);
+ break;
++ default:
++ assert(FALSE);
+ }
+
+ ERROR_IF($$ == NULL);
+@@ -853,6 +855,8 @@ arguments_list
+ case EXPRESSION_TYPE_REGEXP:
+ strlcat($1, "r", MAX_FUNCTION_ARGS);
+ break;
++ default:
++ assert(FALSE);
+ }
+ }
+
+@@ -1022,6 +1026,8 @@ expression
+ compiler->loop_depth--;
+ compiler->loop_identifier[compiler->loop_depth] = NULL;
+ }
++
++ YYERROR;
+ }
+ | _FOR_ for_expression _IDENTIFIER_ _IN_
+ {
diff --git a/debian/patches/series b/debian/patches/series
index 89f7aff..5b94c67 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,7 @@
0001-Fixes-for-big-endian-architectures.patch
0002-Don-t-unmask-signals-when-setting-up-exception-handl.patch
0003-Exception-handler-Unix-Install-a-handler-for-SIGSEGV.patch
+0004-Fix-issue-576.patch
+0005-Fix-issue-575.patch
+0006-Make-sure-that-loop-depth-is-greater-than-0-before-d.patch
+0007-Fix-issue-597.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/forensics/yara.git
More information about the forensics-changes
mailing list