@@ -1623,7 +1623,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
1623
1623
#endif
1624
1624
1625
1625
/* Report failure */
1626
- #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return 0 ; } while (0)
1626
+ #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return -1 ; } while (0)
1627
1627
1628
1628
/* Extract opcode, argument, or skip count from code array */
1629
1629
#define GET_OP \
@@ -1647,7 +1647,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
1647
1647
skip = *code; \
1648
1648
VTRACE(("%lu (skip to %p)\n", \
1649
1649
(unsigned long)skip, code+skip)); \
1650
- if (skip-adj > (uintptr_t)(end - code)) \
1650
+ if (skip-adj > (uintptr_t)(end - code)) \
1651
1651
FAIL; \
1652
1652
code++; \
1653
1653
} while (0)
@@ -1736,9 +1736,10 @@ _validate_charset(SRE_CODE *code, SRE_CODE *end)
1736
1736
}
1737
1737
}
1738
1738
1739
- return 1 ;
1739
+ return 0 ;
1740
1740
}
1741
1741
1742
+ /* Returns 0 on success, -1 on failure, and 1 if the last op is JUMP. */
1742
1743
static int
1743
1744
_validate_inner (SRE_CODE * code , SRE_CODE * end , Py_ssize_t groups )
1744
1745
{
@@ -1816,7 +1817,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1816
1817
case SRE_OP_IN_LOC_IGNORE :
1817
1818
GET_SKIP ;
1818
1819
/* Stop 1 before the end; we check the FAILURE below */
1819
- if (! _validate_charset (code , code + skip - 2 ))
1820
+ if (_validate_charset (code , code + skip - 2 ))
1820
1821
FAIL ;
1821
1822
if (code [skip - 2 ] != SRE_OP_FAILURE )
1822
1823
FAIL ;
@@ -1870,7 +1871,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1870
1871
}
1871
1872
/* Validate the charset */
1872
1873
if (flags & SRE_INFO_CHARSET ) {
1873
- if (! _validate_charset (code , newcode - 1 ))
1874
+ if (_validate_charset (code , newcode - 1 ))
1874
1875
FAIL ;
1875
1876
if (newcode [-1 ] != SRE_OP_FAILURE )
1876
1877
FAIL ;
@@ -1891,7 +1892,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1891
1892
if (skip == 0 )
1892
1893
break ;
1893
1894
/* Stop 2 before the end; we check the JUMP below */
1894
- if (! _validate_inner (code , code + skip - 3 , groups ))
1895
+ if (_validate_inner (code , code + skip - 3 , groups ))
1895
1896
FAIL ;
1896
1897
code += skip - 3 ;
1897
1898
/* Check that it ends with a JUMP, and that each JUMP
@@ -1905,6 +1906,8 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1905
1906
else if (code + skip - 1 != target )
1906
1907
FAIL ;
1907
1908
}
1909
+ if (code != target )
1910
+ FAIL ;
1908
1911
}
1909
1912
break ;
1910
1913
@@ -1920,7 +1923,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1920
1923
FAIL ;
1921
1924
if (max > SRE_MAXREPEAT )
1922
1925
FAIL ;
1923
- if (! _validate_inner (code , code + skip - 4 , groups ))
1926
+ if (_validate_inner (code , code + skip - 4 , groups ))
1924
1927
FAIL ;
1925
1928
code += skip - 4 ;
1926
1929
GET_OP ;
@@ -1940,7 +1943,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1940
1943
FAIL ;
1941
1944
if (max > SRE_MAXREPEAT )
1942
1945
FAIL ;
1943
- if (! _validate_inner (code , code + skip - 3 , groups ))
1946
+ if (_validate_inner (code , code + skip - 3 , groups ))
1944
1947
FAIL ;
1945
1948
code += skip - 3 ;
1946
1949
GET_OP ;
@@ -1958,7 +1961,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
1958
1961
case SRE_OP_ATOMIC_GROUP :
1959
1962
{
1960
1963
GET_SKIP ;
1961
- if (! _validate_inner (code , code + skip - 2 , groups ))
1964
+ if (_validate_inner (code , code + skip - 2 , groups ))
1962
1965
FAIL ;
1963
1966
code += skip - 2 ;
1964
1967
GET_OP ;
@@ -2010,24 +2013,17 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
2010
2013
to allow arbitrary jumps anywhere in the code; so we just look
2011
2014
for a JUMP opcode preceding our skip target.
2012
2015
*/
2013
- if (skip >= 3 && skip - 3 < (uintptr_t )(end - code ) &&
2014
- code [skip - 3 ] == SRE_OP_JUMP )
2015
- {
2016
- VTRACE (("both then and else parts present\n" ));
2017
- if (!_validate_inner (code + 1 , code + skip - 3 , groups ))
2018
- FAIL ;
2016
+ VTRACE (("then part:\n" ));
2017
+ int rc = _validate_inner (code + 1 , code + skip - 1 , groups );
2018
+ if (rc == 1 ) {
2019
+ VTRACE (("else part:\n" ));
2019
2020
code += skip - 2 ; /* Position after JUMP, at <skipno> */
2020
2021
GET_SKIP ;
2021
- if (!_validate_inner (code , code + skip - 1 , groups ))
2022
- FAIL ;
2023
- code += skip - 1 ;
2024
- }
2025
- else {
2026
- VTRACE (("only a then part present\n" ));
2027
- if (!_validate_inner (code + 1 , code + skip - 1 , groups ))
2028
- FAIL ;
2029
- code += skip - 1 ;
2022
+ rc = _validate_inner (code , code + skip - 1 , groups );
2030
2023
}
2024
+ if (rc )
2025
+ FAIL ;
2026
+ code += skip - 1 ;
2031
2027
break ;
2032
2028
2033
2029
case SRE_OP_ASSERT :
@@ -2038,22 +2034,28 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
2038
2034
if (arg & 0x80000000 )
2039
2035
FAIL ; /* Width too large */
2040
2036
/* Stop 1 before the end; we check the SUCCESS below */
2041
- if (! _validate_inner (code + 1 , code + skip - 2 , groups ))
2037
+ if (_validate_inner (code + 1 , code + skip - 2 , groups ))
2042
2038
FAIL ;
2043
2039
code += skip - 2 ;
2044
2040
GET_OP ;
2045
2041
if (op != SRE_OP_SUCCESS )
2046
2042
FAIL ;
2047
2043
break ;
2048
2044
2045
+ case SRE_OP_JUMP :
2046
+ if (code + 1 != end )
2047
+ FAIL ;
2048
+ VTRACE (("JUMP: %d\n" , __LINE__ ));
2049
+ return 1 ;
2050
+
2049
2051
default :
2050
2052
FAIL ;
2051
2053
2052
2054
}
2053
2055
}
2054
2056
2055
2057
VTRACE (("okay\n" ));
2056
- return 1 ;
2058
+ return 0 ;
2057
2059
}
2058
2060
2059
2061
static int
@@ -2068,7 +2070,7 @@ _validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
2068
2070
static int
2069
2071
_validate (PatternObject * self )
2070
2072
{
2071
- if (! _validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
2073
+ if (_validate_outer (self -> code , self -> code + self -> codesize , self -> groups ))
2072
2074
{
2073
2075
PyErr_SetString (PyExc_RuntimeError , "invalid SRE code" );
2074
2076
return 0 ;
0 commit comments