@@ -1519,7 +1519,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
1519
1519
#endif
1520
1520
1521
1521
/* Report failure */
1522
- #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return 0 ; } while (0)
1522
+ #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return -1 ; } while (0)
1523
1523
1524
1524
/* Extract opcode, argument, or skip count from code array */
1525
1525
#define GET_OP \
@@ -1543,7 +1543,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
1543
1543
skip = *code; \
1544
1544
VTRACE(("%lu (skip to %p)\n", \
1545
1545
(unsigned long)skip, code+skip)); \
1546
- if (skip-adj > (uintptr_t)(end - code)) \
1546
+ if (skip-adj > (uintptr_t)(end - code)) \
1547
1547
FAIL; \
1548
1548
code++; \
1549
1549
} while (0)
@@ -1632,9 +1632,10 @@ _validate_charset(SRE_CODE *code, SRE_CODE *end)
1632
1632
}
1633
1633
}
1634
1634
1635
- return 1 ;
1635
+ return 0 ;
1636
1636
}
1637
1637
1638
+ /* Returns 0 on success, -1 on failure, and 1 if the last op is JUMP. */
1638
1639
static int
1639
1640
_validate_inner (SRE_CODE * code , SRE_CODE * end , Py_ssize_t groups )
1640
1641
{
@@ -1712,7 +1713,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1712
1713
case SRE_OP_IN_LOC_IGNORE :
1713
1714
GET_SKIP ;
1714
1715
/* Stop 1 before the end; we check the FAILURE below */
1715
- if (! _validate_charset (code , code + skip - 2 ))
1716
+ if (_validate_charset (code , code + skip - 2 ))
1716
1717
FAIL ;
1717
1718
if (code [skip - 2 ] != SRE_OP_FAILURE )
1718
1719
FAIL ;
@@ -1766,7 +1767,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1766
1767
}
1767
1768
/* Validate the charset */
1768
1769
if (flags & SRE_INFO_CHARSET ) {
1769
- if (! _validate_charset (code , newcode - 1 ))
1770
+ if (_validate_charset (code , newcode - 1 ))
1770
1771
FAIL ;
1771
1772
if (newcode [-1 ] != SRE_OP_FAILURE )
1772
1773
FAIL ;
@@ -1787,7 +1788,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1787
1788
if (skip == 0 )
1788
1789
break ;
1789
1790
/* Stop 2 before the end; we check the JUMP below */
1790
- if (! _validate_inner (code , code + skip - 3 , groups ))
1791
+ if (_validate_inner (code , code + skip - 3 , groups ))
1791
1792
FAIL ;
1792
1793
code += skip - 3 ;
1793
1794
/* Check that it ends with a JUMP, and that each JUMP
@@ -1801,6 +1802,8 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1801
1802
else if (code + skip - 1 != target )
1802
1803
FAIL ;
1803
1804
}
1805
+ if (code != target )
1806
+ FAIL ;
1804
1807
}
1805
1808
break ;
1806
1809
@@ -1815,7 +1818,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1815
1818
FAIL ;
1816
1819
if (max > SRE_MAXREPEAT )
1817
1820
FAIL ;
1818
- if (! _validate_inner (code , code + skip - 4 , groups ))
1821
+ if (_validate_inner (code , code + skip - 4 , groups ))
1819
1822
FAIL ;
1820
1823
code += skip - 4 ;
1821
1824
GET_OP ;
@@ -1834,7 +1837,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1834
1837
FAIL ;
1835
1838
if (max > SRE_MAXREPEAT )
1836
1839
FAIL ;
1837
- if (! _validate_inner (code , code + skip - 3 , groups ))
1840
+ if (_validate_inner (code , code + skip - 3 , groups ))
1838
1841
FAIL ;
1839
1842
code += skip - 3 ;
1840
1843
GET_OP ;
@@ -1886,24 +1889,17 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1886
1889
to allow arbitrary jumps anywhere in the code; so we just look
1887
1890
for a JUMP opcode preceding our skip target.
1888
1891
*/
1889
- if (skip >= 3 && skip - 3 < (uintptr_t )(end - code ) &&
1890
- code [skip - 3 ] == SRE_OP_JUMP )
1891
- {
1892
- VTRACE (("both then and else parts present\n" ));
1893
- if (!_validate_inner (code + 1 , code + skip - 3 , groups ))
1894
- FAIL ;
1892
+ VTRACE (("then part:\n" ));
1893
+ int rc = _validate_inner (code + 1 , code + skip - 1 , groups );
1894
+ if (rc == 1 ) {
1895
+ VTRACE (("else part:\n" ));
1895
1896
code += skip - 2 ; /* Position after JUMP, at <skipno> */
1896
1897
GET_SKIP ;
1897
- if (!_validate_inner (code , code + skip - 1 , groups ))
1898
- FAIL ;
1899
- code += skip - 1 ;
1900
- }
1901
- else {
1902
- VTRACE (("only a then part present\n" ));
1903
- if (!_validate_inner (code + 1 , code + skip - 1 , groups ))
1904
- FAIL ;
1905
- code += skip - 1 ;
1898
+ rc = _validate_inner (code , code + skip - 1 , groups );
1906
1899
}
1900
+ if (rc )
1901
+ FAIL ;
1902
+ code += skip - 1 ;
1907
1903
break ;
1908
1904
1909
1905
case SRE_OP_ASSERT :
@@ -1914,22 +1910,28 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1914
1910
if (arg & 0x80000000 )
1915
1911
FAIL ; /* Width too large */
1916
1912
/* Stop 1 before the end; we check the SUCCESS below */
1917
- if (! _validate_inner (code + 1 , code + skip - 2 , groups ))
1913
+ if (_validate_inner (code + 1 , code + skip - 2 , groups ))
1918
1914
FAIL ;
1919
1915
code += skip - 2 ;
1920
1916
GET_OP ;
1921
1917
if (op != SRE_OP_SUCCESS )
1922
1918
FAIL ;
1923
1919
break ;
1924
1920
1921
+ case SRE_OP_JUMP :
1922
+ if (code + 1 != end )
1923
+ FAIL ;
1924
+ VTRACE (("JUMP: %d\n" , __LINE__ ));
1925
+ return 1 ;
1926
+
1925
1927
default :
1926
1928
FAIL ;
1927
1929
1928
1930
}
1929
1931
}
1930
1932
1931
1933
VTRACE (("okay\n" ));
1932
- return 1 ;
1934
+ return 0 ;
1933
1935
}
1934
1936
1935
1937
static int
@@ -1944,7 +1946,7 @@ _validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1944
1946
static int
1945
1947
_validate (PatternObject * self )
1946
1948
{
1947
- if (! _validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
1949
+ if (_validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
1948
1950
{
1949
1951
PyErr_SetString (PyExc_RuntimeError , "invalid SRE code" );
1950
1952
return 0 ;
0 commit comments