@@ -1528,7 +1528,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
1528
1528
#endif
1529
1529
1530
1530
/* Report failure */
1531
- #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return 0 ; } while (0)
1531
+ #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return -1 ; } while (0)
1532
1532
1533
1533
/* Extract opcode, argument, or skip count from code array */
1534
1534
#define GET_OP \
@@ -1552,7 +1552,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
1552
1552
skip = *code; \
1553
1553
VTRACE(("%lu (skip to %p)\n", \
1554
1554
(unsigned long)skip, code+skip)); \
1555
- if (skip-adj > (uintptr_t)(end - code)) \
1555
+ if (skip-adj > (uintptr_t)(end - code)) \
1556
1556
FAIL; \
1557
1557
code++; \
1558
1558
} while (0)
@@ -1641,9 +1641,10 @@ _validate_charset(SRE_CODE *code, SRE_CODE *end)
1641
1641
}
1642
1642
}
1643
1643
1644
- return 1 ;
1644
+ return 0 ;
1645
1645
}
1646
1646
1647
+ /* Returns 0 on success, -1 on failure, and 1 if the last op is JUMP. */
1647
1648
static int
1648
1649
_validate_inner (SRE_CODE * code , SRE_CODE * end , Py_ssize_t groups )
1649
1650
{
@@ -1721,7 +1722,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1721
1722
case SRE_OP_IN_LOC_IGNORE :
1722
1723
GET_SKIP ;
1723
1724
/* Stop 1 before the end; we check the FAILURE below */
1724
- if (! _validate_charset (code , code + skip - 2 ))
1725
+ if (_validate_charset (code , code + skip - 2 ))
1725
1726
FAIL ;
1726
1727
if (code [skip - 2 ] != SRE_OP_FAILURE )
1727
1728
FAIL ;
@@ -1775,7 +1776,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1775
1776
}
1776
1777
/* Validate the charset */
1777
1778
if (flags & SRE_INFO_CHARSET ) {
1778
- if (! _validate_charset (code , newcode - 1 ))
1779
+ if (_validate_charset (code , newcode - 1 ))
1779
1780
FAIL ;
1780
1781
if (newcode [-1 ] != SRE_OP_FAILURE )
1781
1782
FAIL ;
@@ -1796,7 +1797,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1796
1797
if (skip == 0 )
1797
1798
break ;
1798
1799
/* Stop 2 before the end; we check the JUMP below */
1799
- if (! _validate_inner (code , code + skip - 3 , groups ))
1800
+ if (_validate_inner (code , code + skip - 3 , groups ))
1800
1801
FAIL ;
1801
1802
code += skip - 3 ;
1802
1803
/* Check that it ends with a JUMP, and that each JUMP
@@ -1810,6 +1811,8 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1810
1811
else if (code + skip - 1 != target )
1811
1812
FAIL ;
1812
1813
}
1814
+ if (code != target )
1815
+ FAIL ;
1813
1816
}
1814
1817
break ;
1815
1818
@@ -1825,7 +1828,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1825
1828
FAIL ;
1826
1829
if (max > SRE_MAXREPEAT )
1827
1830
FAIL ;
1828
- if (! _validate_inner (code , code + skip - 4 , groups ))
1831
+ if (_validate_inner (code , code + skip - 4 , groups ))
1829
1832
FAIL ;
1830
1833
code += skip - 4 ;
1831
1834
GET_OP ;
@@ -1845,7 +1848,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1845
1848
FAIL ;
1846
1849
if (max > SRE_MAXREPEAT )
1847
1850
FAIL ;
1848
- if (! _validate_inner (code , code + skip - 3 , groups ))
1851
+ if (_validate_inner (code , code + skip - 3 , groups ))
1849
1852
FAIL ;
1850
1853
code += skip - 3 ;
1851
1854
GET_OP ;
@@ -1863,7 +1866,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1863
1866
case SRE_OP_ATOMIC_GROUP :
1864
1867
{
1865
1868
GET_SKIP ;
1866
- if (! _validate_inner (code , code + skip - 2 , groups ))
1869
+ if (_validate_inner (code , code + skip - 2 , groups ))
1867
1870
FAIL ;
1868
1871
code += skip - 2 ;
1869
1872
GET_OP ;
@@ -1915,24 +1918,17 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1915
1918
to allow arbitrary jumps anywhere in the code; so we just look
1916
1919
for a JUMP opcode preceding our skip target.
1917
1920
*/
1918
- if (skip >= 3 && skip - 3 < (uintptr_t )(end - code ) &&
1919
- code [skip - 3 ] == SRE_OP_JUMP )
1920
- {
1921
- VTRACE (("both then and else parts present\n" ));
1922
- if (!_validate_inner (code + 1 , code + skip - 3 , groups ))
1923
- FAIL ;
1921
+ VTRACE (("then part:\n" ));
1922
+ int rc = _validate_inner (code + 1 , code + skip - 1 , groups );
1923
+ if (rc == 1 ) {
1924
+ VTRACE (("else part:\n" ));
1924
1925
code += skip - 2 ; /* Position after JUMP, at <skipno> */
1925
1926
GET_SKIP ;
1926
- if (!_validate_inner (code , code + skip - 1 , groups ))
1927
- FAIL ;
1928
- code += skip - 1 ;
1929
- }
1930
- else {
1931
- VTRACE (("only a then part present\n" ));
1932
- if (!_validate_inner (code + 1 , code + skip - 1 , groups ))
1933
- FAIL ;
1934
- code += skip - 1 ;
1927
+ rc = _validate_inner (code , code + skip - 1 , groups );
1935
1928
}
1929
+ if (rc )
1930
+ FAIL ;
1931
+ code += skip - 1 ;
1936
1932
break ;
1937
1933
1938
1934
case SRE_OP_ASSERT :
@@ -1943,22 +1939,28 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1943
1939
if (arg & 0x80000000 )
1944
1940
FAIL ; /* Width too large */
1945
1941
/* Stop 1 before the end; we check the SUCCESS below */
1946
- if (! _validate_inner (code + 1 , code + skip - 2 , groups ))
1942
+ if (_validate_inner (code + 1 , code + skip - 2 , groups ))
1947
1943
FAIL ;
1948
1944
code += skip - 2 ;
1949
1945
GET_OP ;
1950
1946
if (op != SRE_OP_SUCCESS )
1951
1947
FAIL ;
1952
1948
break ;
1953
1949
1950
+ case SRE_OP_JUMP :
1951
+ if (code + 1 != end )
1952
+ FAIL ;
1953
+ VTRACE (("JUMP: %d\n" , __LINE__ ));
1954
+ return 1 ;
1955
+
1954
1956
default :
1955
1957
FAIL ;
1956
1958
1957
1959
}
1958
1960
}
1959
1961
1960
1962
VTRACE (("okay\n" ));
1961
- return 1 ;
1963
+ return 0 ;
1962
1964
}
1963
1965
1964
1966
static int
@@ -1973,7 +1975,7 @@ _validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1973
1975
static int
1974
1976
_validate (PatternObject * self )
1975
1977
{
1976
- if (! _validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
1978
+ if (_validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
1977
1979
{
1978
1980
PyErr_SetString (PyExc_RuntimeError , "invalid SRE code" );
1979
1981
return 0 ;
0 commit comments